HHH-3472 : WebSphere + JTASessionContext
git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@15168 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
parent
a0c14fe192
commit
7b3e4824e8
|
@ -101,13 +101,17 @@ public class JTASessionContext implements CurrentSessionContext {
|
||||||
throw new HibernateException( "Problem locating/validating JTA transaction", t );
|
throw new HibernateException( "Problem locating/validating JTA transaction", t );
|
||||||
}
|
}
|
||||||
|
|
||||||
Session currentSession = ( Session ) currentSessionMap.get( txn );
|
final Object txnIdentifier = factory.getSettings().getTransactionManagerLookup() == null
|
||||||
|
? txn
|
||||||
|
: factory.getSettings().getTransactionManagerLookup().getTransactionIdentifier( txn );
|
||||||
|
|
||||||
|
Session currentSession = ( Session ) currentSessionMap.get( txnIdentifier );
|
||||||
|
|
||||||
if ( currentSession == null ) {
|
if ( currentSession == null ) {
|
||||||
currentSession = buildOrObtainSession();
|
currentSession = buildOrObtainSession();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
txn.registerSynchronization( buildCleanupSynch( txn ) );
|
txn.registerSynchronization( buildCleanupSynch( txnIdentifier ) );
|
||||||
}
|
}
|
||||||
catch ( Throwable t ) {
|
catch ( Throwable t ) {
|
||||||
try {
|
try {
|
||||||
|
@ -119,17 +123,21 @@ public class JTASessionContext implements CurrentSessionContext {
|
||||||
throw new HibernateException( "Unable to register cleanup Synchronization with TransactionManager" );
|
throw new HibernateException( "Unable to register cleanup Synchronization with TransactionManager" );
|
||||||
}
|
}
|
||||||
|
|
||||||
Object txnIdentifier = factory.getSettings().getTransactionManagerLookup() == null
|
|
||||||
? txn
|
|
||||||
: factory.getSettings().getTransactionManagerLookup().getTransactionIdentifier( txn );
|
|
||||||
currentSessionMap.put( txnIdentifier, currentSession );
|
currentSessionMap.put( txnIdentifier, currentSession );
|
||||||
}
|
}
|
||||||
|
|
||||||
return currentSession;
|
return currentSession;
|
||||||
}
|
}
|
||||||
|
|
||||||
private CleanupSynch buildCleanupSynch(Transaction txn) {
|
/**
|
||||||
return new CleanupSynch( txn, this );
|
* Builds a {@link CleanupSynch} capable of cleaning up the the current session map as an after transaction
|
||||||
|
* callback.
|
||||||
|
*
|
||||||
|
* @param transactionIdentifier The transaction identifier under which the current session is registered.
|
||||||
|
* @return The cleanup synch.
|
||||||
|
*/
|
||||||
|
private CleanupSynch buildCleanupSynch(Object transactionIdentifier) {
|
||||||
|
return new CleanupSynch( transactionIdentifier, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -180,11 +188,11 @@ public class JTASessionContext implements CurrentSessionContext {
|
||||||
* JTA transaction synch used for cleanup of the internal session map.
|
* JTA transaction synch used for cleanup of the internal session map.
|
||||||
*/
|
*/
|
||||||
protected static class CleanupSynch implements Synchronization {
|
protected static class CleanupSynch implements Synchronization {
|
||||||
private Transaction txn;
|
private Object transactionIdentifier;
|
||||||
private JTASessionContext context;
|
private JTASessionContext context;
|
||||||
|
|
||||||
public CleanupSynch(Transaction txn, JTASessionContext context) {
|
public CleanupSynch(Object transactionIdentifier, JTASessionContext context) {
|
||||||
this.txn = txn;
|
this.transactionIdentifier = transactionIdentifier;
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +206,7 @@ public class JTASessionContext implements CurrentSessionContext {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public void afterCompletion(int i) {
|
public void afterCompletion(int i) {
|
||||||
context.currentSessionMap.remove( txn );
|
context.currentSessionMap.remove( transactionIdentifier );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue