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也会先将修改的内容先写入数据库,然后再发出查询操作。

posted on 2019-03-15 15:15  HB1  阅读(313)  评论(0)    收藏  举报

导航