Fixes #1069: let JpaEntityManager(Factory) extend AutoCloseable (#1077)
Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/basic/TestSessionCustomizer.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/basic/TestSessionCustomizer.java
index f1ed695..9831f42 100644
--- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/basic/TestSessionCustomizer.java
+++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/basic/TestSessionCustomizer.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015 IBM Corporation. All rights reserved.
*
* This program and the accompanying materials are made available under the
@@ -19,12 +19,12 @@
import java.util.HashMap;
import java.util.Map;
-import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.PersistenceException;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.config.SessionCustomizer;
+import org.eclipse.persistence.jpa.JpaEntityManagerFactory;
import org.eclipse.persistence.jpa.test.framework.EmfRunner;
import org.eclipse.persistence.sessions.Session;
import org.junit.Assert;
@@ -46,12 +46,9 @@
@Test
public void stringCustomizerInvoked() {
props.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, Customizer.class.getName());
- EntityManagerFactory emf = Persistence.createEntityManagerFactory(PU_NAME, props);
- try {
+ try (JpaEntityManagerFactory emf = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory(PU_NAME, props)) {
emf.createEntityManager();
Assert.assertTrue(Customizer.staticCustomized);
- } finally {
- emf.close();
}
}
@@ -59,12 +56,9 @@
public void customizerInvoked() {
Customizer customizerInstance = new Customizer();
props.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, customizerInstance);
- EntityManagerFactory emf = Persistence.createEntityManagerFactory(PU_NAME, props);
- try {
+ try (JpaEntityManagerFactory emf = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory(PU_NAME, props)) {
emf.createEntityManager();
Assert.assertTrue(customizerInstance.customized);
- } finally {
- emf.close();
}
}
@@ -72,16 +66,11 @@
public void invalidInstance() {
props.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, new Object());
- EntityManagerFactory emf = Persistence.createEntityManagerFactory(PU_NAME, props);
- try {
+ try (JpaEntityManagerFactory emf = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory(PU_NAME, props)) {
emf.createEntityManager();
Assert.fail();
} catch (PersistenceException e) {
Assert.assertTrue(e.toString(), e.getCause() instanceof ClassCastException);
- } finally {
- if (emf != null) {
- emf.close();
- }
}
}
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java
index 530ca30..7f3bf16 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2019 IBM Corporation. All rights reserved.
*
* This program and the accompanying materials are made available under the
@@ -528,6 +528,7 @@
tests.add("testInheritanceFetchJoinSecondCall");
}
tests.add("testDetachChildObjects");
+ tests.add("testAutoCloseable");
Collections.sort(tests);
@@ -4955,11 +4956,8 @@
if (isOnServer()) {
return;
}
- EntityManagerFactory factory = null;
- try {
- factory = Persistence.createEntityManagerFactory("broken-PU", JUnitTestCaseHelper.getDatabaseProperties());
- EntityManager em = factory.createEntityManager();
- em.close();
+ try (JpaEntityManagerFactory factory = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory("broken-PU", JUnitTestCaseHelper.getDatabaseProperties());
+ JpaEntityManager em = (JpaEntityManager) factory.createEntityManager()) {
} catch (jakarta.persistence.PersistenceException e) {
ArrayList expectedExceptions = new ArrayList();
expectedExceptions.add(48);
@@ -4972,8 +4970,6 @@
if (expectedExceptions.size() > 0){
fail("Not all expected exceptions were caught");
}
- } finally {
- factory.close();
}
}
@@ -13174,8 +13170,25 @@
}
rollbackTransaction(em);
closeEntityManager(em);
-
}
+
+ public void testAutoCloseable() {
+ EntityManagerFactory emfOuter = null;
+ EntityManager emOuter = null;
+ try (JpaEntityManagerFactory emf = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory(getPersistenceUnitName(), JUnitTestCaseHelper.getDatabaseProperties());
+ JpaEntityManager em = (JpaEntityManager) emf.createEntityManager()) {
+ emfOuter = emf;
+ emOuter = em;
+ assertNotNull(emf);
+ assertNotNull(em);
+ assertTrue(emOuter.isOpen());
+ assertTrue(emfOuter.isOpen());
+ } finally {
+ assertFalse(emOuter.isOpen());
+ assertFalse(emfOuter.isOpen());
+ }
+ }
+
private void InitTestDetachChildObjects(EntityManager em) {
// test data - manual creation
try {
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java
index c006805..f4a54f2 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2019 IBM Corporation. All rights reserved.
*
* This program and the accompanying materials are made available under the
@@ -4640,11 +4640,8 @@
if (isOnServer()) {
return;
}
- EntityManagerFactory factory = null;
- try {
- factory = Persistence.createEntityManagerFactory("broken-PU", JUnitTestCaseHelper.getDatabaseProperties());
- EntityManager em = factory.createEntityManager();
- em.close();
+ try (JpaEntityManagerFactory factory = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory("broken-PU", JUnitTestCaseHelper.getDatabaseProperties());
+ JpaEntityManager em = (JpaEntityManager) factory.createEntityManager()) {
} catch (jakarta.persistence.PersistenceException e) {
ArrayList expectedExceptions = new ArrayList();
expectedExceptions.add(48);
@@ -4657,8 +4654,6 @@
if (expectedExceptions.size() > 0){
fail("Not all expected exceptions were caught");
}
- } finally {
- factory.close();
}
}
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManager.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManager.java
index 7887e32..37ab3ab 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManager.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
@@ -36,7 +36,7 @@
* @author Gordon Yorke
*/
-public interface JpaEntityManager extends jakarta.persistence.EntityManager {
+public interface JpaEntityManager extends jakarta.persistence.EntityManager, AutoCloseable {
/**
* This method returns the current session to the requester. The current session
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java
index a20f782..67a73c7 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,6 +16,7 @@
// - 494610: Session Properties map should be Map<String, Object>
package org.eclipse.persistence.jpa;
+import jakarta.persistence.EntityManagerFactory;
import java.util.Map;
import org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate;
@@ -29,7 +30,7 @@
* </p>
* @see jakarta.persistence.EntityManagerFactory
*/
-public interface JpaEntityManagerFactory {
+public interface JpaEntityManagerFactory extends EntityManagerFactory, AutoCloseable {
/**
* Returns the DatabaseSession that the Factory will be using and