diff --git a/src/main/java/com/avaje/ebean/config/ServerConfig.java b/src/main/java/com/avaje/ebean/config/ServerConfig.java index a376aee37..f1c12a2e7 100644 --- a/src/main/java/com/avaje/ebean/config/ServerConfig.java +++ b/src/main/java/com/avaje/ebean/config/ServerConfig.java @@ -224,6 +224,11 @@ public class ServerConfig { private boolean eagerFetchLobs; + /** + * Timezone used to get/set Timestamp values via JDBC. + */ + private String dataTimeZone; + private boolean ddlGenerate; private boolean ddlRun; @@ -841,6 +846,23 @@ public class ServerConfig { this.migrationConfig = migrationConfig; } + /** + * Return the time zone to use when reading/writing Timestamps via JDBC. + *
+ * When set a Calendar object is used in JDBC calls when reading/writing Timestamp objects. + *
+ */ + public String getDataTimeZone() { + return System.getProperty("ebean.dataTimeZone", dataTimeZone); + } + + /** + * Set the time zone to use when reading/writing Timestamps via JDBC. + */ + public void setDataTimeZone(String dataTimeZone) { + this.dataTimeZone = dataTimeZone; + } + /** * Return the suffix appended to the base table to derive the view that contains the union * of the base table and the history table in order to support asOf queries. @@ -2369,6 +2391,7 @@ public class ServerConfig { changeLogIncludeInserts = p.getBoolean("changeLogIncludeInserts", changeLogIncludeInserts); expressionEqualsWithNullAsNoop = p.getBoolean("expressionEqualsWithNullAsNoop", expressionEqualsWithNullAsNoop); + dataTimeZone = p.get("dataTimeZone", dataTimeZone); asOfViewSuffix = p.get("asOfViewSuffix", asOfViewSuffix); asOfSysPeriod = p.get("asOfSysPeriod", asOfSysPeriod); historyTableSuffix = p.get("historyTableSuffix", historyTableSuffix); diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanServer.java b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanServer.java index a01e2e5bd..42b56053c 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanServer.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanServer.java @@ -16,6 +16,7 @@ import com.avaje.ebean.event.readaudit.ReadAuditPrepare; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; import com.avaje.ebeaninternal.server.query.CQuery; import com.avaje.ebeaninternal.server.transaction.RemoteTransactionEvent; +import com.avaje.ebeaninternal.server.core.timezone.DataTimeZone; import java.util.List; @@ -187,4 +188,9 @@ public interface SpiEbeanServer extends EbeanServer, BeanLoader, BeanCollectionL * user context information (user id, user ip address etc). */ ReadAuditPrepare getReadAuditPrepare(); + + /** + * Return the DataTimeZone to use when reading/writing timestamps via JDBC. + */ + DataTimeZone getDataTimeZone(); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/BeanRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/BeanRequest.java index 028f521d6..b5907bfe4 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/BeanRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/BeanRequest.java @@ -3,6 +3,7 @@ package com.avaje.ebeaninternal.server.core; import com.avaje.ebean.EbeanServer; import com.avaje.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.api.SpiTransaction; +import com.avaje.ebeaninternal.server.core.timezone.DataTimeZone; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,35 +13,35 @@ import org.slf4j.LoggerFactory; public abstract class BeanRequest { private static final Logger log = LoggerFactory.getLogger(BeanRequest.class); - - /** - * The server processing the request. - */ - protected final SpiEbeanServer ebeanServer; - /** - * The transaction this is part of. - */ - protected SpiTransaction transaction; + /** + * The server processing the request. + */ + protected final SpiEbeanServer ebeanServer; - protected boolean createdTransaction; + /** + * The transaction this is part of. + */ + protected SpiTransaction transaction; - public BeanRequest(SpiEbeanServer ebeanServer, SpiTransaction t) { - this.ebeanServer = ebeanServer; - this.transaction = t; - } + protected boolean createdTransaction; - /** - * A helper method for creating an implicit transaction is it is required. - *- * A transaction may have been passed in or active in the thread local. If - * not then create one implicitly to handle the request. - *
+ public BeanRequest(SpiEbeanServer ebeanServer, SpiTransaction t) { + this.ebeanServer = ebeanServer; + this.transaction = t; + } + + /** + * A helper method for creating an implicit transaction is it is required. + *+ * A transaction may have been passed in or active in the thread local. If + * not then create one implicitly to handle the request. + *
* * @return True if a transaction was set (from current or created). - */ - public boolean createImplicitTransIfRequired() { - if (transaction != null) { + */ + public boolean createImplicitTransIfRequired() { + if (transaction != null) { return false; } transaction = ebeanServer.getCurrentServerTransaction(); @@ -50,7 +51,7 @@ public abstract class BeanRequest { createdTransaction = true; } return true; - } + } /** * Commit this transaction if it was created for this request. @@ -61,40 +62,40 @@ public abstract class BeanRequest { } } - /** - * Rollback the transaction if it was created for this request. - */ - public void rollbackTransIfRequired() { - if (createdTransaction) { - try { - transaction.rollback(); - } catch (Exception e) { - // Just log this and carry on. A previous exception has been - // thrown and if this rollback throws exception it likely means - // that the connection is broken (and the datasource and db will cleanup) - log.error("Error trying to rollback a transaction (after a prior exception thrown)", e); - } - } - } + /** + * Rollback the transaction if it was created for this request. + */ + public void rollbackTransIfRequired() { + if (createdTransaction) { + try { + transaction.rollback(); + } catch (Exception e) { + // Just log this and carry on. A previous exception has been + // thrown and if this rollback throws exception it likely means + // that the connection is broken (and the datasource and db will cleanup) + log.error("Error trying to rollback a transaction (after a prior exception thrown)", e); + } + } + } - /** - * Return the server processing the request. Made available for - * BeanController and BeanFinder. - */ - public EbeanServer getEbeanServer() { - return ebeanServer; - } + /** + * Return the server processing the request. Made available for + * BeanController and BeanFinder. + */ + public EbeanServer getEbeanServer() { + return ebeanServer; + } public SpiEbeanServer getServer() { return ebeanServer; } - /** - * Return the Transaction associated with this request. - */ - public SpiTransaction getTransaction() { - return transaction; - } + /** + * Return the Transaction associated with this request. + */ + public SpiTransaction getTransaction() { + return transaction; + } /** * Return true if SQL should be logged for this transaction. @@ -109,4 +110,11 @@ public abstract class BeanRequest { public boolean isLogSummary() { return transaction.isLogSummary(); } + + /** + * Return the DataTimeZone to use. + */ + public DataTimeZone getDataTimeZone() { + return ebeanServer.getDataTimeZone(); + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index 1a10db6e9..a227e2c16 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -64,6 +64,7 @@ import com.avaje.ebeaninternal.server.transaction.DefaultPersistenceContext; import com.avaje.ebeaninternal.server.transaction.RemoteTransactionEvent; import com.avaje.ebeaninternal.server.transaction.TransactionManager; import com.avaje.ebeaninternal.server.transaction.TransactionScopeManager; +import com.avaje.ebeaninternal.server.core.timezone.DataTimeZone; import com.avaje.ebeaninternal.util.ParamTypeHelper; import com.avaje.ebeaninternal.util.ParamTypeHelper.TypeInfo; import com.avaje.ebeanservice.docstore.api.DocStoreIntegration; @@ -108,6 +109,8 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { private final TransactionScopeManager transactionScopeManager; + private final DataTimeZone dataTimeZone; + private final CallStackFactory callStackFactory = new DefaultCallStackFactory(); private final int maxCallStack; @@ -228,6 +231,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { this.beanLoader = new DefaultBeanLoader(this); this.jsonContext = config.createJsonContext(this); + this.dataTimeZone = config.getDataTimeZone(); DocStoreIntegration docStoreComponents = config.createDocStoreIntegration(this); this.transactionManager = config.createTransactionManager(docStoreComponents.updateProcessor()); @@ -284,7 +288,12 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { public DatabasePlatform getDatabasePlatform() { return databasePlatform; } - + + @Override + public DataTimeZone getDataTimeZone() { + return dataTimeZone; + } + @Override public MetaInfoManager getMetaInfoManager() { return metaInfoManager; diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java index 7a792ea43..373eba960 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java @@ -22,6 +22,9 @@ import com.avaje.ebeaninternal.server.changelog.DefaultChangeLogListener; import com.avaje.ebeaninternal.server.changelog.DefaultChangeLogPrepare; import com.avaje.ebeaninternal.server.changelog.DefaultChangeLogRegister; import com.avaje.ebeaninternal.server.cluster.ClusterManager; +import com.avaje.ebeaninternal.server.core.timezone.CloneDataTimeZone; +import com.avaje.ebeaninternal.server.core.timezone.NoDataTimeZone; +import com.avaje.ebeaninternal.server.core.timezone.SimpleDataTimeZone; import com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager; import com.avaje.ebeaninternal.server.deploy.DeployOrmXml; import com.avaje.ebeaninternal.server.deploy.generatedproperty.GeneratedPropertyFactory; @@ -29,6 +32,7 @@ import com.avaje.ebeaninternal.server.deploy.parse.DeployCreateProperties; import com.avaje.ebeaninternal.server.deploy.parse.DeployInherit; import com.avaje.ebeaninternal.server.deploy.parse.DeployUtil; import com.avaje.ebeaninternal.server.expression.DefaultExpressionFactory; +import com.avaje.ebeaninternal.server.core.timezone.DataTimeZone; import org.avaje.datasource.DataSourcePool; import com.avaje.ebeaninternal.server.persist.Binder; import com.avaje.ebeaninternal.server.persist.DefaultPersister; @@ -79,6 +83,8 @@ public class InternalConfiguration { private final TypeManager typeManager; + private final DataTimeZone dataTimeZone; + private final Binder binder; private final DeployCreateProperties deployCreateProperties; @@ -136,7 +142,8 @@ public class InternalConfiguration { DatabasePlatform databasePlatform = serverConfig.getDatabasePlatform(); - this.binder = getBinder(typeManager, databasePlatform); + this.dataTimeZone = initDataTimeZone(); + this.binder = getBinder(typeManager, databasePlatform, dataTimeZone); this.cQueryEngine = new CQueryEngine(databasePlatform, binder, asOfTableMapping, serverConfig.getAsOfSysPeriod(), draftTableMap); } @@ -218,15 +225,15 @@ public class InternalConfiguration { /** * For 'As Of' queries return the number of bind variables per predicate. */ - private Binder getBinder(TypeManager typeManager, DatabasePlatform databasePlatform) { + private Binder getBinder(TypeManager typeManager, DatabasePlatform databasePlatform, DataTimeZone dataTimeZone) { JsonExpressionHandler jsonHandler = getJsonExpressionHandler(databasePlatform); DbHistorySupport historySupport = databasePlatform.getHistorySupport(); if (historySupport == null) { - return new Binder(typeManager, 0, false, jsonHandler); + return new Binder(typeManager, 0, false, jsonHandler, dataTimeZone); } - return new Binder(typeManager, historySupport.getBindCount(), historySupport.isBindWithFromClause(), jsonHandler); + return new Binder(typeManager, historySupport.getBindCount(), historySupport.isBindWithFromClause(), jsonHandler, dataTimeZone); } /** @@ -381,4 +388,24 @@ public class InternalConfiguration { return new DefaultTransactionScopeManager(transactionManager); } } + + /** + * Create the DataTimeZone implementation to use. + */ + private DataTimeZone initDataTimeZone() { + + String tz = serverConfig.getDataTimeZone(); + if (tz == null) { + return new NoDataTimeZone(); + } + if (getDatabasePlatform().getName().toLowerCase().startsWith("oracle")) { + return new CloneDataTimeZone(tz); + } else { + return new SimpleDataTimeZone(tz); + } + } + + public DataTimeZone getDataTimeZone() { + return dataTimeZone; + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/timezone/CloneDataTimeZone.java b/src/main/java/com/avaje/ebeaninternal/server/core/timezone/CloneDataTimeZone.java new file mode 100644 index 000000000..e0cd52f6c --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/server/core/timezone/CloneDataTimeZone.java @@ -0,0 +1,22 @@ +package com.avaje.ebeaninternal.server.core.timezone; + +import java.util.Calendar; + +/** + * Implementation of DataTimeZone that clones the Calendar instance. + *+ * Used with Oracle JDBC driver as that wants to mutate the Calender. + *
+ */ +public class CloneDataTimeZone extends SimpleDataTimeZone { + + public CloneDataTimeZone(String zoneId) { + super(zoneId); + } + + @Override + public Calendar getTimeZone() { + // return cloned copy for Oracle to muck around with + return (Calendar)zone.clone(); + } +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/timezone/DataTimeZone.java b/src/main/java/com/avaje/ebeaninternal/server/core/timezone/DataTimeZone.java new file mode 100644 index 000000000..2509fd4a2 --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/server/core/timezone/DataTimeZone.java @@ -0,0 +1,14 @@ +package com.avaje.ebeaninternal.server.core.timezone; + +import java.util.Calendar; + +/** + * Define if a Calendar representing the time zone should be used in JDBC calls. + */ +public interface DataTimeZone { + + /** + * Return the Calendar to use for Timezone information. + */ + Calendar getTimeZone(); +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/timezone/NoDataTimeZone.java b/src/main/java/com/avaje/ebeaninternal/server/core/timezone/NoDataTimeZone.java new file mode 100644 index 000000000..735af0202 --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/server/core/timezone/NoDataTimeZone.java @@ -0,0 +1,15 @@ +package com.avaje.ebeaninternal.server.core.timezone; + +import java.util.Calendar; + +/** + * Implementation of DataTimeZone when no time zone is specified. + */ +public class NoDataTimeZone implements DataTimeZone { + + @Override + public Calendar getTimeZone() { + // return null so Calendar is not used + return null; + } +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/timezone/SimpleDataTimeZone.java b/src/main/java/com/avaje/ebeaninternal/server/core/timezone/SimpleDataTimeZone.java new file mode 100644 index 000000000..83c32260e --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/server/core/timezone/SimpleDataTimeZone.java @@ -0,0 +1,22 @@ +package com.avaje.ebeaninternal.server.core.timezone; + +import java.util.Calendar; +import java.util.TimeZone; + +/** + * Implementation of DataTimeZone when single Calendar instance is used. + */ +public class SimpleDataTimeZone implements DataTimeZone { + + protected final Calendar zone; + + public SimpleDataTimeZone(String zoneId) { + this.zone = Calendar.getInstance(TimeZone.getTimeZone(zoneId)); + } + + @Override + public Calendar getTimeZone() { + // return null so Calendar is not used + return zone; + } +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/Binder.java b/src/main/java/com/avaje/ebeaninternal/server/persist/Binder.java index fdaacacdf..5c57c1066 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/Binder.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/Binder.java @@ -2,6 +2,7 @@ package com.avaje.ebeaninternal.server.persist; import java.math.BigDecimal; import java.sql.CallableStatement; +import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; @@ -13,6 +14,7 @@ import com.avaje.ebean.config.dbplatform.DbType; import com.avaje.ebeaninternal.api.BindParams; import com.avaje.ebeaninternal.server.core.JsonExpressionHandler; import com.avaje.ebeaninternal.server.core.Message; +import com.avaje.ebeaninternal.server.core.timezone.DataTimeZone; import com.avaje.ebeaninternal.server.type.DataBind; import com.avaje.ebeaninternal.server.type.ScalarType; import com.avaje.ebeaninternal.server.type.TypeManager; @@ -34,14 +36,19 @@ public class Binder { private final JsonExpressionHandler jsonExpressionHandler; + private final DataTimeZone dataTimeZone; + /** * Set the PreparedStatement with which to bind variables to. */ - public Binder(TypeManager typeManager, int asOfBindCount, boolean bindAsOfWithFromClause, JsonExpressionHandler jsonExpressionHandler) { + public Binder(TypeManager typeManager, int asOfBindCount, boolean bindAsOfWithFromClause, + JsonExpressionHandler jsonExpressionHandler, DataTimeZone dataTimeZone) { + this.typeManager = typeManager; this.asOfBindCount = asOfBindCount; this.bindAsOfWithFromClause = bindAsOfWithFromClause; this.jsonExpressionHandler = jsonExpressionHandler; + this.dataTimeZone = dataTimeZone; } /** @@ -91,6 +98,13 @@ public class Binder { } } + /** + * Bind the parameters to the preparedStatement returning the bind log. + */ + public String bind(BindParams bindParams, PreparedStatement statement) throws SQLException { + return bind(bindParams, new DataBind(dataTimeZone, statement)); + } + /** * Bind the list of positionedParameters in BindParams. */ @@ -392,4 +406,11 @@ public class Binder { public JsonExpressionHandler getJsonExpressionHandler() { return jsonExpressionHandler; } + + /** + * Create and return a DataBind for the statement. + */ + public DataBind dataBind(PreparedStatement stmt) { + return new DataBind(dataTimeZone, stmt); + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/ExeCallableSql.java b/src/main/java/com/avaje/ebeaninternal/server/persist/ExeCallableSql.java index d3cd9683c..89435be6b 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/ExeCallableSql.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/ExeCallableSql.java @@ -4,7 +4,6 @@ import com.avaje.ebeaninternal.api.BindParams; import com.avaje.ebeaninternal.api.SpiCallableSql; import com.avaje.ebeaninternal.api.SpiTransaction; import com.avaje.ebeaninternal.server.core.PersistRequestCallableSql; -import com.avaje.ebeaninternal.server.type.DataBind; import com.avaje.ebeaninternal.server.util.BindParamsParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,7 +95,7 @@ public class ExeCallableSql { String bindLog = null; if (!bindParams.isEmpty()) { - bindLog = binder.bind(bindParams, new DataBind(cstmt)); + bindLog = binder.bind(bindParams, cstmt); } request.setBindLog(bindLog); diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/ExeOrmUpdate.java b/src/main/java/com/avaje/ebeaninternal/server/persist/ExeOrmUpdate.java index bdbdba166..2b3480543 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/ExeOrmUpdate.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/ExeOrmUpdate.java @@ -113,7 +113,7 @@ public class ExeOrmUpdate { String bindLog = null; if (!bindParams.isEmpty()) { - bindLog = binder.bind(bindParams, new DataBind(pstmt)); + bindLog = binder.bind(bindParams, pstmt); } request.setBindLog(bindLog); diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/ExeUpdateSql.java b/src/main/java/com/avaje/ebeaninternal/server/persist/ExeUpdateSql.java index ebc58002e..377ce08fa 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/ExeUpdateSql.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/ExeUpdateSql.java @@ -100,7 +100,7 @@ public class ExeUpdateSql { String bindLog = null; if (!bindParams.isEmpty()) { - bindLog = binder.bind(bindParams, new DataBind(pstmt)); + bindLog = binder.bind(bindParams, pstmt); } request.setBindLog(bindLog); diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DeleteHandler.java b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DeleteHandler.java index 9d5991c9c..5f240a81f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DeleteHandler.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DeleteHandler.java @@ -1,14 +1,12 @@ package com.avaje.ebeaninternal.server.persist.dml; -import java.sql.PreparedStatement; -import java.sql.SQLException; - -import javax.persistence.OptimisticLockException; - import com.avaje.ebeaninternal.api.DerivedRelationshipData; import com.avaje.ebeaninternal.api.SpiTransaction; import com.avaje.ebeaninternal.server.core.PersistRequestBean; -import com.avaje.ebeaninternal.server.type.DataBind; + +import javax.persistence.OptimisticLockException; +import java.sql.PreparedStatement; +import java.sql.SQLException; /** * Delete bean handler. @@ -37,7 +35,7 @@ public class DeleteHandler extends DmlHandler { } else { pstmt = getPstmt(t, sql, false); } - dataBind = new DataBind(pstmt); + dataBind = bind(pstmt); meta.bind(persistRequest, this); logSql(sql); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DmlHandler.java b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DmlHandler.java index f85168f26..db0c8261a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DmlHandler.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DmlHandler.java @@ -74,6 +74,13 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { return persistRequest; } + /** + * Bind to the statement returning the DataBind. + */ + protected DataBind bind(PreparedStatement stmt) { + return new DataBind(persistRequest.getDataTimeZone(), stmt); + } + /** * Get the sql and bind the statement. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/InsertHandler.java b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/InsertHandler.java index 386edec12..efb9bf877 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/InsertHandler.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/InsertHandler.java @@ -9,7 +9,6 @@ import com.avaje.ebeaninternal.server.core.PersistRequestBean; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; import com.avaje.ebeaninternal.server.deploy.BeanProperty; import com.avaje.ebeaninternal.server.persist.DmlUtil; -import com.avaje.ebeaninternal.server.type.DataBind; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -98,9 +97,7 @@ public class InsertHandler extends DmlHandler { } else { pstmt = getPstmt(t, sql, useGeneratedKeys); } - dataBind = new DataBind(pstmt); - - // bind the bean property values + dataBind = bind(pstmt); meta.bind(this, bean, withId, persistRequest.isPublish()); logSql(sql); diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/UpdateHandler.java b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/UpdateHandler.java index 388331753..a945ff86d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/UpdateHandler.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/UpdateHandler.java @@ -4,7 +4,6 @@ import com.avaje.ebeaninternal.api.DerivedRelationshipData; import com.avaje.ebeaninternal.api.SpiTransaction; import com.avaje.ebeaninternal.api.SpiUpdatePlan; import com.avaje.ebeaninternal.server.core.PersistRequestBean; -import com.avaje.ebeaninternal.server.type.DataBind; import javax.persistence.OptimisticLockException; import java.sql.PreparedStatement; @@ -47,8 +46,7 @@ public class UpdateHandler extends DmlHandler { } else { pstmt = getPstmt(t, sql, false); } - dataBind = new DataBind(pstmt); - + dataBind = bind(pstmt); meta.bind(persistRequest, this, updatePlan); setUpdateGenValues(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java index 523981f58..e8f96c930 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java @@ -335,11 +335,7 @@ public class CQuery