diff --git a/hibernate-core/src/main/java/org/hibernate/ConnectionAcquisitionMode.java b/hibernate-core/src/main/java/org/hibernate/ConnectionAcquisitionMode.java new file mode 100644 index 0000000000..0bf7d76e9c --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/ConnectionAcquisitionMode.java @@ -0,0 +1,50 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2015, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate; + +/** + * Indicates the manner in which JDBC Connections should be acquired. Inverse to + * {@link org.hibernate.ConnectionReleaseMode}. + *
+ * NOTE : Not yet used. The only current behavior is the legacy behavior, which is + * {@link #AS_NEEDED}. + * + * @author Steve Ebersole + */ +public enum ConnectionAcquisitionMode { + /** + * The Connection will be acquired as soon as the Hibernate Session is opened. This + * also circumvents ConnectionReleaseMode, as the Connection will then be held until the + * Session is closed. + */ + IMMEDIATELY, + /** + * The legacy behavior. A Connection is only acquired when (if_) it is actually needed. + */ + AS_NEEDED, + /** + * Not sure yet tbh :) + */ + DEFAULT +} diff --git a/hibernate-core/src/main/java/org/hibernate/ConnectionReleaseMode.java b/hibernate-core/src/main/java/org/hibernate/ConnectionReleaseMode.java index 189b52c984..26ee49b7c1 100644 --- a/hibernate-core/src/main/java/org/hibernate/ConnectionReleaseMode.java +++ b/hibernate-core/src/main/java/org/hibernate/ConnectionReleaseMode.java @@ -27,7 +27,7 @@ /** * Defines the various policies by which Hibernate might release its underlying - * JDBC connection. + * JDBC connection. Inverse of {@link ConnectionAcquisitionMode}. * * @author Steve Ebersole */ diff --git a/hibernate-core/src/main/java/org/hibernate/EmptyInterceptor.java b/hibernate-core/src/main/java/org/hibernate/EmptyInterceptor.java index cf9d1710a3..f7bf1c7c87 100755 --- a/hibernate-core/src/main/java/org/hibernate/EmptyInterceptor.java +++ b/hibernate-core/src/main/java/org/hibernate/EmptyInterceptor.java @@ -148,9 +148,4 @@ public void onCollectionRecreate(Object collection, Serializable key) throws Cal @Override public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException { } - - @Override - public String inspect(String sql) { - return this.onPrepareStatement( sql ); - } } diff --git a/hibernate-core/src/main/java/org/hibernate/Interceptor.java b/hibernate-core/src/main/java/org/hibernate/Interceptor.java index 0e4a1ab313..864fb91e5c 100644 --- a/hibernate-core/src/main/java/org/hibernate/Interceptor.java +++ b/hibernate-core/src/main/java/org/hibernate/Interceptor.java @@ -53,7 +53,7 @@ * * @author Gavin King */ -public interface Interceptor extends StatementInspector { +public interface Interceptor { /** * Called just before an object is initialized. The interceptor may change the state, which will * be propagated to the persistent object. Note that when this method is called, entity will be @@ -273,6 +273,10 @@ public interface Interceptor extends StatementInspector { * Called when sql string is being prepared. * @param sql sql to be prepared * @return original or modified sql + * + * @deprecated Supply a {@link org.hibernate.resource.jdbc.spi.StatementInspector} instead, if you wish + * to inspect and alter SQL statements. */ + @Deprecated public String onPrepareStatement(String sql); } diff --git a/hibernate-core/src/main/java/org/hibernate/SessionBuilder.java b/hibernate-core/src/main/java/org/hibernate/SessionBuilder.java index 7cb90fa0c6..bf1eb6780e 100644 --- a/hibernate-core/src/main/java/org/hibernate/SessionBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/SessionBuilder.java @@ -25,6 +25,8 @@ import java.sql.Connection; +import org.hibernate.resource.jdbc.spi.StatementInspector; + /** * Represents a consolidation of all session creation options into a builder style delegate. * @@ -60,6 +62,15 @@ public interface SessionBuilder { */ public SessionBuilder noInterceptor(); + /** + * Applies a specific StatementInspector to the session options. + * + * @param statementInspector The StatementInspector to use. + * + * @return {@code this}, for method chaining + */ + public SessionBuilder statementInspector(StatementInspector statementInspector); + /** * Adds a specific connection to the session options. * diff --git a/hibernate-core/src/main/java/org/hibernate/boot/SessionFactoryBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/SessionFactoryBuilder.java index ca53d8010d..a942da8e3e 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/SessionFactoryBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/SessionFactoryBuilder.java @@ -40,6 +40,7 @@ import org.hibernate.hql.spi.id.MultiTableBulkIdStrategy; import org.hibernate.loader.BatchFetchStyle; import org.hibernate.proxy.EntityNotFoundDelegate; +import org.hibernate.resource.jdbc.spi.StatementInspector; import org.hibernate.tuple.entity.EntityTuplizer; import org.hibernate.tuple.entity.EntityTuplizerFactory; @@ -142,6 +143,18 @@ public interface SessionFactoryBuilder { */ public SessionFactoryBuilder applyInterceptor(Interceptor interceptor); + /** + * Names a StatementInspector to be applied to the SessionFactory, which in turn means it will be used by all + * Sessions unless one is explicitly specified in {@link org.hibernate.SessionBuilder#statementInspector} + * + * @param statementInspector The StatementInspector + * + * @return {@code this}, for method chaining + * + * @see org.hibernate.cfg.AvailableSettings#STATEMENT_INSPECTOR + */ + public SessionFactoryBuilder applyStatementInspector(StatementInspector statementInspector); + /** * Specifies one or more observers to be applied to the SessionFactory. Can be called multiple times to add * additional observers. @@ -365,19 +378,30 @@ public SessionFactoryBuilder applyEntityTuplizer( public SessionFactoryBuilder applyCurrentTenantIdentifierResolver(CurrentTenantIdentifierResolver resolver); /** - * Should we track JTA transactions to attempt to detect timeouts? + * If using the built-in Hibernate JTA-based TransactionCoordinator/Builder, should it track JTA + * transactions by thread in an attempt to detect timeouts? * * @param enabled {@code true} indicates we should track by thread; {@code false} indicates not * * @return {@code this}, for method chaining * * @see org.hibernate.cfg.AvailableSettings#JTA_TRACK_BY_THREAD - * - * @deprecated This should be replaced by new TransactionCoordinator work... */ - @Deprecated public SessionFactoryBuilder applyJtaTrackingByThread(boolean enabled); + /** + * If using the built-in Hibernate JTA-based TransactionCoordinator/Builder, should it prefer to use + * {@link javax.transaction.UserTransaction} over {@link javax.transaction.Transaction}? + * + * @param preferUserTransactions {@code true} indicates we should prefer {@link javax.transaction.UserTransaction}; + * {@code false} indicates we should prefer {@link javax.transaction.Transaction} + * + * @return {@code this}, for method chaining + * + * @see org.hibernate.cfg.AvailableSettings#PREFER_USER_TRANSACTION + */ + public SessionFactoryBuilder applyPreferUserTransactions(boolean preferUserTransactions); + /** * Apply query substitutions to use in HQL queries. Note, this is a legacy feature and almost always * never needed anymore... diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java index 8452dbb00d..43ec7972a0 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java @@ -65,6 +65,7 @@ import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.loader.BatchFetchStyle; import org.hibernate.proxy.EntityNotFoundDelegate; +import org.hibernate.resource.jdbc.spi.StatementInspector; import org.hibernate.resource.transaction.TransactionCoordinatorBuilder; import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.tuple.entity.EntityTuplizer; @@ -102,6 +103,7 @@ import static org.hibernate.cfg.AvailableSettings.SESSION_FACTORY_NAME_IS_JNDI; import static org.hibernate.cfg.AvailableSettings.STATEMENT_BATCH_SIZE; import static org.hibernate.cfg.AvailableSettings.STATEMENT_FETCH_SIZE; +import static org.hibernate.cfg.AvailableSettings.STATEMENT_INSPECTOR; import static org.hibernate.cfg.AvailableSettings.USE_DIRECT_REFERENCE_CACHE_ENTRIES; import static org.hibernate.cfg.AvailableSettings.USE_GET_GENERATED_KEYS; import static org.hibernate.cfg.AvailableSettings.USE_IDENTIFIER_ROLLBACK; @@ -172,6 +174,18 @@ public SessionFactoryBuilder applyAutoFlushing(boolean enabled) { return this; } + @Override + public SessionFactoryBuilder applyJtaTrackingByThread(boolean enabled) { + this.options.jtaTrackByThread = enabled; + return this; + } + + @Override + public SessionFactoryBuilder applyPreferUserTransactions(boolean preferUserTransactions) { + this.options.preferUserTransaction = preferUserTransactions; + return this; + } + @Override public SessionFactoryBuilder applyStatisticsSupport(boolean enabled) { this.options.statisticsEnabled = enabled; @@ -190,13 +204,18 @@ public SessionFactoryBuilder applyInterceptor(Interceptor interceptor) { return this; } + @Override + public SessionFactoryBuilder applyStatementInspector(StatementInspector statementInspector) { + this.options.statementInspector = statementInspector; + return this; + } + @Override public SessionFactoryBuilder applyCustomEntityDirtinessStrategy(CustomEntityDirtinessStrategy strategy) { this.options.customEntityDirtinessStrategy = strategy; return this; } - @Override public SessionFactoryBuilder addEntityNameResolver(EntityNameResolver... entityNameResolvers) { this.options.entityNameResolvers.addAll( Arrays.asList( entityNameResolvers ) ); @@ -307,12 +326,6 @@ public SessionFactoryBuilder applyCurrentTenantIdentifierResolver(CurrentTenantI return this; } - @Override - public SessionFactoryBuilder applyJtaTrackingByThread(boolean enabled) { - this.options.jtaTrackByThread = enabled; - return this; - } - @Override @SuppressWarnings("unchecked") public SessionFactoryBuilder applyQuerySubstitutions(Map substitutions) { @@ -473,9 +486,14 @@ public static class SessionFactoryOptionsStateStandardImpl implements SessionFac private boolean flushBeforeCompletionEnabled; private boolean autoCloseSessionEnabled; + // (JTA) transaction handling + private boolean jtaTrackByThread; + private boolean preferUserTransaction; + // Statistics/Interceptor/observers private boolean statisticsEnabled; private Interceptor interceptor; + private StatementInspector statementInspector; private Listfalse
+ *
+ * @since 5.0
+ */
+ String PREFER_USER_TRANSACTION = "hibernate.jta.prefer_user_transaction";
+
/**
* Names the {@link org.hibernate.engine.transaction.jta.platform.spi.JtaPlatformResolver} implementation to use.
* @since 4.3
@@ -661,6 +679,18 @@ public interface AvailableSettings {
*/
String INTERCEPTOR = "hibernate.session_factory.interceptor";
+ /**
+ * Names a {@link org.hibernate.resource.jdbc.spi.StatementInspector} implementation to be applied to
+ * the {@link org.hibernate.SessionFactory}. Can referencefalse
- *
- * @since 5.0
- */
- String PREFER_USER_TRANSACTION = "hibernate.jta.prefer_user_transaction";
}
diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorImpl.java
index f75818738e..3a414d7415 100644
--- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorImpl.java
@@ -61,7 +61,7 @@
import org.hibernate.resource.jdbc.internal.LogicalConnectionProvidedImpl;
import org.hibernate.resource.jdbc.spi.JdbcSessionOwner;
import org.hibernate.resource.jdbc.spi.LogicalConnectionImplementor;
-import org.hibernate.resource.transaction.backend.store.spi.DataStoreTransaction;
+import org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransaction;
/**
* Standard Hibernate implementation of {@link JdbcCoordinator}
@@ -517,7 +517,7 @@ public JdbcSessionOwner getJdbcSessionOwner() {
}
@Override
- public DataStoreTransaction getResourceLocalTransaction() {
+ public JdbcResourceTransaction getResourceLocalTransaction() {
return logicalConnection.getPhysicalJdbcTransaction();
}
diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java
index ea34d8e999..d120a119c6 100644
--- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java
@@ -171,10 +171,12 @@ public PreparedStatement doPrepare() throws SQLException {
private abstract class StatementPreparationTemplate {
protected final String sql;
- protected StatementPreparationTemplate(String sql) {
- this.sql = jdbcCoordinator.getJdbcSessionOwner().getJdbcSessionContext().getStatementInspector().inspect(
- sql
- );
+ protected StatementPreparationTemplate(String incomingSql) {
+ final String inspectedSql = jdbcCoordinator.getJdbcSessionOwner()
+ .getJdbcSessionContext()
+ .getStatementInspector()
+ .inspect( incomingSql );
+ this.sql = inspectedSql == null ? incomingSql : inspectedSql;
}
public PreparedStatement prepareStatement() {
diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/JdbcCoordinator.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/JdbcCoordinator.java
index c7c8a16b47..dde8f2404d 100644
--- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/JdbcCoordinator.java
+++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/JdbcCoordinator.java
@@ -33,8 +33,7 @@
import org.hibernate.jdbc.WorkExecutorVisitable;
import org.hibernate.resource.jdbc.ResourceRegistry;
import org.hibernate.resource.jdbc.spi.LogicalConnectionImplementor;
-import org.hibernate.resource.transaction.TransactionCoordinator;
-import org.hibernate.resource.transaction.backend.store.spi.DataStoreTransactionAccess;
+import org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransactionAccess;
import org.hibernate.resource.transaction.spi.TransactionCoordinatorOwner;
/**
@@ -43,7 +42,7 @@
* @author Steve Ebersole
* @author Brett Meyer
*/
-public interface JdbcCoordinator extends Serializable, TransactionCoordinatorOwner, DataStoreTransactionAccess {
+public interface JdbcCoordinator extends Serializable, TransactionCoordinatorOwner, JdbcResourceTransactionAccess {
// /**
// * Retrieve the transaction coordinator associated with this JDBC coordinator.
// *
diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/ForwardingSessionBuilder.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/ForwardingSessionBuilder.java
index e98a84763e..2d689032f5 100644
--- a/hibernate-core/src/main/java/org/hibernate/engine/spi/ForwardingSessionBuilder.java
+++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/ForwardingSessionBuilder.java
@@ -30,6 +30,7 @@
import org.hibernate.Session;
import org.hibernate.SessionBuilder;
import org.hibernate.SessionEventListener;
+import org.hibernate.resource.jdbc.spi.StatementInspector;
/**
* Base class for {@link SessionBuilder} implementations that wish to implement only parts of that contract themselves
@@ -60,6 +61,11 @@ public SessionBuilder noInterceptor() {
return delegate.noInterceptor();
}
+ @Override
+ public SessionBuilder statementInspector(StatementInspector statementInspector) {
+ return delegate.statementInspector( statementInspector );
+ }
+
@Override
public SessionBuilder connection(Connection connection) {
return delegate.connection(connection);
diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/ForwardingSharedSessionBuilder.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/ForwardingSharedSessionBuilder.java
index 60e9148827..0f697de9c9 100644
--- a/hibernate-core/src/main/java/org/hibernate/engine/spi/ForwardingSharedSessionBuilder.java
+++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/ForwardingSharedSessionBuilder.java
@@ -31,6 +31,7 @@
import org.hibernate.SessionBuilder;
import org.hibernate.SessionEventListener;
import org.hibernate.SharedSessionBuilder;
+import org.hibernate.resource.jdbc.spi.StatementInspector;
/**
* Base class for {@link SharedSessionBuilder} implementations that wish to implement only parts of that contract
@@ -96,6 +97,11 @@ public SharedSessionBuilder noInterceptor() {
return delegate.noInterceptor();
}
+ @Override
+ public SessionBuilder statementInspector(StatementInspector statementInspector) {
+ return delegate.statementInspector( statementInspector );
+ }
+
@Override
public SharedSessionBuilder connection(Connection connection) {
return delegate.connection(connection);
diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/global/GlobalTemporaryTableBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/global/GlobalTemporaryTableBulkIdStrategy.java
index c11f8e2ef1..98b0af1748 100644
--- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/global/GlobalTemporaryTableBulkIdStrategy.java
+++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/global/GlobalTemporaryTableBulkIdStrategy.java
@@ -24,8 +24,6 @@
package org.hibernate.hql.spi.id.global;
import java.sql.PreparedStatement;
-import java.util.ArrayList;
-import java.util.List;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.spi.MetadataBuildingOptions;
@@ -43,7 +41,6 @@
import org.hibernate.hql.internal.ast.tree.UpdateStatement;
import org.hibernate.hql.spi.id.AbstractMultiTableBulkIdStrategyImpl;
import org.hibernate.hql.spi.id.IdTableHelper;
-import org.hibernate.hql.spi.id.IdTableInfo;
import org.hibernate.hql.spi.id.IdTableSupport;
import org.hibernate.hql.spi.id.IdTableSupportStandardImpl;
import org.hibernate.hql.spi.id.MultiTableBulkIdStrategy;
@@ -188,13 +185,13 @@ private void cleanUpRows(String tableName, SessionImplementor session) {
final String sql = "delete from " + tableName;
PreparedStatement ps = null;
try {
- ps = session.getTransactionCoordinator().getJdbcCoordinator().getStatementPreparer().prepareStatement( sql, false );
- session.getTransactionCoordinator().getJdbcCoordinator().getResultSetReturn().executeUpdate( ps );
+ ps = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql, false );
+ session.getJdbcCoordinator().getResultSetReturn().executeUpdate( ps );
}
finally {
if ( ps != null ) {
try {
- session.getTransactionCoordinator().getJdbcCoordinator().release( ps );
+ session.getJdbcCoordinator().getResourceRegistry().release( ps );
}
catch( Throwable ignore ) {
// ignore
diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/Helper.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/Helper.java
index 7e830b11e6..8029290e4a 100644
--- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/Helper.java
+++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/Helper.java
@@ -60,14 +60,14 @@ public void cleanUpRows(String tableName, SessionImplementor session) {
try {
PreparedStatement ps = null;
try {
- ps = session.getTransactionCoordinator().getJdbcCoordinator().getStatementPreparer().prepareStatement( sql, false );
+ ps = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql, false );
bindSessionIdentifier( ps, session, 1 );
- session.getTransactionCoordinator().getJdbcCoordinator().getResultSetReturn().executeUpdate( ps );
+ session.getJdbcCoordinator().getResultSetReturn().executeUpdate( ps );
}
finally {
if ( ps != null ) {
try {
- session.getTransactionCoordinator().getJdbcCoordinator().release( ps );
+ session.getJdbcCoordinator().getResourceRegistry().release( ps );
}
catch( Throwable ignore ) {
// ignore
diff --git a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSessionImpl.java
index 839e41a394..da02915f55 100755
--- a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSessionImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSessionImpl.java
@@ -30,6 +30,7 @@
import java.util.List;
import java.util.UUID;
+import org.hibernate.ConnectionAcquisitionMode;
import org.hibernate.ConnectionReleaseMode;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
@@ -41,8 +42,8 @@
import org.hibernate.SessionException;
import org.hibernate.SharedSessionContract;
import org.hibernate.Transaction;
+import org.hibernate.boot.spi.SessionFactoryOptions;
import org.hibernate.cache.spi.CacheKey;
-import org.hibernate.cfg.Settings;
import org.hibernate.engine.jdbc.LobCreationContext;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
@@ -71,7 +72,7 @@
import org.hibernate.resource.jdbc.spi.JdbcSessionOwner;
import org.hibernate.resource.jdbc.spi.StatementInspector;
import org.hibernate.resource.transaction.TransactionCoordinatorBuilder;
-import org.hibernate.resource.transaction.TransactionCoordinatorJtaBuilder;
+import org.hibernate.resource.transaction.TransactionCoordinatorBuilder.TransactionCoordinatorOptions;
import org.hibernate.resource.transaction.spi.TransactionStatus;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.Type;
@@ -82,7 +83,7 @@
* @author Gavin King
*/
public abstract class AbstractSessionImpl
- implements Serializable, SharedSessionContract, SessionImplementor, JdbcSessionOwner {
+ implements Serializable, SharedSessionContract, SessionImplementor, JdbcSessionOwner, TransactionCoordinatorOptions {
protected transient SessionFactoryImpl factory;
private final String tenantIdentifier;
private boolean closed;
@@ -108,6 +109,7 @@ public SessionFactoryImplementor getFactory() {
return factory;
}
+ @Override
public abstract boolean shouldAutoJoinTransaction();
@Override
@@ -482,6 +484,10 @@ public JdbcSessionContextImpl(SessionFactoryImpl sessionFactory, StatementInspec
this.inspector = inspector;
this.serviceRegistry = sessionFactory.getServiceRegistry();
this.jdbcObserver = new JdbcObserverImpl();
+
+ if ( inspector == null ) {
+ throw new IllegalArgumentException( "StatementInspector cannot be null" );
+ }
}
@Override
@@ -506,7 +512,7 @@ public ConnectionReleaseMode getConnectionReleaseMode() {
@Override
public ConnectionAcquisitionMode getConnectionAcquisitionMode() {
- return null;
+ return ConnectionAcquisitionMode.DEFAULT;
}
@Override
@@ -529,8 +535,8 @@ public ServiceRegistry getServiceRegistry() {
return this.serviceRegistry;
}
- private final Settings settings() {
- return this.sessionFactory.getSettings();
+ private SessionFactoryOptions settings() {
+ return this.sessionFactory.getSessionFactoryOptions();
}
}
@@ -603,20 +609,7 @@ public void jdbcExecuteBatchEnd() {
@Override
public TransactionCoordinatorBuilder getTransactionCoordinatorBuilder() {
- TransactionCoordinatorBuilder transactionCoordinatorBuilder = factory.getServiceRegistry()
- .getService( TransactionCoordinatorBuilder.class );
-
- if ( transactionCoordinatorBuilder instanceof TransactionCoordinatorJtaBuilder ) {
- ((TransactionCoordinatorJtaBuilder) transactionCoordinatorBuilder).setJtaPlatform(
- factory.getSettings()
- .getJtaPlatform()
- ).setAutoJoinTransactions( shouldAutoJoinTransaction() ).setPerformJtaThreadTracking(
- factory.getSettings()
- .isJtaTrackByThread()
- ).setPreferUserTransactions( factory.getSettings().isPreferUserTransaction() );
- }
-
- return transactionCoordinatorBuilder;
+ return factory.getServiceRegistry().getService( TransactionCoordinatorBuilder.class );
}
}
diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java
index cb1b090546..e5f73d4dee 100644
--- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java
@@ -137,6 +137,7 @@
import org.hibernate.persister.spi.PersisterCreationContext;
import org.hibernate.persister.spi.PersisterFactory;
import org.hibernate.proxy.EntityNotFoundDelegate;
+import org.hibernate.resource.jdbc.spi.StatementInspector;
import org.hibernate.resource.transaction.TransactionCoordinator;
import org.hibernate.secure.spi.GrantedPermission;
import org.hibernate.secure.spi.JaccPermissionDeclarations;
@@ -1195,6 +1196,7 @@ static class SessionBuilderImpl implements SessionBuilderImplementor {
private final SessionFactoryImpl sessionFactory;
private SessionOwner sessionOwner;
private Interceptor interceptor;
+ private StatementInspector statementInspector;
private Connection connection;
private ConnectionReleaseMode connectionReleaseMode;
private boolean autoClose;
@@ -1210,6 +1212,7 @@ static class SessionBuilderImpl implements SessionBuilderImplementor {
// set up default builder values...
this.interceptor = sessionFactory.getInterceptor();
+ this.statementInspector = sessionFactory.getSessionFactoryOptions().getStatementInspector();
this.connectionReleaseMode = settings.getConnectionReleaseMode();
this.autoClose = settings.isAutoCloseSessionEnabled();
this.flushBeforeCompletion = settings.isFlushBeforeCompletionEnabled();
@@ -1251,6 +1254,7 @@ public Session openSession() {
autoJoinTransactions,
sessionFactory.settings.getRegionFactory().nextTimestamp(),
interceptor,
+ statementInspector,
flushBeforeCompletion,
autoClose,
connectionReleaseMode,
@@ -1282,6 +1286,12 @@ public SessionBuilder noInterceptor() {
return this;
}
+ @Override
+ public SessionBuilder statementInspector(StatementInspector statementInspector) {
+ this.statementInspector = statementInspector;
+ return this;
+ }
+
@Override
public SessionBuilder connection(Connection connection) {
this.connection = connection;
diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java
index 5ebcfe1447..8d8fb9d303 100644
--- a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java
@@ -202,6 +202,7 @@ public final class SessionImpl extends AbstractSessionImpl implements EventSourc
private transient TransactionCoordinator transactionCoordinator;
private transient JdbcCoordinatorImpl jdbcCoordinator;
private transient Interceptor interceptor;
+ private StatementInspector statementInspector;
private transient EntityNameResolver entityNameResolver = new CoordinatingEntityNameResolver();
private transient ConnectionReleaseMode connectionReleaseMode;
@@ -251,6 +252,7 @@ public final class SessionImpl extends AbstractSessionImpl implements EventSourc
final boolean autoJoinTransactions,
final long timestamp,
final Interceptor interceptor,
+ final StatementInspector statementInspector,
final boolean flushBeforeCompletionEnabled,
final boolean autoCloseSessionEnabled,
final ConnectionReleaseMode connectionReleaseMode,
@@ -264,7 +266,19 @@ public final class SessionImpl extends AbstractSessionImpl implements EventSourc
this.autoCloseSessionEnabled = autoCloseSessionEnabled;
this.flushBeforeCompletionEnabled = flushBeforeCompletionEnabled;
- this.jdbcSessionContext = new JdbcSessionContextImpl( factory, getStatementInspector() );
+
+ if ( statementInspector == null ) {
+ this.statementInspector = new StatementInspector() {
+ @Override
+ public String inspect(String sql) {
+ return SessionImpl.this.interceptor.onPrepareStatement( sql );
+ }
+ };
+ }
+ else {
+ this.statementInspector = statementInspector;
+ }
+ this.jdbcSessionContext = new JdbcSessionContextImpl( factory, this.statementInspector );
if ( transactionCoordinator == null ) {
this.isTransactionCoordinatorShared = false;
@@ -272,7 +286,7 @@ public final class SessionImpl extends AbstractSessionImpl implements EventSourc
this.autoJoinTransactions = autoJoinTransactions;
this.jdbcCoordinator = new JdbcCoordinatorImpl( connection, this );
- this.transactionCoordinator = getTransactionCoordinatorBuilder().buildTransactionCoordinator( this.jdbcCoordinator );
+ this.transactionCoordinator = getTransactionCoordinatorBuilder().buildTransactionCoordinator( this.jdbcCoordinator, this );
this.currentHibernateTransaction = getTransaction();
}
else {
@@ -2155,12 +2169,12 @@ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFound
interceptor = (Interceptor) ois.readObject();
factory = SessionFactoryImpl.deserialize( ois );
- this.jdbcSessionContext = new JdbcSessionContextImpl( factory, interceptor );
+ this.jdbcSessionContext = new JdbcSessionContextImpl( factory, statementInspector );
sessionOwner = (SessionOwner) ois.readObject();
jdbcCoordinator = JdbcCoordinatorImpl.deserialize( ois, this );
- this.transactionCoordinator = getTransactionCoordinatorBuilder().buildTransactionCoordinator( jdbcCoordinator );
+ this.transactionCoordinator = getTransactionCoordinatorBuilder().buildTransactionCoordinator( jdbcCoordinator, this );
persistenceContext = StatefulPersistenceContext.deserialize( ois, this );
actionQueue = ActionQueue.deserialize( ois, this );
@@ -2232,10 +2246,6 @@ public JdbcSessionContext getJdbcSessionContext() {
return this.jdbcSessionContext;
}
- private StatementInspector getStatementInspector() {
- return this.interceptor;
- }
-
@Override
public void beforeTransactionCompletion() {
LOG.trace( "before transaction completion" );
@@ -2412,6 +2422,11 @@ public SharedSessionBuilder noInterceptor() {
return (SharedSessionBuilder) super.noInterceptor();
}
+ @Override
+ public SharedSessionBuilder statementInspector(StatementInspector statementInspector) {
+ return (SharedSessionBuilder) super.statementInspector( statementInspector );
+ }
+
@Override
public SharedSessionBuilder connection(Connection connection) {
return (SharedSessionBuilder) super.connection( connection );
diff --git a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java
index 218836435c..b3e3361e4b 100755
--- a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java
@@ -23,15 +23,13 @@
*/
package org.hibernate.internal;
-import javax.transaction.SystemException;
import java.io.Serializable;
import java.sql.Connection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-
-import org.jboss.logging.Logger;
+import javax.transaction.SystemException;
import org.hibernate.CacheMode;
import org.hibernate.Criteria;
@@ -73,16 +71,17 @@
import org.hibernate.pretty.MessageHelper;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.resource.jdbc.spi.JdbcSessionContext;
+import org.hibernate.resource.jdbc.spi.StatementInspector;
import org.hibernate.resource.transaction.TransactionCoordinator;
import org.hibernate.resource.transaction.spi.TransactionStatus;
import org.hibernate.type.Type;
/**
* @author Gavin King
+ * @author Steve Ebersole
*/
public class StatelessSessionImpl extends AbstractSessionImpl implements StatelessSession {
-
- private static final CoreMessageLogger LOG = Logger.getMessageLogger(CoreMessageLogger.class, StatelessSessionImpl.class.getName());
+ private static final CoreMessageLogger LOG = CoreLogging.messageLogger( StatelessSessionImpl.class );
private TransactionCoordinator transactionCoordinator;
@@ -104,10 +103,18 @@ public class StatelessSessionImpl extends AbstractSessionImpl implements Statele
SessionFactoryImpl factory,
long timestamp) {
super( factory, tenantIdentifier );
- this.jdbcSessionContext = new JdbcSessionContextImpl( factory, EmptyInterceptor.INSTANCE );
+ this.jdbcSessionContext = new JdbcSessionContextImpl(
+ factory,
+ new StatementInspector() {
+ @Override
+ public String inspect(String sql) {
+ return null;
+ }
+ }
+ );
this.jdbcCoordinator = new JdbcCoordinatorImpl( connection, this );
- this.transactionCoordinator = getTransactionCoordinatorBuilder().buildTransactionCoordinator( jdbcCoordinator );
+ this.transactionCoordinator = getTransactionCoordinatorBuilder().buildTransactionCoordinator( jdbcCoordinator, this );
this.currentHibernateTransaction = getTransaction();
this.timestamp = timestamp;
}
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionManagedImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionManagedImpl.java
index 4a2b0bef31..87de055190 100644
--- a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionManagedImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionManagedImpl.java
@@ -8,6 +8,7 @@
import org.jboss.logging.Logger;
+import org.hibernate.ConnectionAcquisitionMode;
import org.hibernate.ConnectionReleaseMode;
import org.hibernate.ResourceClosedException;
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
@@ -53,7 +54,7 @@ public LogicalConnectionManagedImpl(
this.connectionReleaseMode = jdbcSessionContext.getConnectionReleaseMode();
this.resourceRegistry = resourceRegistry;
- if ( jdbcSessionContext.getConnectionAcquisitionMode() == JdbcSessionContext.ConnectionAcquisitionMode.IMMEDIATELY ) {
+ if ( jdbcSessionContext.getConnectionAcquisitionMode() == ConnectionAcquisitionMode.IMMEDIATELY ) {
if ( jdbcSessionContext.getConnectionReleaseMode() != ConnectionReleaseMode.ON_CLOSE ) {
throw new IllegalStateException(
"Illegal combination of ConnectionAcquisitionMode#IMMEDIATELY with !ConnectionReleaseMode.ON_CLOSE"
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/JdbcSessionContext.java b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/JdbcSessionContext.java
index 3aa2fabe22..a066378c1a 100644
--- a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/JdbcSessionContext.java
+++ b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/JdbcSessionContext.java
@@ -23,10 +23,8 @@
*/
package org.hibernate.resource.jdbc.spi;
+import org.hibernate.ConnectionAcquisitionMode;
import org.hibernate.ConnectionReleaseMode;
-import org.hibernate.engine.jdbc.spi.JdbcServices;
-import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
-import org.hibernate.engine.jdbc.spi.SqlStatementLogger;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.service.ServiceRegistry;
@@ -55,10 +53,4 @@ public interface JdbcSessionContext {
public SessionFactoryImplementor getSessionFactory();
public ServiceRegistry getServiceRegistry();
-
- public static enum ConnectionAcquisitionMode {
- IMMEDIATELY,
- AS_NEEDED,
- DEFAULT
- }
}
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/PhysicalJdbcTransaction.java b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/PhysicalJdbcTransaction.java
index a94e565b8c..c34fa23aaf 100644
--- a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/PhysicalJdbcTransaction.java
+++ b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/PhysicalJdbcTransaction.java
@@ -23,12 +23,12 @@
*/
package org.hibernate.resource.jdbc.spi;
-import org.hibernate.resource.transaction.backend.store.spi.DataStoreTransaction;
+import org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransaction;
/**
* Provides access to manage "transactionality" via the JDBC Connection
*
* @author Steve Ebersole
*/
-public interface PhysicalJdbcTransaction extends DataStoreTransaction {
+public interface PhysicalJdbcTransaction extends JdbcResourceTransaction {
}
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/StatementInspector.java b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/StatementInspector.java
index 5fea8e3183..5325d9d57a 100644
--- a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/StatementInspector.java
+++ b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/StatementInspector.java
@@ -23,12 +23,14 @@
*/
package org.hibernate.resource.jdbc.spi;
+import java.io.Serializable;
+
/**
* Contract to allow inspection (and swapping) of SQL to be prepared
*
* @author Steve Ebersole
*/
-public interface StatementInspector {
+public interface StatementInspector extends Serializable {
/**
* Inspect the given SQL, possibly returning a different SQL to be used instead. Note that returning {@code null}
* is interpreted as returning the same SQL as was passed.
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorBuilder.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorBuilder.java
index 133b252ee1..e42eecb37f 100644
--- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorBuilder.java
+++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorBuilder.java
@@ -24,12 +24,10 @@
package org.hibernate.resource.transaction;
import org.hibernate.ConnectionReleaseMode;
-import org.hibernate.resource.jdbc.spi.JdbcSessionContext;
-import org.hibernate.resource.transaction.TransactionCoordinator;
import org.hibernate.resource.transaction.spi.TransactionCoordinatorOwner;
import org.hibernate.service.Service;
-import static org.hibernate.resource.jdbc.spi.JdbcSessionContext.ConnectionAcquisitionMode;
+import org.hibernate.ConnectionAcquisitionMode;
/**
* Builder for TransactionCoordinator instances
@@ -37,7 +35,21 @@
* @author Steve Ebersole
*/
public interface TransactionCoordinatorBuilder extends Service {
- public TransactionCoordinator buildTransactionCoordinator(TransactionCoordinatorOwner owner);
+ /**
+ * Access to options to are specific to each TransactionCoordinator instance
+ */
+ public static interface TransactionCoordinatorOptions {
+ /**
+ * Indicates whether an active transaction should be automatically joined. Only relevant
+ * for JTA-based TransactionCoordinator instances.
+ *
+ * @return {@code true} indicates the active transaction should be auto joined; {@code false}
+ * indicates it should not (until {@link TransactionCoordinator#explicitJoin} is called).
+ */
+ public boolean shouldAutoJoinTransaction();
+ }
+
+ public TransactionCoordinator buildTransactionCoordinator(TransactionCoordinatorOwner owner, TransactionCoordinatorOptions options);
public boolean isJta();
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorBuilderFactory.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorBuilderFactory.java
deleted file mode 100644
index 66dfb44412..0000000000
--- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorBuilderFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2013, Red Hat Inc. or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Inc.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- */
-package org.hibernate.resource.transaction;
-
-import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl;
-import org.hibernate.resource.transaction.backend.store.internal.ResourceLocalTransactionCoordinatorBuilderImpl;
-
-/**
- * Factory for obtaining instances of standard TransactionCoordinatorBuilder implementations
- *
- * @author Steve Ebersole
- */
-public class TransactionCoordinatorBuilderFactory {
- /**
- * Singleton access
- */
- public static final TransactionCoordinatorBuilderFactory INSTANCE = new TransactionCoordinatorBuilderFactory();
-
- /**
- * Private constructor for the factory
- */
- private TransactionCoordinatorBuilderFactory() {
- }
-
- /**
- * Obtain a TransactionCoordinatorBuilder specific to resource-local environments
- *
- * @return The resource-local specific TransactionCoordinatorBuilder
- */
- public TransactionCoordinatorResourceLocalBuilder forResourceLocal() {
- return new ResourceLocalTransactionCoordinatorBuilderImpl();
- }
-
- /**
- * Obtain a TransactionCoordinatorBuilder specific to JTA environments
- *
- * @return The JTA specific TransactionCoordinatorBuilder
- */
- public TransactionCoordinatorJtaBuilder forJta() {
- return new JtaTransactionCoordinatorBuilderImpl();
- }
-
-}
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorJtaBuilder.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorJtaBuilder.java
deleted file mode 100644
index 7e35236df1..0000000000
--- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorJtaBuilder.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2013, Red Hat Inc. or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Inc.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- */
-package org.hibernate.resource.transaction;
-
-import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform;
-
-/**
- * A builder of TransactionCoordinator instances intended for use in JTA environments.
- *
- * @author Steve Ebersole
- */
-public interface TransactionCoordinatorJtaBuilder extends TransactionCoordinatorBuilder {
- /**
- * Specifies the JtaPlatform to use.
- *
- * @param jtaPlatform The JtaPlatform to use.
- *
- * @return {@code this}, for method chaining
- */
- public TransactionCoordinatorJtaBuilder setJtaPlatform(JtaPlatform jtaPlatform);
-
- /**
- * Should JTA transactions be automatically joined? Or should we wait for (JPA-style) explicit joining? The
- * default is to auto-join ({@code true}).
- *
- * @param autoJoinTransactions {@code true} (default) indicates that JTA transactions should be auto joined;
- * {@code false} indicated we should wait for an explicit join
- *
- * @return {@code this}, for method chaining
- */
- public TransactionCoordinatorJtaBuilder setAutoJoinTransactions(boolean autoJoinTransactions);
-
- /**
- * Should we prefer to use UserTransactions (over TransactionManager) for managing transactions (mainly for calling
- * begin, commit, rollback)? We will try both, this controls which to check first. The default is to prefer
- * accessing the TransactionManager
- *
- * @param preferUserTransactions {@code true} indicates to look for UserTransactions first; {@code false} (the
- * default) indicates to looks for the TransactionManager first,
- *
- * @return {@code this}, for method chaining
- */
- public TransactionCoordinatorJtaBuilder setPreferUserTransactions(boolean preferUserTransactions);
-
- /**
- * Should we track threads in order to protect against the JTA system calling us from a different thread? This
- * might often be the case for JTA systems which implement timeout rollbacks from separate "reaper" threads. The
- * default is to track threads.
- *
- * @param performJtaThreadTracking {@code true} (the default) indicates that the thread should be tracked;
- * {@code false} indicates it should not.
- *
- * @return {@code this}, for method chaining
- */
- public TransactionCoordinatorJtaBuilder setPerformJtaThreadTracking(boolean performJtaThreadTracking);
-}
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorResourceLocalBuilder.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorResourceLocalBuilder.java
deleted file mode 100644
index 7d84711bed..0000000000
--- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/TransactionCoordinatorResourceLocalBuilder.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2013, Red Hat Inc. or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Inc.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- */
-package org.hibernate.resource.transaction;
-
-import org.hibernate.resource.transaction.backend.store.spi.DataStoreTransactionAccess;
-
-/**
- * A builder of TransactionCoordinator instances intended for use in resource-local mode (non-JTA transactions local
- * to the underlying data store).
- *
- * NOTE : Ideally I'd love to specialize the {@link #buildTransactionCoordinator(org.hibernate.resource.transaction.spi.TransactionCoordinatorOwner)}
- * method here to only accept TransactionCoordinatorOwner arguments that are specifically
- * {@link org.hibernate.resource.transaction.backend.store.spi.DataStoreTransactionAccess} instances. Not sure how to
- * best achieve that. For now we just cast and let the exception happen, but directing the user via the contract
- * would be MUCH preferable.
- *
- * @author Steve Ebersole
- */
-public interface TransactionCoordinatorResourceLocalBuilder extends TransactionCoordinatorBuilder {
- /**
- * Provides the TransactionCoordinator we are building with access to the ResourceLocalTransaction used to control
- * transactions.
- *
- * An alternative is for the owner passed to {@link #buildTransactionCoordinator} to implement the
- * ResourceLocalTransactionAccess contract.
- *
- * @param dataStoreTransactionAccess Access
- */
- public void setResourceLocalTransactionAccess(DataStoreTransactionAccess dataStoreTransactionAccess);
-}
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/store/internal/JdbcIsolationDelegate.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcIsolationDelegate.java
similarity index 98%
rename from hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/store/internal/JdbcIsolationDelegate.java
rename to hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcIsolationDelegate.java
index 11d1830cb0..3439b2476b 100644
--- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/store/internal/JdbcIsolationDelegate.java
+++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcIsolationDelegate.java
@@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
-package org.hibernate.resource.transaction.backend.store.internal;
+package org.hibernate.resource.transaction.backend.jdbc.internal;
import java.sql.Connection;
import java.sql.SQLException;
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/store/internal/ResourceLocalTransactionCoordinatorBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorBuilderImpl.java
similarity index 63%
rename from hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/store/internal/ResourceLocalTransactionCoordinatorBuilderImpl.java
rename to hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorBuilderImpl.java
index 506a5700a6..d4ab68dfd0 100644
--- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/store/internal/ResourceLocalTransactionCoordinatorBuilderImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorBuilderImpl.java
@@ -21,40 +21,33 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
-package org.hibernate.resource.transaction.backend.store.internal;
+package org.hibernate.resource.transaction.backend.jdbc.internal;
+import org.hibernate.ConnectionAcquisitionMode;
import org.hibernate.ConnectionReleaseMode;
import org.hibernate.HibernateException;
-import org.hibernate.resource.jdbc.spi.JdbcSessionContext;
import org.hibernate.resource.transaction.TransactionCoordinator;
-import org.hibernate.resource.transaction.backend.store.spi.DataStoreTransactionAccess;
+import org.hibernate.resource.transaction.TransactionCoordinatorBuilder;
+import org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransactionAccess;
import org.hibernate.resource.transaction.spi.TransactionCoordinatorOwner;
-import org.hibernate.resource.transaction.TransactionCoordinatorResourceLocalBuilder;
-
-import static org.hibernate.resource.jdbc.spi.JdbcSessionContext.ConnectionAcquisitionMode;
/**
* Concrete builder for resource-local TransactionCoordinator instances.
*
* @author Steve Ebersole
*/
-public class ResourceLocalTransactionCoordinatorBuilderImpl implements TransactionCoordinatorResourceLocalBuilder {
- private DataStoreTransactionAccess providedDataStoreTransactionAccess;
+public class JdbcResourceLocalTransactionCoordinatorBuilderImpl implements TransactionCoordinatorBuilder {
+ public static final String SHORT_NAME = "jdbc";
+
+ /**
+ * Singleton access
+ */
+ public static final JdbcResourceLocalTransactionCoordinatorBuilderImpl INSTANCE = new JdbcResourceLocalTransactionCoordinatorBuilderImpl();
@Override
- public void setResourceLocalTransactionAccess(DataStoreTransactionAccess dataStoreTransactionAccess) {
- this.providedDataStoreTransactionAccess = dataStoreTransactionAccess;
- }
-
- @Override
- public TransactionCoordinator buildTransactionCoordinator(TransactionCoordinatorOwner owner) {
- if ( providedDataStoreTransactionAccess != null ) {
- return new ResourceLocalTransactionCoordinatorImpl( this, owner, providedDataStoreTransactionAccess );
- }
- else {
- if ( owner instanceof DataStoreTransactionAccess ) {
- return new ResourceLocalTransactionCoordinatorImpl( this, owner, (DataStoreTransactionAccess) owner );
- }
+ public TransactionCoordinator buildTransactionCoordinator(TransactionCoordinatorOwner owner, TransactionCoordinatorOptions options) {
+ if ( owner instanceof JdbcResourceTransactionAccess ) {
+ return new JdbcResourceLocalTransactionCoordinatorImpl( this, owner, (JdbcResourceTransactionAccess) owner );
}
throw new HibernateException(
@@ -74,6 +67,6 @@ public ConnectionReleaseMode getDefaultConnectionReleaseMode() {
@Override
public ConnectionAcquisitionMode getDefaultConnectionAcquisitionMode() {
- return null;
+ return ConnectionAcquisitionMode.DEFAULT;
}
}
diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/store/internal/ResourceLocalTransactionCoordinatorImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java
similarity index 81%
rename from hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/store/internal/ResourceLocalTransactionCoordinatorImpl.java
rename to hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java
index 7d873e004b..25735540ce 100644
--- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/store/internal/ResourceLocalTransactionCoordinatorImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java
@@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
-package org.hibernate.resource.transaction.backend.store.internal;
+package org.hibernate.resource.transaction.backend.jdbc.internal;
import javax.transaction.Status;
@@ -36,8 +36,8 @@
import org.hibernate.resource.transaction.SynchronizationRegistry;
import org.hibernate.resource.transaction.TransactionCoordinator;
import org.hibernate.resource.transaction.TransactionCoordinatorBuilder;
-import org.hibernate.resource.transaction.backend.store.spi.DataStoreTransaction;
-import org.hibernate.resource.transaction.backend.store.spi.DataStoreTransactionAccess;
+import org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransaction;
+import org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransactionAccess;
import org.hibernate.resource.transaction.internal.SynchronizationRegistryStandardImpl;
import org.hibernate.resource.transaction.spi.TransactionCoordinatorOwner;
import org.hibernate.resource.transaction.spi.TransactionStatus;
@@ -45,17 +45,18 @@
import static org.hibernate.internal.CoreLogging.messageLogger;
/**
- * An implementation of TransactionCoordinator based on managing a transaction through the data-store
- * specific ResourceLocalTransaction.
+ * An implementation of TransactionCoordinator based on managing a transaction through the JDBC Connection
+ * via {@link org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransaction}
*
* @author Steve Ebersole
- * @see org.hibernate.resource.transaction.backend.store.spi.DataStoreTransaction
+ *
+ * @see org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransaction
*/
-public class ResourceLocalTransactionCoordinatorImpl implements TransactionCoordinator {
- private static final CoreMessageLogger log = messageLogger( ResourceLocalTransactionCoordinatorImpl.class );
+public class JdbcResourceLocalTransactionCoordinatorImpl implements TransactionCoordinator {
+ private static final CoreMessageLogger log = messageLogger( JdbcResourceLocalTransactionCoordinatorImpl.class );
private final TransactionCoordinatorBuilder transactionCoordinatorBuilder;
- private final DataStoreTransactionAccess dataStoreTransactionAccess;
+ private final JdbcResourceTransactionAccess jdbcResourceTransactionAccess;
private final TransactionCoordinatorOwner transactionCoordinatorOwner;
private final SynchronizationRegistryStandardImpl synchronizationRegistry = new SynchronizationRegistryStandardImpl();
@@ -71,13 +72,13 @@ public class ResourceLocalTransactionCoordinatorImpl implements TransactionCoord
*
* @param owner The transactionCoordinatorOwner
*/
- ResourceLocalTransactionCoordinatorImpl(
+ JdbcResourceLocalTransactionCoordinatorImpl(
TransactionCoordinatorBuilder transactionCoordinatorBuilder,
TransactionCoordinatorOwner owner,
- DataStoreTransactionAccess dataStoreTransactionAccess) {
+ JdbcResourceTransactionAccess jdbcResourceTransactionAccess) {
this.observers = new ArrayList