分类:
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
}
return obj1;//返回保单头信息
}