使用Spring-Aop实现Hibernate事务管理

1.当你发现一些方法同时需求某项共同的功能时那么,你应该想到的是Aop。面向方面,把共同的功能以方面的形式切入方法中

         术语:

                   advice,advisor,intercepter-我一般都把他们理解成拦截器

                    point-cut 即为我们需要切入方面的点。

 

2.在ssh开发当中,我们把业务放在struts的Action当中,我们同时希望事务控制也能在业务当中,所以我们可以对dao的实现方法切入我们的方面。

 

          下面是我的配置文件,带你简单了解下spring配置Hibernate的事务:

 

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  3. <beans>
  4.     <bean id="dataSource"
  5.         class="org.apache.commons.dbcp.BasicDataSource">
  6.         <property name="driverClassName"
  7.             value="com.mysql.jdbc.Driver">
  8.         </property>
  9.         <property name="url" value="jdbc:mysql://localhost:3306/mldn"></property>
  10.         <property name="username" value="root"></property>
  11.         <property name="password" value="yudylaw"></property>
  12.     </bean>
  13.     <bean id="sessionFactory"
  14.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  15.         <property name="dataSource">
  16.             <ref bean="dataSource" />
  17.         </property>
  18.         <property name="hibernateProperties">
  19.             <props>
  20.                 <prop key="hibernate.dialect">
  21.                     org.hibernate.dialect.MySQLDialect
  22.                 </prop>
  23.                 <prop key="hibernate.show_sql">true</prop>
  24.                 <prop key="hibernate.connection.autocommit">false</prop>
  25.             </props>
  26.         </property>
  27.         <property name="mappingResources">
  28.             <list>
  29.             <value>yudylaw/tran/vo/Tran.hbm.xml</value>
  30.             </list>         
  31.         </property>
  32.     </bean>
  33.     <bean id="transactionManager"
  34.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  35.         <property name="sessionFactory">
  36.             <ref local="sessionFactory"/>
  37.         </property>
  38.     </bean>
  39.     <bean id="trandaoimplTarget" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  40.      <property name="transactionManager">
  41.             <ref local="transactionManager"/>
  42.         </property>
  43.         <property name="target">
  44.             <ref local="trandaoimpl"/>
  45.         </property>
  46.         <property name="transactionAttributes">
  47.             <props>             
  48.                 <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
  49.             </props>
  50.         </property>     
  51.     </bean>
  52.     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  53.         <property name="sessionFactory">
  54.             <ref bean="sessionFactory"/>
  55.         </property>
  56.     </bean>
  57.     <bean id="trandao" class="yudylaw.tran.DAO.TranDAO" abstract="true">        
  58.     </bean>
  59.     <bean id="trandaoimpl" class="yudylaw.tran.DAOImpl.TranDAOImpl" parent="trandao">
  60.         <property name="hibernateTemplate">
  61.             <ref bean="hibernateTemplate"/>
  62.         </property>
  63.     </bean>
  64.     <bean name="/tran" class="yudylaw.tran.struts.action.TranAction">
  65.         <property name="trandao">
  66.             <ref bean="trandaoimplTarget"/>
  67.         </property>
  68.     </bean>
  69. </beans>

TranAction的核心代码:

  1. public ActionForward execute(ActionMapping mapping, ActionForm form,
  2.             HttpServletRequest request, HttpServletResponse response) {
  3.         try {
  4.             Tran tran = new Tran(11004,"andy");
  5.             this.trandao.addTran(tran);
  6.             System.out.println("自动提交才对");
  7.             //自动提交
  8.         } catch (Exception e) {
  9.             System.out.println("应该回滚才对");
  10.             //自动回滚
  11.             e.printStackTrace();
  12.         }
  13.         return null;
  14.     }

这样Hibernate的事务就代理成功了,只要trandao的add*方法抛出异常,那么事务会自动回滚。

 

几点注意的地方:

           target属性:就是目标对象,既是被代理对象,这里是trandaoimpl

           hibernate的自动提交一定得关掉

  1.     <bean name="/tran" class="yudylaw.tran.struts.action.TranAction">
  2.         <property name="trandao">
  3.             <ref bean="trandaoimplTarget"/>
  4.         </property>
  5.     </bean>

这里trandao的参考bean应该是代理对象,这样事务拦截器就切入了trandaoimpl方法,实现了代理功能。

 

           AOP的实际方向应该是:代理对象---->拦截器--->目标对象--->拦截器   (拦截器可以为多个,这里只有一个拦截器)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值