From bd5383e4f937549107c2dc9098298ca9e874a419 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 16 Oct 2014 17:24:58 +0200 Subject: [PATCH] OpenJpaDialect passes custom isolation level on to OpenJPA's JDBCFetchPlan configuration Issue: SPR-12319 --- .../orm/jpa/vendor/OpenJpaDialect.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaDialect.java b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaDialect.java index f19b7ec8f9..9f19422e68 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaDialect.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaDialect.java @@ -22,8 +22,11 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceException; import org.apache.commons.logging.LogFactory; +import org.apache.openjpa.persistence.FetchPlan; import org.apache.openjpa.persistence.OpenJPAEntityManager; import org.apache.openjpa.persistence.OpenJPAPersistence; +import org.apache.openjpa.persistence.jdbc.IsolationLevel; +import org.apache.openjpa.persistence.jdbc.JDBCFetchPlan; import org.springframework.jdbc.datasource.ConnectionHandle; import org.springframework.jdbc.datasource.ConnectionHolder; @@ -37,8 +40,8 @@ import org.springframework.transaction.TransactionException; * {@link org.springframework.orm.jpa.JpaDialect} implementation for Apache OpenJPA. * Developed and tested against OpenJPA 2.2. * - * @author Costin Leau * @author Juergen Hoeller + * @author Costin Leau * @since 2.0 */ @SuppressWarnings("serial") @@ -48,14 +51,27 @@ public class OpenJpaDialect extends DefaultJpaDialect { public Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) throws PersistenceException, SQLException, TransactionException { - super.beginTransaction(entityManager, definition); - OpenJPAEntityManager em = getOpenJPAEntityManager(entityManager); + OpenJPAEntityManager openJpaEntityManager = getOpenJPAEntityManager(entityManager); + + if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) { + // Pass custom isolation level on to OpenJPA's JDBCFetchPlan configuration + FetchPlan fetchPlan = openJpaEntityManager.getFetchPlan(); + if (fetchPlan instanceof JDBCFetchPlan) { + IsolationLevel isolation = IsolationLevel.fromConnectionConstant(definition.getIsolationLevel()); + ((JDBCFetchPlan) fetchPlan).setIsolation(isolation); + } + } + + entityManager.getTransaction().begin(); + if (!definition.isReadOnly()) { // Like with EclipseLink, make sure to start the logic transaction early so that other // participants using the connection (such as JdbcTemplate) run in a transaction. - em.beginStore(); + openJpaEntityManager.beginStore(); } - return new OpenJpaTransactionData(em); + + // Custom implementation for OpenJPA savepoint handling + return new OpenJpaTransactionData(openJpaEntityManager); } @Override -- GitLab