hibernate中update带来的苦恼

来源:互联网 发布:知轩藏书盗墓笔记 编辑:程序博客网 时间:2024/06/14 23:15

这两天lz一直忙着做系统的数据的修改功能,今天遇到了一个问题跟大家分享下。

lz是根据主键id通过hibernate获取这个对象的属性,修改功能嘛,肯定得set某些属性,因为调用接口失败就直接返回了,还没到执行update的那行代码,但lz一看控制台 吓尿了 打出了update *** set *** where id=**,一开始lz检查代码是不是某些地方级联了update方法,发现不对,请教了经验丰富的同事,也没发现问题,lz就开始怀疑是不是hibernate机制,如果查询出这个对象,修改了属性,就算没执行update但是它会默认帮你执行。后来通过百度证实了lz的猜想。原来是hibernate三种状态在作怪,lz一想 以前好像分享过类似的文章,当时都没仔细看过,顿时那个后悔啊 。

lz先解释下是什么原因吧,hibernate通过get等方法获取的对象是持久态的,当你set方法改变属性后,不管你后来有没update,事务一结束,它会跟数据库里的对象进行比较,如果有修改就会执行update语句。有两种解决办法 第一种就是把获取的持久化对象转换成游离态,这样hibernate就不会帮你update了。通过sessionFactory.getCurrentSession().evict(object); 就可以了,可是lz的项目里所以的crud方法都是基础core封装好的,无法直接修改。第二种方法就是用merge();新建一个对象(临时态),把需要修改的对象的主键set到这个新建的对象中,这样当你merge这个新对象是会把这个对象和库的比较,如果属性一样就不变,不然就会执行update语句。这样就解决了lz的问题。







0 0
原创粉丝点击