diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/OpenBISHibernateTransactionManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/OpenBISHibernateTransactionManager.java index aa194994e985755e34ded5590635db1d7c86e9bf..8b505c4604b22c01d398cda524d1c64a06739606 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/OpenBISHibernateTransactionManager.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/OpenBISHibernateTransactionManager.java @@ -20,9 +20,12 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.WeakHashMap; +import net.lemnik.eodsql.QueryTool; + import org.hibernate.Interceptor; import org.hibernate.Transaction; import org.springframework.beans.BeansException; +import org.springframework.jdbc.datasource.JdbcTransactionObjectSupport; import org.springframework.orm.hibernate3.HibernateTransactionManager; import org.springframework.orm.hibernate3.SessionHolder; import org.springframework.transaction.support.DefaultTransactionStatus; @@ -32,8 +35,12 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; /** - * The implementation of {@link HibernateTransactionManager}, that creates a new - * EntityValidationInterceptor for each hibernate session. + * An implementation of {@link HibernateTransactionManager} that: + * <ul> + * <li>creates a new EntityValidationInterceptor for each hibernate session,</li> + * <li>injects (and clears) the connection of the current transaction as default managed database + * connection into EoDSQL.</li> </li> + * </ul> * * @author Jakub Straszewski */ @@ -61,9 +68,23 @@ public class OpenBISHibernateTransactionManager extends HibernateTransactionMana WeakHashMap<Transaction, String> rolledBackTransactions = new WeakHashMap<Transaction, String>(); + @Override + protected Object doGetTransaction() + { + final JdbcTransactionObjectSupport transaction = + (JdbcTransactionObjectSupport) super.doGetTransaction(); + if (isExistingTransaction(transaction) == false && transaction.hasConnectionHolder()) + { + QueryTool.setManagedDatabaseConnection(transaction.getConnectionHolder() + .getConnection()); + } + return transaction; + } + @Override public void rollbackTransaction(Transaction tx, String reason) { + QueryTool.clearManagedDatabaseConnection(); tx.rollback(); rolledBackTransactions.put(tx, reason); } @@ -81,6 +102,7 @@ public class OpenBISHibernateTransactionManager extends HibernateTransactionMana @Override protected void doCommit(DefaultTransactionStatus status) { + QueryTool.clearManagedDatabaseConnection(); Transaction tx = null; try {