Skip to content

Commit bd5383e

Browse files
committed
OpenJpaDialect passes custom isolation level on to OpenJPA's JDBCFetchPlan configuration
Issue: SPR-12319
1 parent 8cce404 commit bd5383e

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

spring-orm/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaDialect.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222
import javax.persistence.PersistenceException;
2323

2424
import org.apache.commons.logging.LogFactory;
25+
import org.apache.openjpa.persistence.FetchPlan;
2526
import org.apache.openjpa.persistence.OpenJPAEntityManager;
2627
import org.apache.openjpa.persistence.OpenJPAPersistence;
28+
import org.apache.openjpa.persistence.jdbc.IsolationLevel;
29+
import org.apache.openjpa.persistence.jdbc.JDBCFetchPlan;
2730

2831
import org.springframework.jdbc.datasource.ConnectionHandle;
2932
import org.springframework.jdbc.datasource.ConnectionHolder;
@@ -37,8 +40,8 @@
3740
* {@link org.springframework.orm.jpa.JpaDialect} implementation for Apache OpenJPA.
3841
* Developed and tested against OpenJPA 2.2.
3942
*
40-
* @author Costin Leau
4143
* @author Juergen Hoeller
44+
* @author Costin Leau
4245
* @since 2.0
4346
*/
4447
@SuppressWarnings("serial")
@@ -48,14 +51,27 @@ public class OpenJpaDialect extends DefaultJpaDialect {
4851
public Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
4952
throws PersistenceException, SQLException, TransactionException {
5053

51-
super.beginTransaction(entityManager, definition);
52-
OpenJPAEntityManager em = getOpenJPAEntityManager(entityManager);
54+
OpenJPAEntityManager openJpaEntityManager = getOpenJPAEntityManager(entityManager);
55+
56+
if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
57+
// Pass custom isolation level on to OpenJPA's JDBCFetchPlan configuration
58+
FetchPlan fetchPlan = openJpaEntityManager.getFetchPlan();
59+
if (fetchPlan instanceof JDBCFetchPlan) {
60+
IsolationLevel isolation = IsolationLevel.fromConnectionConstant(definition.getIsolationLevel());
61+
((JDBCFetchPlan) fetchPlan).setIsolation(isolation);
62+
}
63+
}
64+
65+
entityManager.getTransaction().begin();
66+
5367
if (!definition.isReadOnly()) {
5468
// Like with EclipseLink, make sure to start the logic transaction early so that other
5569
// participants using the connection (such as JdbcTemplate) run in a transaction.
56-
em.beginStore();
70+
openJpaEntityManager.beginStore();
5771
}
58-
return new OpenJpaTransactionData(em);
72+
73+
// Custom implementation for OpenJPA savepoint handling
74+
return new OpenJpaTransactionData(openJpaEntityManager);
5975
}
6076

6177
@Override

0 commit comments

Comments
 (0)