diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/DefaultJpaDialect.java b/spring-orm/src/main/java/org/springframework/orm/jpa/DefaultJpaDialect.java index 928498691a5..94126be6c39 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/DefaultJpaDialect.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/DefaultJpaDialect.java @@ -59,11 +59,16 @@ public class DefaultJpaDialect implements JpaDialect, Serializable { public @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) throws PersistenceException, SQLException, TransactionException { + if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) { + entityManager.getTransaction().setTimeout(definition.getTimeout()); + } + if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) { throw new InvalidIsolationLevelException(getClass().getSimpleName() + " does not support custom isolation levels due to limitations in standard JPA. " + "Specific arrangements may be implemented in custom JpaDialect variants."); } + entityManager.getTransaction().begin(); return null; } diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java index 486797111be..4ae018541db 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java @@ -99,6 +99,10 @@ public class EclipseLinkJpaDialect extends DefaultJpaDialect { public @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) throws PersistenceException, SQLException, TransactionException { + if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) { + entityManager.getTransaction().setTimeout(definition.getTimeout()); + } + int currentIsolationLevel = definition.getIsolationLevel(); if (currentIsolationLevel != TransactionDefinition.ISOLATION_DEFAULT) { // Pass custom isolation level on to EclipseLink's DatabaseLogin configuration. diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java index 857d89f6a00..604d0f8c8bf 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java @@ -581,11 +581,20 @@ class JpaTransactionManagerTests { tt.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE); assertThatExceptionOfType(InvalidIsolationLevelException.class).isThrownBy(() -> - tt.executeWithoutResult(status -> {})); + tt.executeWithoutResult(status -> {})); verify(manager).close(); } + @Test + void testTransactionTimeout() { + tt.setTimeout(1000); + tt.executeWithoutResult(status -> {}); + + verify(tx).setTimeout(1000); + verify(manager).close(); + } + @Test void testTransactionFlush() { assertThat(TransactionSynchronizationManager.hasResource(factory)).isFalse();