Author: epbernard Date: 2006-03-10 20:41:28 -0500 (Fri, 10 Mar 2006) New Revision: 9599 Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/spi/PersistenceProvider.java trunk/HibernateExt/ejb/build.xml trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.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/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java trunk/HibernateExt/ejb/src/test/hibernate.properties trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java Log: EJB-143 EJB-144 EJB-142 EJB-141 Modified: trunk/HibernateExt/ejb/build.xml =================================================================== --- trunk/HibernateExt/ejb/build.xml 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/build.xml 2006-03-11 01:41:28 UTC (rev 9599) @@ -16,7 +16,7 @@ <!-- Name of project and version, used to create filenames --> <property name="Name" value="Hibernate EntityManager"/> <property name="name" value="hibernate-entitymanager"/> - <property name="version" value="3.1beta6"/> + <property name="version" value="3.1beta7"/> <property name="javadoc.packagenames" value="org.hibernate.ejb.*"/> <property name="jdbc.dir" value="jdbc"/> <property name="copy.test" value="true"/> Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -21,6 +21,8 @@ import javax.persistence.spi.PersistenceUnitTransactionType; import javax.transaction.SystemException; import javax.transaction.TransactionManager; +import javax.transaction.Synchronization; +import javax.transaction.Status; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -45,14 +47,24 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManagerImplementor, Serializable { private static Log log = LogFactory.getLog( AbstractEntityManagerImpl.class ); + public static enum JoinStatus { + NOT_JOINED, + MARKED_FOR_JOINED, + JOINED + } + protected transient TransactionImpl tx = new TransactionImpl( this ); protected PersistenceContextType persistenceContextType; private FlushModeType flushMode = FlushModeType.AUTO; private PersistenceUnitTransactionType transactionType; + private JoinStatus joinStatus; protected AbstractEntityManagerImpl(PersistenceContextType type, PersistenceUnitTransactionType transactionType) { this.persistenceContextType = type; this.transactionType = transactionType; + if (PersistenceContextType.TRANSACTION == type) { + + } } public Query createQuery(String ejbqlString) { @@ -319,7 +331,30 @@ } public void joinTransaction() { + //set the joined status + if (joinStatus != JoinStatus.JOINED) { + joinStatus = JoinStatus.MARKED_FOR_JOINED; + final Session session = getSession(); + session.isOpen(); //attach hibernate core to the tx + //register the clear on rollback + if (joinStatus == JoinStatus.JOINED) { + session.getTransaction().registerSynchronization( new Synchronization() { + + public void beforeCompletion() { + } + + public void afterCompletion(int status) { + if ( Status.STATUS_ROLLEDBACK == status + && transactionType == PersistenceUnitTransactionType.JTA) { + if ( session.isOpen() ) { + session.clear(); + } + } + } + } ); + } + } } /** Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -70,11 +70,13 @@ private AnnotationConfiguration cfg; private SettingsFactory settingsFactory; private EventListenerConfigurator listenerConfigurator; + private PersistenceUnitTransactionType transactionType; public Ejb3Configuration() { settingsFactory = new InjectionSettingsFactory(); cfg = new AnnotationConfiguration( settingsFactory ); listenerConfigurator = new EventListenerConfigurator( this ); + transactionType = PersistenceUnitTransactionType.JTA; //default as per the spec } /** @@ -106,7 +108,8 @@ } Map workingVars = new HashMap(); - workingVars.put( HibernatePersistence.TRANSACTION_TYPE, metadata.getTransactionType() ); + //workingVars.put( HibernatePersistence.TRANSACTION_TYPE, metadata.getTransactionType() ); + defineTransactionType( metadata.getTransactionType(), metadata.getName() ); if ( metadata.getClasses().size() > 0 ) { workingVars.put( HibernatePersistence.CLASS_NAMES, metadata.getClasses() ); } @@ -119,6 +122,7 @@ Properties props = new Properties(); props.putAll( metadata.getProps() ); if ( overrides != null ) props.putAll( overrides ); //yuk! + workingVars.put( HibernatePersistence.PERSISTENCE_UNIT_NAME, metadata.getName() ); return createEntityManagerFactory( props, workingVars ); } @@ -128,28 +132,24 @@ * the peristence.xml file. * * @param emName entity manager name - * @param map properties passed to the persistence provider + * @param integration properties passed to the persistence provider * @return initialized EntityManagerFactory */ - public EntityManagerFactory createEntityManagerFactory(String emName, Map map) { + public EntityManagerFactory createEntityManagerFactory(String emName, Map integration) { try { log.debug( "Trying to find persistence unit: " + emName ); - if ( map == null ) { - map = CollectionHelper.EMPTY_MAP; - } - else { - // be sure not to fuck it up - map = Collections.unmodifiableMap( map ); - } + integration = integration == null ? + integration = CollectionHelper.EMPTY_MAP : + Collections.unmodifiableMap( integration ); Enumeration<URL> xmls = Thread.currentThread() .getContextClassLoader() .getResources( "META-INF/persistence.xml" ); while ( xmls.hasMoreElements() ) { URL url = xmls.nextElement(); log.trace( "Analyse of persistence.xml: " + url ); - List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy( url, map ); + List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy( url, integration ); for ( PersistenceMetadata metadata : metadataFiles ) { - JarVisitor.Filter[] filters = getFilters( metadata.getProps(), map ); + JarVisitor.Filter[] filters = getFilters( metadata.getProps(), integration ); if ( metadata.getProvider() == null || IMPLEMENTATION_NAME.equalsIgnoreCase( metadata.getProvider() @@ -173,7 +173,7 @@ visitor = JarVisitor.getVisitor( jarFile, filters ); addMetadataFromVisitor( visitor, metadata ); } - return createFactory( metadata, map ); + return createFactory( metadata, integration ); } } } @@ -212,16 +212,19 @@ /** * Create a factory from a PersistenceInfo object */ - public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info) { + public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map integration) { if ( log.isDebugEnabled() ) { log.debug( "Processing " + LogHelper.logPersistenceUnitInfo( info ) ); } else { log.info( "Processing PersistenceUnitInfo [\n\tname: " + info.getPersistenceUnitName() + "\n\t...]" ); } - if ( info.getPersistenceProviderClassName() != null - && ! info.getPersistenceProviderClassName().trim().startsWith( IMPLEMENTATION_NAME ) ) { - log.info( "Required a different provider: " + info.getPersistenceProviderClassName() ); + + integration = integration != null ? Collections.unmodifiableMap(integration) : CollectionHelper.EMPTY_MAP; + String provider = (String) integration.get( HibernatePersistence.PROVIDER ); + if (provider == null) provider = info.getPersistenceProviderClassName(); + if ( provider != null && ! provider.trim().startsWith( IMPLEMENTATION_NAME ) ) { + log.info( "Required a different provider: " + provider ); return null; } if ( info.getClassLoader() == null ) { @@ -234,12 +237,20 @@ thread.setContextClassLoader( info.getClassLoader() ); } - List<String> entities = new ArrayList( 50 ); + Map workingVars = new HashMap(); + workingVars.put( HibernatePersistence.PERSISTENCE_UNIT_NAME, info.getPersistenceUnitName() ); + List<String> entities = new ArrayList<String>( 50 ); if ( info.getManagedClassNames() != null ) entities.addAll( info.getManagedClassNames() ); List<InputStream> hbmFiles = new ArrayList<InputStream>(); List<String> packages = new ArrayList<String>(); - Map workingVars = new HashMap(); - workingVars.put( HibernatePersistence.TRANSACTION_TYPE, info.getTransactionType() ); +// Object overridenTxType = integration.get( HibernatePersistence.TRANSACTION_TYPE ); +// if (overridenTxType != null) { +// defineTransactionType( overridenTxType, info.getPersistenceUnitName() ); +// } +// else { + defineTransactionType( info.getTransactionType(), info.getPersistenceUnitName() ); +// } + //workingVars.put( HibernatePersistence.TRANSACTION_TYPE, transactionType ); boolean[] detectArtifact = getDetectedArtifacts( info.getProperties(), null ); for ( URL jar : info.getJarFileUrls() ) { if ( detectArtifact[0] ) scanForClasses( jar, packages, entities ); @@ -250,32 +261,72 @@ if ( detectArtifact[1] ) scanForHbmXmlFiles( info.getPersistenceUnitRootUrl(), hbmFiles ); } - Properties props = info.getProperties() != null ? + Properties properties = info.getProperties() != null ? info.getProperties() : new Properties(); + for ( Map.Entry entry : (Set<Map.Entry>) integration.keySet() ) { + if ( entry.getKey() instanceof String && entry.getValue() instanceof String ) { + properties.setProperty( (String) entry.getKey(), (String) entry.getValue() ); + } + } //FIXME send the appropriate entites. - if ( "true".equalsIgnoreCase( props.getProperty(HibernatePersistence.USE_CLASS_ENHANCER) ) ) { + if ( "true".equalsIgnoreCase( properties.getProperty(HibernatePersistence.USE_CLASS_ENHANCER) ) ) { info.addTransformer( new InterceptFieldClassFileTransformer( entities ) ); } workingVars.put( HibernatePersistence.CLASS_NAMES, entities ); workingVars.put( HibernatePersistence.PACKAGE_NAMES, packages ); if ( hbmFiles.size() > 0 ) workingVars.put( HibernatePersistence.HBXML_FILES, hbmFiles ); - if ( info.getJtaDataSource() != null || info.getNonJtaDataSource() != null ) { + + //datasources + boolean overridenDatasource = false; + String dataSource = (String) integration.get( HibernatePersistence.JTA_DATASOURCE ); + if (dataSource != null) { + overridenDatasource = true; + properties.setProperty( Environment.DATASOURCE, dataSource ); + } + dataSource = (String) integration.get( HibernatePersistence.NON_JTA_DATASOURCE ); + if (dataSource != null) { + overridenDatasource = true; + properties.setProperty( Environment.DATASOURCE, dataSource ); + } + + if ( ! overridenDatasource && (info.getJtaDataSource() != null || info.getNonJtaDataSource() != null ) ) { this.setDataSource( info.getJtaDataSource() != null ? info.getJtaDataSource() : info.getNonJtaDataSource() ); this.setProperty( Environment.CONNECTION_PROVIDER, InjectedDataSourceConnectionProvider.class.getName() ); } - EntityManagerFactory entityManagerFactory = createEntityManagerFactory( props, workingVars ); + EntityManagerFactory entityManagerFactory = createEntityManagerFactory( properties, workingVars ); //After EMF, set the CCL back if ( ! info.getClassLoader().equals( contextClassLoader ) ) { thread.setContextClassLoader( contextClassLoader ); } return entityManagerFactory; + } + private void defineTransactionType(Object overridenTxType, String persistenceUnitName) { + if (overridenTxType == null) { + if (transactionType == null) { + transactionType = PersistenceUnitTransactionType.JTA; //this is the default value + } + } + else if (overridenTxType instanceof String) { + transactionType = PersistenceXmlLoader.getTransactionType( (String) overridenTxType ); + } + else if (overridenTxType instanceof PersistenceUnitTransactionType) { + transactionType = (PersistenceUnitTransactionType) overridenTxType; + } + else { + throw new PersistenceException( + HibernatePersistence.TRANSACTION_TYPE + " of the wrong class type" + + (persistenceUnitName != null ? " in unit " + persistenceUnitName : "") + + ": " + overridenTxType.getClass() + ); + } + } public Ejb3Configuration setProperty(String key, String value) { @@ -438,12 +489,10 @@ * Create an EntityManagerFactory <b>when</b> the configuration is ready */ public EntityManagerFactory createEntityManagerFactory() { - return createEntityManagerFactory( cfg.getProperties(), new HashMap() ); } - private EntityManagerFactory buildEntityManagerFactory(PersistenceUnitTransactionType transactionType, - boolean discardOnClose) { + private EntityManagerFactory buildEntityManagerFactory(boolean discardOnClose) { return new EntityManagerFactoryImpl( cfg.buildSessionFactory(), transactionType, @@ -571,10 +620,7 @@ log.warn( Environment.AUTOCOMMIT + " = false break the EJB3 specification" ); } boolean discardOnClose = preparedProperties.getProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE).equals( "true"); - return buildEntityManagerFactory( - (PersistenceUnitTransactionType) workingVars.get(HibernatePersistence.TRANSACTION_TYPE), - discardOnClose - ); + return buildEntityManagerFactory(discardOnClose); } private void addClassesToSessionFactory(Map workingVars) { @@ -619,20 +665,23 @@ preparedProperties.setProperty( Environment.USE_IDENTIFIER_ROLLBACK, "false" ); preparedProperties.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "true" ); preparedProperties.setProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE, "false" ); - PersistenceUnitTransactionType type = (PersistenceUnitTransactionType) - workingVars.get(HibernatePersistence.TRANSACTION_TYPE); - if (type == PersistenceUnitTransactionType.JTA) { + + //override the new defaults with the user defined ones + if ( properties != null ) preparedProperties.putAll( properties ); + defineTransactionType( + preparedProperties.getProperty( HibernatePersistence.TRANSACTION_TYPE ), + (String) workingVars.get( HibernatePersistence.PERSISTENCE_UNIT_NAME ) + ); + boolean hasTxStrategy = StringHelper.isNotEmpty( preparedProperties.getProperty( Environment.TRANSACTION_STRATEGY ) ); + if (! hasTxStrategy && transactionType == PersistenceUnitTransactionType.JTA) { preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JTATransactionFactory.class.getName() ); } - else if (type == PersistenceUnitTransactionType.RESOURCE_LOCAL) { + else if (! hasTxStrategy && transactionType == PersistenceUnitTransactionType.RESOURCE_LOCAL) { preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JDBCTransactionFactory.class.getName() ); } else { - new AssertionFailure("Unknown PersisntenceUnitTransactionType: " + type); + new AssertionFailure("Unknown PersisntenceUnitTransactionType: " + transactionType); } - - //override the new defaults with the user defined ones - if ( properties != null ) preparedProperties.putAll( properties ); return preparedProperties; } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -17,7 +17,7 @@ * Provider */ public static final String PROVIDER = "javax.persistence.provider"; - /** + /** * transaction type */ public static final String TRANSACTION_TYPE = "javax.persistence.transactionType"; @@ -92,8 +92,10 @@ public static final String JACC_CONTEXT_ID = "hibernate.jacc.ctx.id"; public static final String JACC_PREFIX = "hibernate.jacc"; public static final String JACC_ENABLED = "hibernate.jacc.enabled"; + public static final String PERSISTENCE_UNIT_NAME = "hibernate.ejb.persistenceUnitName"; + /** * Get an entity manager factory by its entity manager name and given the * appropriate extra properties. Those proeprties override the one get through @@ -108,9 +110,9 @@ return cfg.createEntityManagerFactory( persistenceUnitName, overridenProperties ); } - public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info) { + public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) { Ejb3Configuration cfg = new Ejb3Configuration(); - return cfg.createContainerEntityManagerFactory( info ); + return cfg.createContainerEntityManagerFactory( info, map ); } /** Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -10,6 +10,7 @@ /** * @author Gavin King + * @author Emmanuel Bernard */ public class TransactionImpl implements EntityTransaction { @@ -46,9 +47,18 @@ tx.commit(); } catch (Exception e) { + try { + //as per the spec we should rollback if commit fails + tx.rollback(); + } + catch (Exception re) { + //swallow + } throw new RollbackException( "Error while commiting the transaction", e); } - rollbackOnly = false; + finally { + rollbackOnly = false; + } //if closed and we commit, the mode should have been adjusted already if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); } @@ -63,7 +73,10 @@ catch (RuntimeException e) { throw new PersistenceException("unexpected error when rollbacking", e); } - entityManager.adjustFlushMode(); + finally { + rollbackOnly = false; + } + if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); } public void setRollbackOnly() { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -6,15 +6,17 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.Properties; +import javax.persistence.PersistenceException; +import javax.persistence.spi.PersistenceUnitTransactionType; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import javax.persistence.spi.PersistenceUnitTransactionType; -import javax.persistence.PersistenceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.ejb.HibernatePersistence; import org.hibernate.util.StringHelper; -import org.hibernate.ejb.HibernatePersistence; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -81,6 +83,12 @@ if (dataSource != null) { metadata.setNonJtaDatasource( dataSource ); } + Properties properties = metadata.getProps(); + for ( Map.Entry entry : (Set<Map.Entry>) overrides.keySet() ) { + if ( entry.getKey() instanceof String && entry.getValue() instanceof String ) { + properties.setProperty( (String) entry.getKey(), (String) entry.getValue() ); + } + } units.add( metadata ); } } Modified: trunk/HibernateExt/ejb/src/test/hibernate.properties =================================================================== --- trunk/HibernateExt/ejb/src/test/hibernate.properties 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/hibernate.properties 2006-03-11 01:41:28 UTC (rev 9599) @@ -5,6 +5,7 @@ ## select Hibernate persistence provider javax.persistence.provider org.hibernate.ejb.HibernatePersistence +javax.persistence.transactionType=RESOURCE_LOCAL ## entity bean class name (comma separated) 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-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -1,25 +1,24 @@ //$Id$ package org.hibernate.ejb.test; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutput; +import java.io.ObjectOutputStream; import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.io.ObjectOutput; -import java.io.ObjectOutputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ByteArrayInputStream; import javax.persistence.EntityManager; -import javax.persistence.PersistenceContextType; +import javax.persistence.FlushModeType; import javax.persistence.Query; -import javax.persistence.FlushModeType; +import org.hibernate.FlushMode; +import org.hibernate.HibernateException; +import org.hibernate.QueryException; +import org.hibernate.ejb.HibernateEntityManager; import org.hibernate.ejb.HibernateEntityManagerFactory; -import org.hibernate.ejb.HibernateEntityManager; import org.hibernate.stat.Statistics; -import org.hibernate.QueryException; -import org.hibernate.HibernateException; -import org.hibernate.FlushMode; /** * @author Gavin King @@ -47,58 +46,58 @@ } - public void testEntityManager() { + // EM TRANSACTION +// public void testEntityManager() { +// +// Item item = new Item( "Mouse", "Micro$oft mouse" ); +// +// EntityManager em = factory.createEntityManager(); +// em.getTransaction().begin(); +// em.persist( item ); +// assertTrue( em.contains( item ) ); +// em.getTransaction().commit(); +// +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); +// assertNotNull( item ); +// assertEquals( "Micro$oft mouse", item.getDescr() ); +// item.setDescr( "Micro$oft wireless mouse" ); +// assertTrue( em.contains( item ) ); +// em.getTransaction().commit(); +// +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = (Item) em.find( Item.class, "Mouse" ); +// assertNotNull( item ); +// em.getTransaction().commit(); +// +// item = em.find( Item.class, "Mouse" ); +// assertFalse( em.contains( item ) ); +// +// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); +// assertNotNull( item ); +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = em.find( Item.class, "Mouse" ); +// assertNotNull( item ); +// assertTrue( em.contains( item ) ); +// assertEquals( "Micro$oft wireless mouse", item.getDescr() ); +// em.remove( item ); +// em.remove( item );//second should be a no-op +// em.getTransaction().commit(); +// +// em.close(); +// } - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = factory.createEntityManager(); - em.getTransaction().begin(); - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); - assertNotNull( item ); - assertEquals( "Micro$oft mouse", item.getDescr() ); - item.setDescr( "Micro$oft wireless mouse" ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = (Item) em.find( Item.class, "Mouse" ); - assertNotNull( item ); - em.getTransaction().commit(); - - item = em.find( Item.class, "Mouse" ); - assertFalse( em.contains( item ) ); - - item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); - assertNotNull( item ); - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = em.find( Item.class, "Mouse" ); - assertNotNull( item ); - assertTrue( em.contains( item ) ); - assertEquals( "Micro$oft wireless mouse", item.getDescr() ); - em.remove( item ); - em.remove( item );//second should be a no-op - em.getTransaction().commit(); - - em.close(); - - } - public void testExtendedEntityManager() { Item item = new Item( "Mouse", "Micro$oft mouse" ); - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); em.getTransaction().begin(); em.persist( item ); assertTrue( em.contains( item ) ); @@ -134,6 +133,7 @@ em.getTransaction().begin(); assertTrue( em.contains( item ) ); em.remove( item ); + em.remove( item ); //Second should be no-op em.getTransaction().commit(); em.close(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -5,18 +5,17 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; -import javax.persistence.PersistenceContextType; import javax.persistence.PersistenceException; import org.hibernate.ejb.HibernateEntityManagerFactory; +import org.hibernate.ejb.test.pack.cfgxmlpar.Morito; import org.hibernate.ejb.test.pack.defaultpar.ApplicationServer; import org.hibernate.ejb.test.pack.defaultpar.Mouse; import org.hibernate.ejb.test.pack.defaultpar.Version; +import org.hibernate.ejb.test.pack.excludehbmpar.Caipirinha; import org.hibernate.ejb.test.pack.explodedpar.Carpet; import org.hibernate.ejb.test.pack.explodedpar.Elephant; import org.hibernate.ejb.test.pack.externaljar.Scooter; -import org.hibernate.ejb.test.pack.excludehbmpar.Caipirinha; -import org.hibernate.ejb.test.pack.cfgxmlpar.Morito; import org.hibernate.stat.Statistics; //$Id$ @@ -126,61 +125,61 @@ emf.close(); } - public void testEntityManager() { + //EM TRANSACTION +// public void testEntityManager() { +// +// Item item = new Item( "Mouse", "Micro$oft mouse" ); +// +// EntityManager em = factory.createEntityManager(); +// em.getTransaction().begin(); +// em.persist( item ); +// assertTrue( em.contains( item ) ); +// em.getTransaction().commit(); +// +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); +// assertNotNull( item ); +// assertEquals( "Micro$oft mouse", item.getDescr() ); +// item.setDescr( "Micro$oft wireless mouse" ); +// assertTrue( em.contains( item ) ); +// em.getTransaction().commit(); +// +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = (Item) em.find( Item.class, "Mouse" ); +// assertNotNull( item ); +// em.getTransaction().commit(); +// +// item = em.find( Item.class, "Mouse" ); +// assertFalse( em.contains( item ) ); +// +// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); +// assertNotNull( item ); +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// assertEquals("Explicit package in <class> should work", 1, em.createNamedQuery( "countItems" ).getSingleResult() ); +// em.getTransaction().commit(); +// +// em.getTransaction().begin(); +// item = em.find( Item.class, "Mouse" ); +// assertNotNull( item ); +// assertTrue( em.contains( item ) ); +// assertEquals( "Micro$oft wireless mouse", item.getDescr() ); +// em.remove( item ); +// em.getTransaction().commit(); +// +// em.close(); +// } - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = factory.createEntityManager(); - em.getTransaction().begin(); - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); - assertNotNull( item ); - assertEquals( "Micro$oft mouse", item.getDescr() ); - item.setDescr( "Micro$oft wireless mouse" ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = (Item) em.find( Item.class, "Mouse" ); - assertNotNull( item ); - em.getTransaction().commit(); - - item = em.find( Item.class, "Mouse" ); - assertFalse( em.contains( item ) ); - - item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); - assertNotNull( item ); - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - assertEquals("Explicit package in <class> should work", 1, em.createNamedQuery( "countItems" ).getSingleResult() ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - item = em.find( Item.class, "Mouse" ); - assertNotNull( item ); - assertTrue( em.contains( item ) ); - assertEquals( "Micro$oft wireless mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - - em.close(); - - } - public void testExtendedEntityManager() { Item item = new Item( "Mouse", "Micro$oft mouse" ); - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); em.getTransaction().begin(); em.persist( item ); assertTrue( em.contains( item ) ); @@ -216,6 +215,7 @@ em.getTransaction().begin(); assertTrue( em.contains( item ) ); em.remove( item ); + em.remove( item ); //second remove should be a no-op em.getTransaction().commit(); em.close(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -21,13 +21,13 @@ em.getTransaction().begin(); em.persist( c ); em.getTransaction().commit(); - + em.clear(); em.getTransaction().begin(); c = em.find( Cat.class, c.getId() ); assertFalse( c.getAge() == 0 ); c.setName( "Tomcat" ); //update this entity em.getTransaction().commit(); - + em.clear(); em.getTransaction().begin(); c = em.find( Cat.class, c.getId() ); assertEquals( "Tomcat", c.getName() ); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -13,7 +13,7 @@ public void testDatasourceInjection() { PersistenceUnitInfoImpl info = new PersistenceUnitInfoImpl(); try { - EntityManagerFactory emf = ( new HibernatePersistence() ).createContainerEntityManagerFactory( info ); + EntityManagerFactory emf = ( new HibernatePersistence() ).createContainerEntityManagerFactory( info, null ); fail("FakeDatasource should have been used"); } catch (FakeDataSourceException fde) { //success Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -9,7 +9,6 @@ import java.util.Date; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; -import javax.persistence.PersistenceContextType; import org.hibernate.ejb.HibernateEntityManager; import org.hibernate.ejb.test.Cat; @@ -34,7 +33,7 @@ EntityManagerFactory seriallizedFactory = (EntityManagerFactory) in.readObject(); in.close(); byteIn.close(); - EntityManager em = seriallizedFactory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = seriallizedFactory.createEntityManager( ); //em.getTransaction().begin(); //em.setFlushMode( FlushModeType.NEVER ); Cat cat = new Cat(); 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-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -2,14 +2,13 @@ package org.hibernate.ejb.test.transaction; import javax.persistence.EntityManager; -import javax.persistence.LockModeType; -import javax.persistence.PersistenceContextType; -import javax.persistence.TransactionRequiredException; import javax.persistence.EntityNotFoundException; +import javax.persistence.LockModeType; import javax.persistence.RollbackException; +import javax.persistence.TransactionRequiredException; -import org.hibernate.ejb.test.TestCase; import org.hibernate.ejb.HibernateEntityManagerFactory; +import org.hibernate.ejb.test.TestCase; import org.hibernate.stat.Statistics; /** @@ -19,7 +18,7 @@ public void testAlwaysTransactionalOperations() throws Exception { Book book = new Book(); book.name = "Le petit prince"; - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); em.getTransaction().begin(); em.persist( book ); em.getTransaction().commit(); @@ -42,38 +41,38 @@ em.getTransaction().commit(); } - public void testTransactionalOperationsWhenTransactional() throws Exception { - Book book = new Book(); - book.name = "Le petit prince"; - EntityManager em = factory.createEntityManager( PersistenceContextType.TRANSACTION ); - try { - em.persist( book ); - fail("flush has to be inside a Tx"); - } - catch (TransactionRequiredException e) { - //success - } - try { - em.refresh( book ); - fail("refresh has to be inside a Tx"); - } - catch (TransactionRequiredException e) { - //success - } - try { - em.remove( book ); - fail("refresh has to be inside a Tx"); - } - catch (TransactionRequiredException e) { - //success - } - em.close(); - } +// public void testTransactionalOperationsWhenTransactional() throws Exception { +// Book book = new Book(); +// book.name = "Le petit prince"; +// EntityManager em = factory.createEntityManager( PersistenceContextType.TRANSACTION ); +// try { +// em.persist( book ); +// fail("flush has to be inside a Tx"); +// } +// catch (TransactionRequiredException e) { +// //success +// } +// try { +// em.refresh( book ); +// fail("refresh has to be inside a Tx"); +// } +// catch (TransactionRequiredException e) { +// //success +// } +// try { +// em.remove( book ); +// fail("refresh has to be inside a Tx"); +// } +// catch (TransactionRequiredException e) { +// //success +// } +// em.close(); +// } public void testTransactionalOperationsWhenExtended() throws Exception { Book book = new Book(); book.name = "Le petit prince"; - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); Statistics stats = ( ( HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics(); stats.clear(); stats.setStatisticsEnabled( true ); @@ -116,7 +115,7 @@ public void testMergeWhenExtended() throws Exception { Book book = new Book(); book.name = "Le petit prince"; - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); Statistics stats = ( ( HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics(); em.getTransaction().begin(); Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/spi/PersistenceProvider.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/spi/PersistenceProvider.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/spi/PersistenceProvider.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -18,7 +18,10 @@ * @param emName The name of the persistence unit * @param map A Map of properties for use by the * persistence provider. These properties may be used to - * override the settings in the persistence.xml. + * override the values of the corresponding elements in + * the persistence.xml file or specify values for + * properties not specified in the persistence.xml + * (and may be null if no properties are specified). * @return EntityManagerFactory for the persistence unit, * or null if the provider is not the right provider */ @@ -29,8 +32,11 @@ * is to be created. * * @param info Metadata for use by the persistence provider + * @param map A Map of integration-level properties for use + * by the persistence provider (may be null if no properties + * are specified). * @return EntityManagerFactory for the persistence unit * specified by the metadata */ - public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info); + public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map); } \ No newline at end of file |