Author: epbernard Date: 2006-03-07 19:50:19 -0500 (Tue, 07 Mar 2006) New Revision: 9571 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java Log: EJB-135 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -434,8 +434,13 @@ return createEntityManagerFactory( cfg.getProperties(), new HashMap() ); } - private EntityManagerFactory buildEntityManagerFactory(PersistenceUnitTransactionType transactionType) { - return new EntityManagerFactoryImpl( cfg.buildSessionFactory(), transactionType ); + private EntityManagerFactory buildEntityManagerFactory(PersistenceUnitTransactionType transactionType, + boolean discardOnClose) { + return new EntityManagerFactoryImpl( + cfg.buildSessionFactory(), + transactionType, + discardOnClose + ); } /** @@ -595,9 +600,10 @@ if ( ! "true".equalsIgnoreCase( cfg.getProperty( Environment.AUTOCOMMIT ) ) ) { log.warn( Environment.AUTOCOMMIT + " = false break the EJB3 specification" ); } - + boolean discardOnClose = properties.getProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE, "false" ).equals( "true"); return buildEntityManagerFactory( - (PersistenceUnitTransactionType) workingVars.get(HibernatePersistence.TRANSACTION_TYPE) + (PersistenceUnitTransactionType) workingVars.get(HibernatePersistence.TRANSACTION_TYPE), + discardOnClose ); } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -14,10 +14,15 @@ private SessionFactory sessionFactory; private PersistenceUnitTransactionType transactionType; + private boolean discardOnClose; - public EntityManagerFactoryImpl(SessionFactory sessionFactory, PersistenceUnitTransactionType transactionType) { + public EntityManagerFactoryImpl( + SessionFactory sessionFactory, + PersistenceUnitTransactionType transactionType, + boolean discardOnClose) { this.sessionFactory = sessionFactory; this.transactionType = transactionType; + this.discardOnClose = discardOnClose; } public EntityManager createEntityManager() { @@ -25,7 +30,7 @@ } public EntityManager createEntityManager(PersistenceContextType type) { - return new EntityManagerImpl( sessionFactory, type, transactionType ); + return new EntityManagerImpl( sessionFactory, type, transactionType, discardOnClose ); } public EntityManager getEntityManager() { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -3,6 +3,7 @@ import javax.persistence.PersistenceContextType; import javax.persistence.spi.PersistenceUnitTransactionType; +import javax.transaction.Synchronization; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -16,14 +17,17 @@ protected Session session; protected SessionFactory sessionFactory; protected boolean open; + protected boolean discardOnClose; public EntityManagerImpl( SessionFactory sessionFactory, PersistenceContextType pcType, - PersistenceUnitTransactionType transactionType + PersistenceUnitTransactionType transactionType, + boolean discardOnClose ) { super( pcType, transactionType ); this.sessionFactory = sessionFactory; - open = true; + this.open = true; + this.discardOnClose = discardOnClose; } public Session getSession() { @@ -44,10 +48,26 @@ public void close() { if ( !open ) throw new IllegalStateException( "EntityManager is closed" ); - //if ( isTransactionInProgress() ) throw new IllegalStateException( "transaction in progress"); + if ( !discardOnClose && isTransactionInProgress() ) { + //delay the closing till the end of the enlisted transaction + getSession().getTransaction().registerSynchronization( new Synchronization() { + public void beforeCompletion() { + //nothing to do + } + + public void afterCompletion(int i) { + //TODO should I check for isOpen() ? + if (session != null) session.close(); + //TODO session == null should not happen + } + } + ); + } + else { + //close right now + if ( session != null ) session.close(); + } open = false; - if ( session != null ) session.close(); - } public boolean isOpen() { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -76,6 +76,11 @@ * Enable the class file enhancement */ public static final String USE_CLASS_ENHANCER = "hibernate.ejb.use_class_enhancer"; + /** + * Whether or not discard persistent context on entityManager.close() + * The EJB3 compliant and default choice is false + */ + public static final String DISCARD_PC_ON_CLOSE = "hibernate.ejb.discard_pc_on_close"; //The following properties are for Internal use only /** Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -36,7 +36,8 @@ throw new IllegalStateException( "Transaction not active" ); } tx.commit(); - entityManager.adjustFlushMode(); + //if closed and we commit, the mode should have been adjusted already + if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); } public void rollback() { Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -276,7 +276,7 @@ in.close(); byteIn.close(); assertNull( deserializedException.getCause() ); - assertNotNull( e.getCause() ); + assertNull( e.getCause() ); } em.getTransaction().commit(); em.close(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -17,9 +17,9 @@ */ @Entity(name = "Item") @SqlResultSetMapping(name = "getItem", entities = - @EntityResult(name = "org.hibernate.ejb.test.Item", fields = { - @FieldResult(name = "name", column = "itemname"), - @FieldResult(name = "descr", column = "itemdescription") + @EntityResult(entityClass = org.hibernate.ejb.test.Item.class, fields = { + @FieldResult(name = "name", column = "itemname"), + @FieldResult(name = "descr", column = "itemdescription") }) ) //@Cache(region="Item", usage=NONSTRICT_READ_WRITE) Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -42,7 +42,7 @@ manager.getTransaction().commit(); manager.getTransaction().begin(); - assertEquals( manager.createQuery( "from Person" ).getResultList().size(), 3 ); + assertEquals( manager.createQuery( "select p.address, p.name from Person p order by p.name" ).getResultList().size(), 3 ); assertEquals( manager.createQuery( "from Person p where p.class = Customer" ).getResultList().size(), 1 ); manager.getTransaction().commit(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -157,14 +157,26 @@ public void testCloseAndTransaction() throws Exception { EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); + Book book = new Book(); + book.name = "Java for Dummies"; + em.persist( book ); + em.close(); + book.name = "C# for Dummies"; + assertFalse( em.isOpen() ); try { - em.close(); - fail("transaction in progress"); + em.flush(); + fail("direct action on a closed em should fail"); } catch (IllegalStateException e) { //success } em.getTransaction().commit(); + em = factory.createEntityManager( ); + em.getTransaction().begin(); + book = em.find( Book.class, book.id ); + assertEquals( "C# for Dummies", book.name ); + em.remove( book ); + em.getTransaction().commit(); em.close(); } |