[jboss-cvs] jboss-seam/src/main/org/jboss/seam/transaction ...
Gavin King
gavin.king at jboss.com
Sun Jun 24 15:40:33 EDT 2007
User: gavin
Date: 07/06/24 15:40:33
Modified: src/main/org/jboss/seam/transaction EntityTransaction.java
HibernateTransaction.java
Log:
fix synchronizations for resource-local txns
more logging
Revision Changes Path
1.6 +35 -5 jboss-seam/src/main/org/jboss/seam/transaction/EntityTransaction.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: EntityTransaction.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/transaction/EntityTransaction.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- EntityTransaction.java 24 Jun 2007 06:34:34 -0000 1.5
+++ EntityTransaction.java 24 Jun 2007 19:40:33 -0000 1.6
@@ -12,11 +12,15 @@
import javax.transaction.SystemException;
import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.core.Expressions.ValueExpression;
+import org.jboss.seam.log.LogProvider;
+import org.jboss.seam.log.Logging;
+import org.jboss.seam.persistence.PersistenceProvider;
/**
* Support for the JPA EntityTransaction API.
@@ -33,10 +37,21 @@
@BypassInterceptors
public class EntityTransaction extends AbstractUserTransaction
{
+ private static final LogProvider log = Logging.getLogProvider(EntityTransaction.class);
+
private SynchronizationRegistry synchronizations = new SynchronizationRegistry();
private ValueExpression<EntityManager> entityManager;
private EntityManager currentEntityManager;
+ @Create
+ public void validate()
+ {
+ if (entityManager==null)
+ {
+ throw new IllegalStateException("entity manager reference not set, use <transaction:entity-transaction entity-manager=...");
+ }
+ }
+
private javax.persistence.EntityTransaction getDelegate()
{
if (currentEntityManager==null)
@@ -58,6 +73,7 @@
public void begin() throws NotSupportedException, SystemException
{
+ log.debug("beginning JPA resource-local transaction");
//TODO: translate exceptions that occur into the correct JTA exception
assertNotActive();
initEntityManager();
@@ -75,11 +91,13 @@
public void commit() throws RollbackException, HeuristicMixedException,
HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
{
+ log.debug("committing JPA resource-local transaction");
assertActive();
+ javax.persistence.EntityTransaction delegate = getDelegate();
+ clearEntityManager();
boolean success = false;
try
{
- javax.persistence.EntityTransaction delegate = getDelegate();
if ( delegate.getRollbackOnly() )
{
delegate.rollback();
@@ -94,28 +112,30 @@
}
finally
{
- clearEntityManager();
synchronizations.afterTransactionCompletion(success);
}
}
public void rollback() throws IllegalStateException, SecurityException, SystemException
{
+ log.debug("rolling back JPA resource-local transaction");
//TODO: translate exceptions that occur into the correct JTA exception
assertActive();
+ javax.persistence.EntityTransaction delegate = getDelegate();
+ clearEntityManager();
try
{
- getDelegate().rollback();
+ delegate.rollback();
}
finally
{
- clearEntityManager();
synchronizations.afterTransactionCompletion(false);
}
}
public void setRollbackOnly() throws IllegalStateException, SystemException
{
+ log.debug("marking JPA resource-local transaction for rollback");
assertActive();
getDelegate().setRollbackOnly();
}
@@ -170,9 +190,19 @@
@Override
public void registerSynchronization(Synchronization sync)
{
+ if ( log.isDebugEnabled() )
+ {
+ log.debug("registering synchronization: " + sync);
+ }
assertActive();
+ //try to register the synchronization directly with the
+ //persistence provider, but if this fails, just hold
+ //on to it myself
+ if ( !PersistenceProvider.instance().registerSynchronization(sync, currentEntityManager) )
+ {
synchronizations.registerSynchronization(sync);
}
+ }
@Override
public boolean isConversationContextRequired()
1.5 +33 -20 jboss-seam/src/main/org/jboss/seam/transaction/HibernateTransaction.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: HibernateTransaction.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/transaction/HibernateTransaction.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- HibernateTransaction.java 24 Jun 2007 06:34:34 -0000 1.4
+++ HibernateTransaction.java 24 Jun 2007 19:40:33 -0000 1.5
@@ -11,12 +11,16 @@
import javax.transaction.SystemException;
import org.hibernate.Session;
+import org.hibernate.Transaction;
import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.core.Expressions.ValueExpression;
+import org.jboss.seam.log.LogProvider;
+import org.jboss.seam.log.Logging;
/**
* Support for the Hibernate Transaction API.
@@ -33,11 +37,21 @@
@BypassInterceptors
public class HibernateTransaction extends AbstractUserTransaction
{
+ private static final LogProvider log = Logging.getLogProvider(HibernateTransaction.class);
private ValueExpression<Session> session;
private Session currentSession;
private boolean rollbackOnly; //Hibernate Transaction doesn't have a "rollback only" state
+ @Create
+ public void validate()
+ {
+ if (session==null)
+ {
+ throw new IllegalStateException("session reference not set, use <transaction:hibernate-transaction session=...");
+ }
+ }
+
private org.hibernate.Transaction getDelegate()
{
if (currentSession==null)
@@ -59,6 +73,7 @@
public void begin() throws NotSupportedException, SystemException
{
+ log.debug("beginning Hibernate transaction");
assertNotActive();
initSession();
try
@@ -75,41 +90,35 @@
public void commit() throws RollbackException, HeuristicMixedException,
HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
{
+ log.debug("committing Hibernate transaction");
+ //TODO: translate exceptions that occur into the correct JTA exception
assertActive();
- try
- {
+ Transaction delegate = getDelegate();
+ clearSession();
if (rollbackOnly)
{
- getDelegate().rollback();
+ delegate.rollback();
throw new RollbackException();
}
else
{
- getDelegate().commit();
- }
- }
- finally
- {
- clearSession();
+ delegate.commit();
}
}
public void rollback() throws IllegalStateException, SecurityException, SystemException
{
+ log.debug("rolling back Hibernate transaction");
//TODO: translate exceptions that occur into the correct JTA exception
assertActive();
- try
- {
- getDelegate().rollback();
- }
- finally
- {
+ Transaction delegate = getDelegate();
clearSession();
- }
+ delegate.rollback();
}
public void setRollbackOnly() throws IllegalStateException, SystemException
{
+ log.debug("marking Hibernate transaction for rollback");
assertActive();
rollbackOnly = true;
}
@@ -166,6 +175,10 @@
@Override
public void registerSynchronization(Synchronization sync)
{
+ if ( log.isDebugEnabled() )
+ {
+ log.debug("registering synchronization: " + sync);
+ }
assertActive();
getDelegate().registerSynchronization(sync);
}
More information about the jboss-cvs-commits
mailing list