Consistent JPA/Hibernate transaction interoperability

Closes gh-37273
This commit is contained in:
Juergen Hoeller
2026-09-14 15:54:43 +02:00
parent 4898ed3ad8
commit 8a511726cd
5 changed files with 94 additions and 6 deletions
@@ -32,7 +32,10 @@ import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.orm.jpa.AbstractContainerEntityManagerFactoryIntegrationTests;
import org.springframework.orm.jpa.EntityManagerFactoryInfo;
import org.springframework.orm.jpa.EntityManagerHolder;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.domain.Person;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionTemplate;
import static org.assertj.core.api.Assertions.assertThat;
@@ -150,6 +153,61 @@ class HibernateNativeEntityManagerFactoryIntegrationTests extends AbstractContai
});
}
@Test
void withJpaTransactionManager() {
String firstName = "Tony";
insertPerson(firstName);
Query<Person> q = statelessSession.createQuery("select p from Person as p", Person.class);
assertThat(q.getResultList()).hasSize(1);
assertThat(q.getResultList().get(0).getFirstName()).isEqualTo(firstName);
endTransaction();
JpaTransactionManager dstm = new JpaTransactionManager(sessionFactory);
new TransactionTemplate(dstm).execute(status -> {
insertPerson(firstName);
Query<Person> q2 = statelessSession.createQuery("select p from Person as p", Person.class);
assertThat(q2.getResultList()).hasSize(1);
assertThat(q2.getResultList().get(0).getFirstName()).isEqualTo(firstName);
Query<Person> q3 = sharedSession.createQuery("select p from Person as p", Person.class);
assertThat(q3.getResultList()).hasSize(1);
assertThat(q3.getResultList().get(0).getFirstName()).isEqualTo(firstName);
status.setRollbackOnly();
return null;
});
}
@Test
void withPreBoundEntityManager() {
String firstName = "Tony";
insertPerson(firstName);
Query<Person> q = statelessSession.createQuery("select p from Person as p", Person.class);
assertThat(q.getResultList()).hasSize(1);
assertThat(q.getResultList().get(0).getFirstName()).isEqualTo(firstName);
endTransaction();
Session session = sessionFactory.openSession();
TransactionSynchronizationManager.bindResource(sessionFactory, new EntityManagerHolder(session));
startNewTransaction();
insertPerson(firstName);
Query<Person> q2 = statelessSession.createQuery("select p from Person as p", Person.class);
assertThat(q2.getResultList()).hasSize(1);
assertThat(q2.getResultList().get(0).getFirstName()).isEqualTo(firstName);
Query<Person> q3 = sharedSession.createQuery("select p from Person as p", Person.class);
assertThat(q3.getResultList()).hasSize(1);
assertThat(q3.getResultList().get(0).getFirstName()).isEqualTo(firstName);
endTransaction();
session.close();
TransactionSynchronizationManager.unbindResource(sessionFactory);
}
@Test // SPR-16956
void readOnly() {
assertThat(sessionFactory.getCurrentSession().getHibernateFlushMode()).isSameAs(FlushMode.AUTO);