diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/TransactionSettings.java b/hibernate-core/src/main/java/org/hibernate/cfg/TransactionSettings.java index 27b42a1b1d64..49b47158462d 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/TransactionSettings.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/TransactionSettings.java @@ -46,6 +46,8 @@ public interface TransactionSettings { *
If not specified, the {@linkplain #JTA_PLATFORM_RESOLVER JTA platform resolver}
+ * is used to obtain an instance of {@code JtaPlatform}.
*
* @see #JTA_PLATFORM_RESOLVER
*
@@ -58,6 +60,8 @@ public interface TransactionSettings {
* implementation that should be used to obtain an instance of
* {@link org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform}.
*
+ * @settingDefault {@link org.hibernate.engine.transaction.jta.platform.internal.StandardJtaPlatformResolver}
+ *
* @since 4.3
*/
String JTA_PLATFORM_RESOLVER = "hibernate.transaction.jta.platform_resolver";
diff --git a/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/JakartaStandardJtaPlatform.java b/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/JakartaStandardJtaPlatform.java
new file mode 100644
index 000000000000..2112b18eb5a3
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/JakartaStandardJtaPlatform.java
@@ -0,0 +1,121 @@
+/*
+ * SPDX-License-Identifier: Apache-2.0
+ * Copyright Red Hat Inc. and Hibernate Authors
+ */
+package org.hibernate.engine.transaction.jta.platform.internal;
+
+import jakarta.transaction.HeuristicMixedException;
+import jakarta.transaction.HeuristicRollbackException;
+import jakarta.transaction.NotSupportedException;
+import jakarta.transaction.RollbackException;
+import jakarta.transaction.SystemException;
+import jakarta.transaction.Transaction;
+import jakarta.transaction.TransactionManager;
+import jakarta.transaction.TransactionSynchronizationRegistry;
+import jakarta.transaction.UserTransaction;
+import org.hibernate.Incubating;
+import org.jboss.logging.Logger;
+
+import javax.transaction.xa.XAResource;
+
+/**
+ * A {@link org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform}
+ * that in principle is supposed to work in any Jakarta EE container. This
+ * implementation is crippled by the fact that it is unable to suspend and
+ * resume transactions.
+ * @since 4.0
+ * @author Gavin King
+ */
+@Incubating
+public class JakartaStandardJtaPlatform extends AbstractJtaPlatform
+ implements TransactionManager, Transaction {
+
+ public static final JakartaStandardJtaPlatform INSTANCE = new JakartaStandardJtaPlatform();
+ public static final String USER_TRANSACTION = "java:comp/UserTransaction";
+ public static final String TRANSACTION_SYNCHRONIZATION_REGISTRY =
+ "java:comp/TransactionSynchronizationRegistry";
+
+ private static final Logger LOG = Logger.getLogger( JakartaStandardJtaPlatform.class );
+
+ @Override
+ protected TransactionManager locateTransactionManager() {
+ return this;
+ }
+
+ @Override
+ protected UserTransaction locateUserTransaction() {
+ return (UserTransaction) jndiService().locate( USER_TRANSACTION );
+ }
+
+ @Override
+ protected JtaSynchronizationStrategy getSynchronizationStrategy() {
+ return new SynchronizationRegistryBasedSynchronizationStrategy(
+ this::getTransactionSynchronizationRegistry );
+ }
+
+ private TransactionSynchronizationRegistry getTransactionSynchronizationRegistry() {
+ return (TransactionSynchronizationRegistry)
+ jndiService().locate( TRANSACTION_SYNCHRONIZATION_REGISTRY );
+ }
+
+ @Override
+ public void begin() throws NotSupportedException, SystemException {
+ locateUserTransaction().begin();
+ }
+
+ @Override
+ public void commit()
+ throws RollbackException, HeuristicMixedException, HeuristicRollbackException,
+ SecurityException, IllegalStateException, SystemException {
+ locateUserTransaction().commit();
+ }
+
+ @Override
+ public void rollback() throws IllegalStateException, SecurityException, SystemException {
+ locateUserTransaction().rollback();
+ }
+
+ @Override
+ public void setRollbackOnly() throws IllegalStateException, SystemException {
+ locateUserTransaction().setRollbackOnly();
+ }
+
+ @Override
+ public int getStatus() throws SystemException {
+ return locateUserTransaction().getStatus();
+ }
+
+ @Override
+ public Transaction getTransaction() throws SystemException {
+ return this;
+ }
+
+ @Override
+ public void setTransactionTimeout(int seconds) throws SystemException {
+ locateUserTransaction().setTransactionTimeout( seconds );
+ }
+
+ @Override
+ public boolean delistResource(XAResource xaRes, int flag) {
+ throw new UnsupportedOperationException( "JakartaStandardJtaPlatform does not have access to the TransactionManager" );
+ }
+
+ @Override
+ public boolean enlistResource(XAResource xaRes) {
+ throw new UnsupportedOperationException( "JakartaStandardJtaPlatform does not have access to the TransactionManager" );
+ }
+
+ @Override
+ public Transaction suspend() throws SystemException {
+ LOG.debug( "Cannot really suspend (JakartaStandardJtaPlatform does not have access to the TransactionManager)" );
+ return this;
+// throw new UnsupportedOperationException( "JakartaStandardJtaPlatform does not have access to the TransactionManager" );
+ }
+
+ @Override
+ public void resume(Transaction tobj) {
+ LOG.debug( "Cannot really resume (JakartaStandardJtaPlatform does not have access to the TransactionManager)" );
+// throw new UnsupportedOperationException( "JakartaStandardJtaPlatform does not have access to the TransactionManager" );
+ }
+
+}
diff --git a/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/JtaPlatformResolverInitiator.java b/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/JtaPlatformResolverInitiator.java
index 0b27512fe3fd..f161006a50d0 100644
--- a/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/JtaPlatformResolverInitiator.java
+++ b/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/JtaPlatformResolverInitiator.java
@@ -8,7 +8,7 @@
import org.hibernate.boot.registry.StandardServiceInitiator;
import org.hibernate.boot.registry.selector.spi.StrategySelector;
-import org.hibernate.cfg.AvailableSettings;
+import org.hibernate.cfg.TransactionSettings;
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatformResolver;
import org.hibernate.service.spi.ServiceRegistryImplementor;
@@ -24,8 +24,8 @@ public class JtaPlatformResolverInitiator implements StandardServiceInitiator