`

spring中如何做事务?(最原始的做法 只供参考)

阅读更多
spring中如何做事务?(最原始的做法 只供参考)  
之前说的都要实现接口,对Api的依赖性强 属于侵入式的
接下来讲下非侵入式的代码如何实现:
                         
针对环绕事务处理 , 要指明 ProceedingJoinPoint 参数
ProceedingJoinPoint 相当于事件 , 此参数会带着触发该事件的源信息
obj = pjp.proceed() ;在这里等同于调用add*()方法中的代码(参考配置)
配置如下:
    <bean id="hibernateUtil" class="com.cs.util.HibernateUtil" ></bean>   
    <bean id="teamDao" class="com.cs.dao.TeamDaoImpl">
    <property name="hibernateUtil" ref="hibernateUtil" />
    </bean>
    <bean id="personDao" class="com.cs.dao.PersonDaoImpl">
<property name="hibernateUtil" ref="hibernateUtil" />
<property name="teamDao" ref="teamDao" />
    </bean>  
    <bean id="logAdvice" class="com.cs.advice.LogAdvice" />
    <bean id="transactionAspect" class="com.cs.advice.TransactionAspect"></bean>
    <aop:config>
    <aop:pointcut id="addMethod" expression="execution(* add*(..))" />
    <aop:pointcut id="afterMethod" expression="execution(* update*(..))" />
    <aop:aspect ref="logAdvice">
    <aop:before pointcut-ref="addMethod"  method="log" />
    <aop:after pointcut-ref="afterMethod"  method="afterLog" />
   
    </aop:aspect>

    <aop:aspect ref="transactionAspect">
    <aop:around pointcut-ref="addMethod" method="invoke"  />
//针对所有的add*方法都处理了事务(抓哟针对的是级联事务,session是如何传播的),也可以用这种方法做日志,
    </aop:aspect>
    </aop:config>
transactionAspect的代码如下:

public class TransactionAspect {
private HibernateUtil hibernateUtil ;
private int count = 0 ;
/** count 用于控制在父类对象开启的事务 在父类事务结束时关闭,
**如果不用count控制 , 则父类对象开启的事务会在子类对象的事务处理完毕后关闭
*原因:因为在spring中配置的bean 都是单例,请注意
*/

public HibernateUtil getHibernateUtil() {
return hibernateUtil;
}
public void setHibernateUtil(HibernateUtil hibernateUtil) {
this.hibernateUtil = hibernateUtil;
}
    /**针对环绕事务处理 , 要指明 ProceedingJoinPoint 参数
     * ProceedingJoinPoint 相当于事件 , 此参数会带着源信息
     * obj = pjp.proceed() ;在这里等同于调用add*()方法中的代码(参考配置)
     */
public Object invoke(ProceedingJoinPoint pjp) throws Throwable {
Object obj = null ;
Session session = null ;
Transaction tx = null ;

try {
session = hibernateUtil.getSession() ;
tx = session.getTransaction() ;
count++ ;
if (!tx.isActive()){
System.out.println("事务开启" + pjp.getTarget().getClass().getName()) ;
tx.begin() ;
}

obj = pjp.proceed() ;  // *****************关键代码*********************************
count-- ;
if (tx.isActive() && count <= 0){
tx.commit() ;
System.out.println("事务结束" + pjp.getTarget().getClass().getName()) ;
}
} catch (RuntimeException e) {
System.out.println(e.getMessage());
e.printStackTrace() ;
tx.rollback() ;
}finally{
return obj;
}
}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics