Browse Source

Consistent support for JPA 3.2 transaction timeout

Closes gh-35663
pull/35665/head
Juergen Hoeller 2 months ago
parent
commit
c063249bd4
  1. 5
      spring-orm/src/main/java/org/springframework/orm/jpa/DefaultJpaDialect.java
  2. 4
      spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java
  3. 11
      spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java

5
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) public @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
throws PersistenceException, SQLException, TransactionException { throws PersistenceException, SQLException, TransactionException {
if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) {
entityManager.getTransaction().setTimeout(definition.getTimeout());
}
if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) { if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
throw new InvalidIsolationLevelException(getClass().getSimpleName() + throw new InvalidIsolationLevelException(getClass().getSimpleName() +
" does not support custom isolation levels due to limitations in standard JPA. " + " does not support custom isolation levels due to limitations in standard JPA. " +
"Specific arrangements may be implemented in custom JpaDialect variants."); "Specific arrangements may be implemented in custom JpaDialect variants.");
} }
entityManager.getTransaction().begin(); entityManager.getTransaction().begin();
return null; return null;
} }

4
spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java vendored

@ -99,6 +99,10 @@ public class EclipseLinkJpaDialect extends DefaultJpaDialect {
public @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) public @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
throws PersistenceException, SQLException, TransactionException { throws PersistenceException, SQLException, TransactionException {
if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) {
entityManager.getTransaction().setTimeout(definition.getTimeout());
}
int currentIsolationLevel = definition.getIsolationLevel(); int currentIsolationLevel = definition.getIsolationLevel();
if (currentIsolationLevel != TransactionDefinition.ISOLATION_DEFAULT) { if (currentIsolationLevel != TransactionDefinition.ISOLATION_DEFAULT) {
// Pass custom isolation level on to EclipseLink's DatabaseLogin configuration. // Pass custom isolation level on to EclipseLink's DatabaseLogin configuration.

11
spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java

@ -581,11 +581,20 @@ class JpaTransactionManagerTests {
tt.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE); tt.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
assertThatExceptionOfType(InvalidIsolationLevelException.class).isThrownBy(() -> assertThatExceptionOfType(InvalidIsolationLevelException.class).isThrownBy(() ->
tt.executeWithoutResult(status -> {})); tt.executeWithoutResult(status -> {}));
verify(manager).close(); verify(manager).close();
} }
@Test
void testTransactionTimeout() {
tt.setTimeout(1000);
tt.executeWithoutResult(status -> {});
verify(tx).setTimeout(1000);
verify(manager).close();
}
@Test @Test
void testTransactionFlush() { void testTransactionFlush() {
assertThat(TransactionSynchronizationManager.hasResource(factory)).isFalse(); assertThat(TransactionSynchronizationManager.hasResource(factory)).isFalse();

Loading…
Cancel
Save