Skip to content

Commit 76a3ad2

Browse files
committed
HHH-6936 EntityManagerImpl.close() and EntityManagerImpl.isOpen() should check if the session factory is closed
1 parent 5e3775a commit 76a3ad2

File tree

2 files changed

+35
-13
lines changed

2 files changed

+35
-13
lines changed

hibernate-entitymanager/src/main/java/org/hibernate/ejb/EntityManagerImpl.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,11 @@
2323
*/
2424
package org.hibernate.ejb;
2525

26+
import java.util.Map;
2627
import javax.persistence.PersistenceContextType;
2728
import javax.persistence.PersistenceException;
2829
import javax.persistence.spi.PersistenceUnitTransactionType;
2930
import javax.transaction.Synchronization;
30-
import java.util.Map;
31-
32-
import org.jboss.logging.Logger;
3331

3432
import org.hibernate.HibernateException;
3533
import org.hibernate.Interceptor;
@@ -39,6 +37,7 @@
3937
import org.hibernate.cfg.Environment;
4038
import org.hibernate.ejb.internal.EntityManagerMessageLogger;
4139
import org.hibernate.engine.spi.SessionImplementor;
40+
import org.jboss.logging.Logger;
4241

4342
/**
4443
* Hibernate implementation of {@link javax.persistence.EntityManager}.
@@ -127,6 +126,7 @@ protected Session getRawSession() {
127126
}
128127

129128
public void close() {
129+
checkEntityManagerFactory();
130130
if ( !open ) {
131131
throw new IllegalStateException( "EntityManager is closed" );
132132
}
@@ -157,6 +157,7 @@ public void afterCompletion( int i ) {
157157

158158
public boolean isOpen() {
159159
//adjustFlushMode(); //don't adjust, can't be done on closed EM
160+
checkEntityManagerFactory();
160161
try {
161162
if ( open ) {
162163
getSession().isOpen(); //to force enlistment in tx
@@ -169,4 +170,9 @@ public boolean isOpen() {
169170
}
170171
}
171172

173+
private void checkEntityManagerFactory() {
174+
if (! getEntityManagerFactory().isOpen()) {
175+
open = false;
176+
}
177+
}
172178
}

hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/EntityManagerTest.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,6 @@
2424
*/
2525
package org.hibernate.ejb.test;
2626

27-
import javax.persistence.EntityExistsException;
28-
import javax.persistence.EntityManager;
29-
import javax.persistence.EntityNotFoundException;
30-
import javax.persistence.FlushModeType;
31-
import javax.persistence.PersistenceException;
32-
import javax.persistence.Query;
3327
import java.io.ByteArrayInputStream;
3428
import java.io.ByteArrayOutputStream;
3529
import java.io.ObjectInputStream;
@@ -38,6 +32,12 @@
3832
import java.util.HashMap;
3933
import java.util.HashSet;
4034
import java.util.Map;
35+
import javax.persistence.EntityExistsException;
36+
import javax.persistence.EntityManager;
37+
import javax.persistence.EntityNotFoundException;
38+
import javax.persistence.FlushModeType;
39+
import javax.persistence.PersistenceException;
40+
import javax.persistence.Query;
4141

4242
import org.hibernate.FlushMode;
4343
import org.hibernate.HibernateException;
@@ -46,11 +46,8 @@
4646
import org.hibernate.ejb.HibernateEntityManager;
4747
import org.hibernate.ejb.HibernateEntityManagerFactory;
4848
import org.hibernate.stat.Statistics;
49-
50-
import org.junit.Before;
51-
import org.junit.Test;
52-
5349
import org.hibernate.testing.TestForIssue;
50+
import org.junit.Test;
5451

5552
import static org.junit.Assert.assertEquals;
5653
import static org.junit.Assert.assertFalse;
@@ -428,4 +425,23 @@ public void testPersistExisting() throws Exception {
428425
em.close();
429426
}
430427
}
428+
429+
@Test
430+
public void testFactoryClosed() throws Exception {
431+
EntityManager em = createIsolatedEntityManager();
432+
assertTrue( em.isOpen() );
433+
assertTrue( em.getEntityManagerFactory().isOpen());
434+
435+
em.getEntityManagerFactory().close(); // closing the entity manager factory should close the EM
436+
assertFalse(em.isOpen());
437+
438+
try {
439+
em.close();
440+
fail("closing entity manager that uses a closed session factory, must throw IllegalStateException");
441+
}
442+
catch( IllegalStateException expected) {
443+
// success
444+
}
445+
}
446+
431447
}

0 commit comments

Comments
 (0)