From ad49703afe4c12e77e80e65611d05f8e5786623b Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Tue, 28 Sep 2010 07:29:14 +0000 Subject: [PATCH] solving the hibernate transaction problem. New solution with aspects. git-svn-id: https://svn.argeo.org/slc/trunk@3806 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../META-INF/MANIFEST.MF | 2 + .../client/aspects/ContentProviderAspect.java | 49 ++++++++++++------- .../client/core/ProcessListTableContent.java | 7 +-- .../META-INF/MANIFEST.MF | 2 + .../META-INF/spring/core.xml | 4 +- .../META-INF/spring/transaction-osgi.xml | 3 +- 6 files changed, 43 insertions(+), 24 deletions(-) diff --git a/eclipse/plugins/org.argeo.slc.client.core/META-INF/MANIFEST.MF b/eclipse/plugins/org.argeo.slc.client.core/META-INF/MANIFEST.MF index 4203255fa..3860d2ac4 100644 --- a/eclipse/plugins/org.argeo.slc.client.core/META-INF/MANIFEST.MF +++ b/eclipse/plugins/org.argeo.slc.client.core/META-INF/MANIFEST.MF @@ -12,6 +12,8 @@ Import-Package: org.apache.commons.io;version="1.4.0", org.argeo.slc.process, org.aspectj.lang, org.aspectj.lang.annotation, + org.hibernate, + org.hibernate.classic, org.springframework.beans.factory;version="2.5.6.SEC01", org.springframework.transaction;version="2.5.6.SEC01" Require-Bundle: org.springframework.orm;bundle-version="2.5.6" diff --git a/eclipse/plugins/org.argeo.slc.client.core/src/main/java/org/argeo/slc/client/aspects/ContentProviderAspect.java b/eclipse/plugins/org.argeo.slc.client.core/src/main/java/org/argeo/slc/client/aspects/ContentProviderAspect.java index 82290aff6..1651efaeb 100644 --- a/eclipse/plugins/org.argeo.slc.client.core/src/main/java/org/argeo/slc/client/aspects/ContentProviderAspect.java +++ b/eclipse/plugins/org.argeo.slc.client.core/src/main/java/org/argeo/slc/client/aspects/ContentProviderAspect.java @@ -1,29 +1,45 @@ package org.argeo.slc.client.aspects; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; +import org.hibernate.LockMode; +import org.hibernate.SessionFactory; +import org.springframework.orm.hibernate3.HibernateTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; @Aspect public class ContentProviderAspect { - // private final static Log log = LogFactory - // .getLog(ContentProviderAspect.class); + private final static Log log = LogFactory + .getLog(ContentProviderAspect.class); + + private SessionFactory sessionFactory; + private HibernateTransactionManager transactionManager; // Advices - @Around("execution (* getLabel(..))") + @Around("execution (* org.argeo.slc.client.core.*.get*(Object, int))") public Object aroundGetVariable(ProceedingJoinPoint thisJoinPoint) throws Throwable { - //log.debug("***************** IN THE ASPECT. Before proceed"); + + // log.debug("***************** IN THE ASPECT. Before proceed"); // log.debug("We have an open session : " // + sessionFactory.getCurrentSession().isOpen()); // log.debug("Current transaction is active : " // + sessionFactory.getCurrentSession().getTransaction() // .isActive()); - Object o = thisJoinPoint.proceed(); - //log.debug("**************** IN THE ASPECT. After proceed"); - return o; + Object o = thisJoinPoint.getArgs()[0]; + sessionFactory.getCurrentSession().beginTransaction(); + // reassociate a transient instance with a session (LockMode.NONE). + sessionFactory.getCurrentSession().lock(o, LockMode.NONE); + Object result = thisJoinPoint.proceed(); + sessionFactory.getCurrentSession().getTransaction().commit(); + + // log.debug("**************** IN THE ASPECT. After proceed"); + return result; } // @Before("methodeTrace()") @@ -44,14 +60,13 @@ public class ContentProviderAspect { // } // IoC - // public void setSessionFactory(SessionFactory sessionFactory) { - // this.sessionFactory = sessionFactory; - // } - // - // public void setTransactionManager( - // PlatformTransactionManager transactionManager) { - // if (transactionManager instanceof HibernateTransactionManager) - // this.transactionManager = (HibernateTransactionManager) - // transactionManager; - // } + public void setSessionFactory(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + public void setTransactionManager( + PlatformTransactionManager transactionManager) { + if (transactionManager instanceof HibernateTransactionManager) + this.transactionManager = (HibernateTransactionManager) transactionManager; + } } diff --git a/eclipse/plugins/org.argeo.slc.client.core/src/main/java/org/argeo/slc/client/core/ProcessListTableContent.java b/eclipse/plugins/org.argeo.slc.client.core/src/main/java/org/argeo/slc/client/core/ProcessListTableContent.java index e02f1e074..cb651e9fc 100644 --- a/eclipse/plugins/org.argeo.slc.client.core/src/main/java/org/argeo/slc/client/core/ProcessListTableContent.java +++ b/eclipse/plugins/org.argeo.slc.client.core/src/main/java/org/argeo/slc/client/core/ProcessListTableContent.java @@ -28,10 +28,11 @@ public class ProcessListTableContent implements TableContent { switch (i) { case 0: - // return se.getStartDate().toString(); + return se.getStartDate().toString(); // Workaround to insure that we have no Lazy Init PB - return slcExecutionDao.getSlcExecution(se.getUuid()).getStartDate() - .toString(); + // return + // slcExecutionDao.getSlcExecution(se.getUuid()).getStartDate() + // .toString(); case 1: return se.getHost(); case 2: diff --git a/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/MANIFEST.MF b/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/MANIFEST.MF index 4e6e16868..84e349c3d 100644 --- a/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/MANIFEST.MF +++ b/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/MANIFEST.MF @@ -7,6 +7,8 @@ Import-Package: org.aopalliance.aop;version="1.0.0", org.argeo.slc.client.aspects, org.argeo.slc.client.core, org.argeo.slc.dao.process;version="0.13.0.SNAPSHOT-r3777", + org.hibernate, + org.hibernate.classic, org.springframework.aop;version="2.5.6.SEC01", org.springframework.aop.aspectj.annotation;version="2.5.6.SEC01", org.springframework.aop.framework;version="2.5.6.SEC01", diff --git a/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/spring/core.xml b/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/spring/core.xml index 7250277e0..292f19bec 100644 --- a/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/spring/core.xml +++ b/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/spring/core.xml @@ -13,7 +13,7 @@ - + + diff --git a/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/spring/transaction-osgi.xml b/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/spring/transaction-osgi.xml index dd8484c8b..80c6105e6 100644 --- a/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/spring/transaction-osgi.xml +++ b/eclipse/plugins/org.argeo.slc.client.hibernate/META-INF/spring/transaction-osgi.xml @@ -9,6 +9,5 @@ - + \ No newline at end of file -- 2.39.5