diff --git a/src/main/java/com/avaje/ebean/config/ServerConfig.java b/src/main/java/com/avaje/ebean/config/ServerConfig.java index 50bee71ab..c3053c3b0 100644 --- a/src/main/java/com/avaje/ebean/config/ServerConfig.java +++ b/src/main/java/com/avaje/ebean/config/ServerConfig.java @@ -204,6 +204,12 @@ public class ServerConfig { * Default behaviour for updates when cascade save on a O2M or M2M to delete any missing children. */ private boolean updatesDeleteMissingChildren = true; + + /** + * Setting to indicate if UUID should be stored as binary(16) or varchar(40). + */ + private boolean uuidStoreAsBinary; + private List persistControllers = new ArrayList(); private List> persistListeners = new ArrayList>(); @@ -796,6 +802,21 @@ public class ServerConfig { this.dbEncrypt = dbEncrypt; } + + /** + * Return true if UUID should be stored as binary(16) (as opposed to varchar(40)). + */ + public boolean isUuidStoreAsBinary() { + return uuidStoreAsBinary; + } + + /** + * Set to true if UUID should be stored as binary(16) (as opposed to varchar(40)). + */ + public void setUuidStoreAsBinary(boolean uuidStoreAsBinary) { + this.uuidStoreAsBinary = uuidStoreAsBinary; + } + /** * Set to true to run the DDL generation on startup. */ @@ -1282,7 +1303,7 @@ public class ServerConfig { collectQueryStatsByNode = p.getBoolean("collectQueryStatsByNode", true); collectQueryOrigins = p.getBoolean("collectQueryOrigins", true); - + updateChangesOnly = p.getBoolean("updateChangesOnly", true); boolean defaultDeleteMissingChildren = p.getBoolean("defaultDeleteMissingChildren", true); @@ -1299,6 +1320,7 @@ public class ServerConfig { databaseBooleanTrue = p.get("databaseBooleanTrue", null); databaseBooleanFalse = p.get("databaseBooleanFalse", null); databasePlatformName = p.get("databasePlatformName", null); + uuidStoreAsBinary = p.getBoolean("uuidStoreAsBinary", false); lazyLoadBatchSize = p.getInt("lazyLoadBatchSize", 1); queryBatchSize = p.getInt("queryBatchSize", DEFAULT_QUERY_BATCH_SIZE); diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/BasicTypeConverter.java b/src/main/java/com/avaje/ebeaninternal/server/core/BasicTypeConverter.java index 761291f26..7f0f6ec76 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/BasicTypeConverter.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/BasicTypeConverter.java @@ -8,6 +8,7 @@ import java.sql.Types; import java.util.Calendar; import java.util.UUID; +import com.avaje.ebeaninternal.server.type.ScalarTypeUUIDBinary; /** * Default implementation of TypeConverter. @@ -192,6 +193,9 @@ public final class BasicTypeConverter implements Serializable { if (value instanceof String) { return UUID.fromString((String) value); } + if (value instanceof byte[]) { + return ScalarTypeUUIDBinary.convertFromBytes((byte[])value); + } return (UUID) value; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/DefaultTypeManager.java b/src/main/java/com/avaje/ebeaninternal/server/type/DefaultTypeManager.java index 81b4351d0..cdab98b37 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/DefaultTypeManager.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/DefaultTypeManager.java @@ -102,7 +102,6 @@ public final class DefaultTypeManager implements TypeManager, KnownImmutable { private final ScalarType timestampType = new ScalarTypeTimestamp(); - private final ScalarType uuidType = new ScalarTypeUUID(); private final ScalarType urlType = new ScalarTypeURL(); private final ScalarType uriType = new ScalarTypeURI(); private final ScalarType localeType = new ScalarTypeLocale(); @@ -140,7 +139,7 @@ public final class DefaultTypeManager implements TypeManager, KnownImmutable { this.extraTypeFactory = new DefaultTypeFactory(config); - initialiseStandard(clobType, blobType); + initialiseStandard(clobType, blobType, config.isUuidStoreAsBinary()); initialiseJodaTypes(); if (bootupClasses != null) { @@ -613,7 +612,7 @@ public final class DefaultTypeManager implements TypeManager, KnownImmutable { * Register all the standard types supported. This is the standard JDBC types * plus some other common types such as java.util.Date and java.util.Calendar. */ - protected void initialiseStandard(int platformClobType, int platformBlobType) { + protected void initialiseStandard(int platformClobType, int platformBlobType, boolean binaryUUID) { ScalarType utilDateType = extraTypeFactory.createUtilDate(); typeMap.put(java.util.Date.class, utilDateType); @@ -637,13 +636,13 @@ public final class DefaultTypeManager implements TypeManager, KnownImmutable { // boolean mapping to Types.Integer, Types.VARCHAR or Types.Boolean } -// ScalarTypeScalaDouble scalaDoubleType = new ScalarTypeScalaDouble(); -// typeMap.put(scala.Double.class, scalaDoubleType); + // Store UUID as binary(16) or varchar(40) + ScalarType uuidType = (binaryUUID) ? new ScalarTypeUUIDBinary() : new ScalarTypeUUIDVarchar(); + typeMap.put(UUID.class, uuidType); typeMap.put(Locale.class, localeType); typeMap.put(Currency.class, currencyType); typeMap.put(TimeZone.class, timeZoneType); - typeMap.put(UUID.class, uuidType); typeMap.put(URL.class, urlType); typeMap.put(URI.class, uriType); diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeUUID.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeUUID.java deleted file mode 100644 index b5c54792d..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeUUID.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.avaje.ebeaninternal.server.type; - -import java.util.UUID; - -import com.avaje.ebeaninternal.server.core.BasicTypeConverter; - -/** - * ScalarType for java.util.UUID which converts to and from a VARCHAR database column. - */ -public class ScalarTypeUUID extends ScalarTypeBaseVarchar { - - public ScalarTypeUUID() { - super(UUID.class); - } - - @Override - public int getLength() { - return 40; - } - - @Override - public UUID convertFromDbString(String dbValue) { - return UUID.fromString(dbValue); - } - - @Override - public String convertToDbString(UUID beanValue) { - return formatValue(beanValue); - } - - public UUID toBeanType(Object value) { - return BasicTypeConverter.toUUID(value); - } - - public Object toJdbcType(Object value) { - return BasicTypeConverter.convert(value, jdbcType); - } - - public String formatValue(UUID v) { - return v.toString(); - } - - public UUID parse(String value) { - return UUID.fromString(value); - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeUUIDVarchar.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeUUIDVarchar.java new file mode 100644 index 000000000..3da6f0dec --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeUUIDVarchar.java @@ -0,0 +1,47 @@ +package com.avaje.ebeaninternal.server.type; + +import java.util.UUID; + +import com.avaje.ebeaninternal.server.core.BasicTypeConverter; + +/** + * ScalarType for java.util.UUID which converts to and from a VARCHAR database column. + */ +public class ScalarTypeUUIDVarchar extends ScalarTypeBaseVarchar { + + public ScalarTypeUUIDVarchar() { + super(UUID.class); + } + + @Override + public int getLength() { + return 40; + } + + @Override + public UUID convertFromDbString(String dbValue) { + return UUID.fromString(dbValue); + } + + @Override + public String convertToDbString(UUID beanValue) { + return formatValue(beanValue); + } + + public UUID toBeanType(Object value) { + return BasicTypeConverter.toUUID(value); + } + + public Object toJdbcType(Object value) { + return BasicTypeConverter.convert(value, jdbcType); + } + + public String formatValue(UUID v) { + return v.toString(); + } + + public UUID parse(String value) { + return UUID.fromString(value); + } + +} diff --git a/src/test/resources/ebean.properties b/src/test/resources/ebean.properties index 0f731e463..349865a93 100644 --- a/src/test/resources/ebean.properties +++ b/src/test/resources/ebean.properties @@ -39,21 +39,9 @@ ebean.debug.sql=true ##ebean.debug.remotetransaction=true #ebean.cluster.debuglevel=1 -## ------------------------------------------------------------- -## Transaction Logging -## ------------------------------------------------------------- - -## Use java util logging to log transaction details -#ebean.loggingToJavaLogger=true - -## General logging level: (none, summary, sql) -ebean.logging.level=sql - -## location of transaction logs -ebean.logging.directory=logs -#ebean.logging.directory=${catalina.base}/logs/trans +ebean.uuidStoreAsBinary=true ebean.cacheWarmingDelay=-1 ##ebean.transaction.rollbackOnChecked=false