Early support for JPA 4.0 EntityAgent (autowiring a shared proxy)

Includes skipping of isOpen check on close where easily possible.

Closes gh-36025
This commit is contained in:
Juergen Hoeller
2026-02-05 20:01:26 +01:00
parent d1b0bdb3d5
commit cdbaa7f3a7
10 changed files with 403 additions and 98 deletions
@@ -108,7 +108,6 @@ class SharedEntityManagerCreatorTests {
Query targetQuery = mock();
given(emf.createEntityManager()).willReturn(targetEm);
given(targetEm.createQuery("x")).willReturn(targetQuery);
given(targetEm.isOpen()).willReturn(true);
given((Query) targetQuery.unwrap(targetQuery.getClass())).willReturn(targetQuery);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
@@ -129,7 +128,6 @@ class SharedEntityManagerCreatorTests {
Query targetQuery = mock();
given(emf.createEntityManager()).willReturn(targetEm);
given(targetEm.createQuery("x")).willReturn(targetQuery);
given(targetEm.isOpen()).willReturn(true);
given((Query) targetQuery.unwrap(targetQuery.getClass())).willReturn(targetQuery);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
@@ -150,7 +148,6 @@ class SharedEntityManagerCreatorTests {
Query targetQuery = mock();
given(emf.createEntityManager()).willReturn(targetEm);
given(targetEm.createQuery("x")).willReturn(targetQuery);
given(targetEm.isOpen()).willReturn(true);
given((Query) targetQuery.unwrap(targetQuery.getClass())).willReturn(targetQuery);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
@@ -171,7 +168,6 @@ class SharedEntityManagerCreatorTests {
Query targetQuery = mock();
given(emf.createEntityManager()).willReturn(targetEm);
given(targetEm.createQuery("x")).willReturn(targetQuery);
given(targetEm.isOpen()).willReturn(true);
given((Query) targetQuery.unwrap(targetQuery.getClass())).willReturn(targetQuery);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
@@ -194,7 +190,6 @@ class SharedEntityManagerCreatorTests {
given(targetEm.createStoredProcedureQuery("x")).willReturn(targetQuery);
willReturn("y").given(targetQuery).getOutputParameterValue(0);
willReturn("z").given(targetQuery).getOutputParameterValue(2);
given(targetEm.isOpen()).willReturn(true);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
StoredProcedureQuery spq = em.createStoredProcedureQuery("x");
@@ -225,7 +220,6 @@ class SharedEntityManagerCreatorTests {
given(targetEm.createStoredProcedureQuery("x")).willReturn(targetQuery);
willReturn("y").given(targetQuery).getOutputParameterValue("a");
willReturn("z").given(targetQuery).getOutputParameterValue("c");
given(targetEm.isOpen()).willReturn(true);
EntityManager em = SharedEntityManagerCreator.createSharedEntityManager(emf);
StoredProcedureQuery spq = em.createStoredProcedureQuery("x");
@@ -59,7 +59,6 @@ class PersistenceContextTransactionTests {
void setup() {
given(factory.createEntityManager()).willReturn(manager);
given(manager.getTransaction()).willReturn(tx);
given(manager.isOpen()).willReturn(true);
@SuppressWarnings("serial")
PersistenceAnnotationBeanPostProcessor pabpp = new PersistenceAnnotationBeanPostProcessor() {
@@ -99,8 +98,6 @@ class PersistenceContextTransactionTests {
@Test
void testTransactionCommitWithSharedEntityManagerAndPropagationSupports() {
given(manager.isOpen()).willReturn(true);
tt.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);
tt.execute(status -> {
@@ -42,7 +42,6 @@ class SharedEntityManagerFactoryTests {
Object o = new Object();
EntityManager mockEm = mock();
given(mockEm.isOpen()).willReturn(true);
EntityManagerFactory mockEmf = mock();
given(mockEmf.createEntityManager()).willReturn(mockEm);
@@ -58,8 +57,7 @@ class SharedEntityManagerFactoryTests {
assertThat(proxyFactoryBean.getObject()).isSameAs(proxy);
assertThat(proxy.contains(o)).isFalse();
boolean condition = proxy instanceof EntityManagerProxy;
assertThat(condition).isTrue();
assertThat(proxy).isInstanceOf(EntityManagerProxy.class);
EntityManagerProxy emProxy = (EntityManagerProxy) proxy;
assertThatIllegalStateException().as("outside of transaction").isThrownBy(
emProxy::getTargetEntityManager);