添加业务层和事务机制

配置声明式事务

  核心问题是:对哪些方法,采取什么样的事务策略

  配置步骤:

    1、导入tx和aop命名空间

    2、配置事务管理器,并为其注入SeesionFactory

    3、基于该事务管理器配置事务增强,指定事务规则

    4、定义切入点

    5、织入事务切面

 主单和明细单是1对多的关系

1、增加明细

  a、首先判断主单是否为null  如果为null 那么返回null

  b、判断主单的id是否==0,否的话:先把明细单添加进库,拿到主单的总金额totalAccount,然后加上详细单的总金额,

  一起添加到主单,更新主单数据,把明细单的数据都加到主单里

  判断,有主单就可以加明细了,然后把数据设置进去

  c、判断主单id是否==0,是==0:先把主单入库,后面添加否的(

    先把明细单添加进库,拿到主单的总金额totalAccount,然后加上详细单的总金额,

    一起添加到主单,更新主单数据,把明细单的数据都加到主单里)

  判断,没有主单,就得先添加主单然后再添加明细,添加数据

 1     <!-- 声明式事务   就是不用写代码记hibernateTransactionManager-->
 2     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 3         <property name="sessionFactory" ref="sessionFactory"></property>
 4     </bean>
 5     <!-- 事务的增强处理类 -->
 6     <tx:advice id="txAdive" transaction-manager="transactionManager">
 7         <tx:attributes>
 8             <tx:method name="add*" />
 9         </tx:attributes>
10     </tx:advice>
11     <aop:config>
12         <aop:pointcut expression="execution(public * cn.bdqn.service.*.*(..)))" id="myPointcut"/>
13         <aop:advisor advice-ref="txAdive" pointcut-ref="myPointcut"/>
14     </aop:config>    
 1 //增加明细
 2     @Override
 3     public ClaimVoucher addDetail(ClaimVoucherDetail cd) {
 4         ClaimVoucher master = cd.getMaster();
 5         if(master == null){
 6             return null;
 7         }
 8         if(master.getId() == 0){
 9             //没有主单就创建一个主单
10             this.claimVoucherDao.add(master);
11             /*if(true){
12                 throw new RuntimeException("test runtime error");
13             }*/
14             //有主单添加明细单
15             this.claimVoucherDetailDao.add(cd);
16             //拿到主单总金额
17             Double totalAccount = master.getTotalAccount();
18             //设置总金额
19             master.setTotalAccount(totalAccount+cd.getAccount());
20             //更新数据
21             this.claimVoucherDao.update(master);
22             //加入主单
23             master.getDetails().add(cd);
24 //            master=this.find(master.getId());
25         }else{
26             //有主单添加明细单
27             this.claimVoucherDetailDao.add(cd);
28             //拿到主单总金额
29             Double totalAccount = master.getTotalAccount();
30             //设置总金额
31             master.setTotalAccount(totalAccount+cd.getAccount());
32             //更新数据
33             this.claimVoucherDao.update(master);
34             //加入主单
35             master.getDetails().add(cd);
36 //            master=this.find(master.getId());
37         }
38         System.out.println(master);
39         return master;
40     }
41     //主单查找
42     @Override
43     public ClaimVoucher find(Serializable id) {
44         // TODO Auto-generated method stub
45         
46         ClaimVoucher c = this.claimVoucherDao.find(id);
47         Set<ClaimVoucherDetail> results = (Set<ClaimVoucherDetail>) this.claimVoucherDetailDao.getDetails(id);
48         System.out.println(results.size()+"..");
49         
50 //        Arrays.asList(results.toArray());
51         //把明细赋值到主单上
52         c.setDetails(results);
53 //        c.getDetails().addAll(results);
54         System.out.println("========"+c);
55         return c;
56     }
原文地址:https://www.cnblogs.com/xuerong/p/4923350.html