Transaction Management with Spring in AOP
Case
You have a couple of Hibernate DAOs, in which a huge amount of code is duplicated: begin transactions, try/catch, close transactions, etc.
You would like to factorize your code.
Fix
- Define a
SessionFactory
, let’s sayhibernateSessionFactory
, with your own settings.[xml]<bean id="hibernateSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">(…)</bean>[/xml] - Define a
TransactionManager
:[xml]<bean id="hibernateTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="hibernateSessionFactory" />
</property>
</bean>[/xml] - Define transactions advices:
[xml]<tx:advice id="hibTxManager" transaction-manager="hibernateTransactionManager">
<tx:attributes>
<tx:method name="*" propagation="NEVER" read-only="true" isolation="READ_COMMITTED" rollback-for="find*" no-rollback-for="dontFind*"/>
</tx:attributes>
</tx:advice>[/xml] name="*"
–> the aspect will apply to all methods. You may filter on patterns such as find*, get*, save*, etc.propagation="NEVER"
–> hints the propagation level. Available options areREQUIRED, SUPPORTS, MANDATORY,REQUIRES_NEW, NOT_SUPPORTED, NEVER, NESTED
.isolation="READ_COMMITTED"
–>rollback-for="find*"
–> rollback all transactions following the given patternno-rollback-for="dontFind*"
–> exceptions for rollbacks- Define the AOP configuration:
[xml]<aop:config>
<aop:pointcut id="hibOperation"
expression="execution(* com.lalou.jonathan.dao.hibernate.Hibernate*.*(..))" />
<aop:advisor pointcut-ref="hibOperation" advice-ref="hibTxManager" />
</aop:config>[/xml]
Many thanks to Jean-Pierre ISOARD for his help on this subject.