添加业务层和事务机制
配置声明式事务
核心问题是:对哪些方法,采取什么样的事务策略
配置步骤:
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 }