|
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;
}
|