From: <hib...@li...> - 2006-03-27 08:51:40
|
Author: epbernard Date: 2006-03-27 03:51:36 -0500 (Mon, 27 Mar 2006) New Revision: 9684 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java Log: Add register sync when EM is created inside a Tx Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-27 08:47:11 UTC (rev 9683) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-27 08:51:36 UTC (rev 9684) @@ -68,8 +68,7 @@ protected void postInit() { //register in Sync if needed - getSession().getTransaction(); // joinable transaction needs to initialize if possible - getSession().isOpen(); //to register transaction + if ( PersistenceUnitTransactionType.JTA.equals(transactionType) ) joinTransaction( true ); } public Query createQuery(String ejbqlString) { @@ -404,9 +403,15 @@ } public void joinTransaction() { + joinTransaction( false ); + } + + private void joinTransaction(boolean ignoreNotJoining) { //set the joined status + getSession().isOpen(); //for sync if ( transactionType == PersistenceUnitTransactionType.JTA ) { try { + log.debug( "Looking for a JTA transaction to join" ); final Session session = getSession(); final Transaction transaction = session.getTransaction(); if ( transaction != null && transaction instanceof JoinableCMTTransaction ) { @@ -414,12 +419,19 @@ final JoinableCMTTransaction joinableCMTTransaction = (JoinableCMTTransaction) session.getTransaction(); if ( joinableCMTTransaction.getStatus() == JoinableCMTTransaction.JoinStatus.JOINED ) { + log.debug("Transaction already joined"); return; //no-op } joinableCMTTransaction.markForJoined(); session.isOpen(); //register to the Tx if ( joinableCMTTransaction.getStatus() == JoinableCMTTransaction.JoinStatus.NOT_JOINED ) { - throw new TransactionRequiredException( "No active JTA transaction on joinTransaction call" ); + if (ignoreNotJoining) { + log.debug( "No JTA transaction found" ); + return; + } + else { + throw new TransactionRequiredException( "No active JTA transaction on joinTransaction call" ); + } } else if ( joinableCMTTransaction.getStatus() == JoinableCMTTransaction.JoinStatus.MARKED_FOR_JOINED ) { @@ -427,6 +439,7 @@ } //flush before completion and //register clear on rollback + log.trace("Adding flush() and close() synchronization"); joinableCMTTransaction.registerSynchronization( new Synchronization() { public void beforeCompletion() { @@ -459,6 +472,9 @@ log.trace( "automatically flushing session" ); ctx.managedFlush(); } + else { + log.trace( "skipping managed flushing" ); + } } catch (RuntimeException re) { //throwPersistenceException will mark the transaction as rollbacked @@ -489,11 +505,17 @@ } ); } + else { + log.warn("Cannot join transaction, not a JoinableCMTTransaction"); + } } catch (HibernateException he) { throwPersistenceException( he ); } } + else { + if (!ignoreNotJoining) log.warn("Calling joinTransaction() on a non JTA EntityManager"); + } } /** Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-27 08:47:11 UTC (rev 9683) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-27 08:51:36 UTC (rev 9684) @@ -240,74 +240,79 @@ if ( ! info.getClassLoader().equals( contextClassLoader ) ) { thread.setContextClassLoader( info.getClassLoader() ); } + EntityManagerFactory entityManagerFactory; - 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>(); -// 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 ); - if ( detectArtifact[1] ) scanForHbmXmlFiles( jar, hbmFiles ); - } - if ( ! info.excludeUnlistedClasses() ) { - if ( detectArtifact[0] ) scanForClasses( info.getPersistenceUnitRootUrl(), packages, entities ); - if ( detectArtifact[1] ) scanForHbmXmlFiles( info.getPersistenceUnitRootUrl(), hbmFiles ); - } + try { + 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>(); + // 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 ); + if ( detectArtifact[1] ) scanForHbmXmlFiles( jar, hbmFiles ); + } + if ( ! info.excludeUnlistedClasses() ) { + if ( detectArtifact[0] ) scanForClasses( info.getPersistenceUnitRootUrl(), packages, entities ); + if ( detectArtifact[1] ) scanForHbmXmlFiles( info.getPersistenceUnitRootUrl(), hbmFiles ); + } - Properties properties = info.getProperties() != null ? - info.getProperties() : - new Properties(); - for ( Map.Entry entry : (Set<Map.Entry>) integration.entrySet() ) { - if ( entry.getKey() instanceof String && entry.getValue() instanceof String ) { - properties.setProperty( (String) entry.getKey(), (String) entry.getValue() ); + Properties properties = info.getProperties() != null ? + info.getProperties() : + new Properties(); + for ( Map.Entry entry : (Set<Map.Entry>) integration.entrySet() ) { + 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( properties.getProperty(HibernatePersistence.USE_CLASS_ENHANCER) ) ) { - info.addTransformer( new InterceptFieldClassFileTransformer( entities ) ); - } + //FIXME send the appropriate entites. + 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 ); + workingVars.put( HibernatePersistence.CLASS_NAMES, entities ); + workingVars.put( HibernatePersistence.PACKAGE_NAMES, packages ); + if ( hbmFiles.size() > 0 ) workingVars.put( HibernatePersistence.HBXML_FILES, hbmFiles ); - //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 ); - } + //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() ); - } + 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( properties, workingVars ); - //After EMF, set the CCL back - if ( ! info.getClassLoader().equals( contextClassLoader ) ) { - thread.setContextClassLoader( contextClassLoader ); + entityManagerFactory = createEntityManagerFactory( properties, workingVars ); } + finally { + //After EMF, set the CCL back + if ( ! info.getClassLoader().equals( contextClassLoader ) ) { + thread.setContextClassLoader( contextClassLoader ); + } + } return entityManagerFactory; } |