问题
当开启事务时,我们需要更新一个表对象数据时,可能我们并没有所有的表对象的数据,这时我们需要先查看他的原始数据,然后更新数据到我们重新封装的实例对象中去。这时如果我们直接去save()或者update()这个对象就回报这样的错。
org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session
原因
因为在查询对象数据的时候session中就已经保了这个对象,现在又要再次去更新或者保存这个对象,hibernate就会不知道到底哪一个才是我们需要去操作的对象。因为这时session中有了两个相同id但是不同的实体,这是我们需要先删除session中存在的对象。
删除session中缓存对象的方式:
1.clear()(不推荐使用,会直接清空session,操作影响太大)
2.evict()(定点删除session中的某个对象)
这个也是我自己的做法,这样删除影响最小。
附上代码:
//通过物料编号获取物料id
String hql = "from CGeneralMaterial cgm where cgm.materialNo='" + materialNo + "'";
List<CGeneralMaterial> materialIdList = dao.executeQuery(hql);
Integer materialId = materialIdList.get(0).getMaterialId();
saveMaterial.setMaterialId(materialId);
/**
* 这里是删除session中相同的对象
*/
session.evict(materialIdList.get(0));//少了这句就会报上面的错误
dao.update(saveMaterial);