Propagate read-only status through setDefaultReadOnly(true) for JPA

This involves a new ResourceTransactionDefinition variant that JpaTransactionManager indicates a transaction-local EntityManager on. HibernateJpaDialect uses this indicator for hard read-only behavior.

Issue: SPR-16956
This commit is contained in:
Juergen Hoeller
2018-07-05 13:53:35 +02:00
parent 83faee67d5
commit 010ba33d03
6 changed files with 107 additions and 7 deletions

View File

@@ -60,7 +60,7 @@ public abstract class AbstractEntityManagerFactoryIntegrationTests {
protected PlatformTransactionManager transactionManager;
protected TransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
protected DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
protected TransactionStatus transactionStatus;

View File

@@ -18,6 +18,7 @@ package org.springframework.orm.jpa.hibernate;
import javax.persistence.EntityManager;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
@@ -70,4 +71,16 @@ public class HibernateEntityManagerFactoryIntegrationTests extends AbstractConta
assertSame(em.getDelegate(), proxy.getDelegate());
}
@Test // SPR-16956
public void testReadOnly() {
assertSame(FlushMode.AUTO, sharedEntityManager.unwrap(Session.class).getHibernateFlushMode());
assertFalse(sharedEntityManager.unwrap(Session.class).isDefaultReadOnly());
endTransaction();
this.transactionDefinition.setReadOnly(true);
startNewTransaction();
assertSame(FlushMode.MANUAL, sharedEntityManager.unwrap(Session.class).getHibernateFlushMode());
assertTrue(sharedEntityManager.unwrap(Session.class).isDefaultReadOnly());
}
}

View File

@@ -18,6 +18,7 @@ package org.springframework.orm.jpa.hibernate;
import java.util.List;
import org.hibernate.FlushMode;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.junit.Test;
@@ -82,4 +83,16 @@ public class HibernateNativeEntityManagerFactoryIntegrationTests extends Abstrac
assertSame(applicationContext, people.get(0).postLoaded);
}
@Test // SPR-16956
public void testReadOnly() {
assertSame(FlushMode.AUTO, sessionFactory.getCurrentSession().getHibernateFlushMode());
assertFalse(sessionFactory.getCurrentSession().isDefaultReadOnly());
endTransaction();
this.transactionDefinition.setReadOnly(true);
startNewTransaction();
assertSame(FlushMode.MANUAL, sessionFactory.getCurrentSession().getHibernateFlushMode());
assertTrue(sessionFactory.getCurrentSession().isDefaultReadOnly());
}
}