Chinaunix首页 | 论坛 | 博客
  • 博客访问: 98971
  • 博文数量: 73
  • 博客积分: 3971
  • 博客等级: 中校
  • 技术积分: 875
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-09 20:57
文章分类

全部博文(73)

文章存档

2008年(73)

我的朋友
最近访客

分类:

2008-06-27 09:42:28

有时候当你使用Spring来管理事务时,会为每个Service层的方法都单独自动启动和关闭事务。
这时在该方法内查询出的操作,例如我在该方法内查询出了一组对象,并且使用这些对象并修改这些对象的信息,但我并不想保存他们的修改,我只想试运算。可在一个Spring管理的事务时,整个方法就是一个事务,所以你操作对象的属性Spring会自动保存你的修改。这时可以使用Hibernate提供的拆除对象的方法,该方法可以从Session中把查询出的对象拆除。这样就OK了,问题解决了。

但要记得千万不要在把Hibernate的拆除方法又封装到Service层,因为Spring的事务管理经常都是真对方法的,所以你把它封装到Service层,然后从第一个Service调第二个Service的拆除方法,这时还是会更新数据库的。所以我是把拆除方法都封到基DAO里了。(所以以下的问题得到了解决)

public Object SaveUpdataObject(List oldList,List obj) {
   Object obj1 = null;

   String args[]={((SxBdInfo)oldList.get(0)).getClientId()+""};
   //拆除对象的使用方法及例子:evictFindObjects
   //错误的现象:
   List list = this.getSxBdInfoDao().findObjects(args,this.getSxBdInfoDao().FIND_SX_BD_INFO_CLIENT_ID);


   //List list = this.getSxBdInfoDao().evictFindObjects(args,this.getSxBdInfoDao().FIND_SX_BD_INFO_CLIENT_ID); //正确的方式
   if(list.size()<=oldList.size()){
    String args1[]={((SxBdInfo)oldList.get(0)).getUiId()+"",((SxBdInfo)oldList.get(0)).getSbiTbrName()};
    ClientInfo ci =(ClientInfo) this.getSxBdInfoDao().findObject(args1,this.getClientInfoDao().FIND_USER_CLIENT);
    if(ci!=null){
     //更新客户标记
     ci.setCiFlag(0);
     this.getSxBdInfoDao().SaveUpdataObject(ci);
    }
   }

  
//   String args[]
//   this.getClientInfoDao().findClientInfo()
   for(int i=0; i    obj1 = this.getSxBdInfoDao().SaveUpdataObject(obj.get(i));
   }
   return obj1;//返回保单头信息
}


阅读(506) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~