Hibernate 的 受管的PO 设置为游离后进行修改 再保存
Hibernate有一个特性,受管的PO(也就是通过find或其他什么操作从数据库中取出来的那个PO)进行任何的修改,在后面做查询前会先将修改写入到数据库中,然后再执行查询操作。
这样会导致一个问题,我们保存PO时,唯一性检查是在保存前做的,该检查会发出一个查询操作。
如果该PO是被托管的,而且修改过,那么Hibernate会自动先将修改的数据通过update语句写入到数据库。也就是说还没进行唯一性检查就写入了数据库,如果有唯一性冲突,此时就已经报错了。
如果避免这种情况呢?
比较好的方法是,尽量别去修改托管的PO,而是new 一个新的PO来修改。
实在不想那么麻烦的话,就只能用下面的方法了:
1、先从Hibernate包装的受管的PO中,拿到真实的PO.
2、再将该真实的PO进行 detach
3、然后再进行修改
4、最后保存
SysUser po_DB = sysUserService.get(zenSysUserVO.getSysUser().getId()); //查出PO SysUser po_Real = (SysUser) Hibernate.unproxy( po_DB ); //获取真实PO sysUserService.getDao().detach(po_Real); //游离该真实PO po_Real.setPassword("123"); po_Real.setLoginName("admin2"); sysUserService.save(cr,po_Real); //保存修改后的真实PO
注意:
1、如果直接将托管的PO(即 po_DB)进行 detach,后面对该PO进行属性修改时,会报错: no session ...
2、如果真实PO不detach,而直接修改保存,则和直接修改保存受管PO一样,Hibernate也会先将修改的内容先写入数据库,然后再发出查询操作。
浙公网安备 33010602011771号