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 { @@ -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;
}

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

@ -99,6 +99,10 @@ public class EclipseLinkJpaDialect extends DefaultJpaDialect { @@ -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.

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

@ -581,11 +581,20 @@ class JpaTransactionManagerTests { @@ -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();

Loading…
Cancel
Save