提交 bd5383e4 编写于 作者: J Juergen Hoeller

OpenJpaDialect passes custom isolation level on to OpenJPA's JDBCFetchPlan configuration

Issue: SPR-12319
上级 8cce4046
...@@ -22,8 +22,11 @@ import javax.persistence.EntityManager; ...@@ -22,8 +22,11 @@ import javax.persistence.EntityManager;
import javax.persistence.PersistenceException; import javax.persistence.PersistenceException;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.openjpa.persistence.FetchPlan;
import org.apache.openjpa.persistence.OpenJPAEntityManager; import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAPersistence; 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.ConnectionHandle;
import org.springframework.jdbc.datasource.ConnectionHolder; import org.springframework.jdbc.datasource.ConnectionHolder;
...@@ -37,8 +40,8 @@ import org.springframework.transaction.TransactionException; ...@@ -37,8 +40,8 @@ import org.springframework.transaction.TransactionException;
* {@link org.springframework.orm.jpa.JpaDialect} implementation for Apache OpenJPA. * {@link org.springframework.orm.jpa.JpaDialect} implementation for Apache OpenJPA.
* Developed and tested against OpenJPA 2.2. * Developed and tested against OpenJPA 2.2.
* *
* @author Costin Leau
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Costin Leau
* @since 2.0 * @since 2.0
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
...@@ -48,14 +51,27 @@ public class OpenJpaDialect extends DefaultJpaDialect { ...@@ -48,14 +51,27 @@ public class OpenJpaDialect extends DefaultJpaDialect {
public Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) public Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
throws PersistenceException, SQLException, TransactionException { throws PersistenceException, SQLException, TransactionException {
super.beginTransaction(entityManager, definition); OpenJPAEntityManager openJpaEntityManager = getOpenJPAEntityManager(entityManager);
OpenJPAEntityManager em = 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()) { if (!definition.isReadOnly()) {
// Like with EclipseLink, make sure to start the logic transaction early so that other // 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. // 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 @Override
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册