hibernate dynamic-update="true"属性不起作用原因(转载)
原文地址:
由于我在action层使用了注解多例@scope("prototype"),而在dao层默认为单例......
我把sessionfactory写在了一个通用的basedao实现类中,
而在dao实现类中直接继承了basedao实现类,同时继承了sessionfactory...
本人能力有限,尚不知道与以上的设计有无紧要关系......
在网上搜索到的文章部分内容如下:
对于dynamic-update是重点需要讲解的地方,这里的情况比较复杂。
首先先来明确这一属性的含义,如果该属性设置为true,表明hibernate在向数据库发送更新语句时只会包括属性值发生改变的属性,其实要说明的就是当将该属性设置为true,并不表明你的设置就起作用了,这取决于你使用的更新方法和查找与更新操作是否处在同一个session当中。
对于更新操作而言,分三步走,第一步是查找出需要更新的实体,第二步是更新需要更新的属性,第三步是保存更新实体。
如果这三步操作没有在同一个session的管理之下,那么即便设置了dynamic-update=true,这个属性也是不会起任何作用的,当你在保存更新时,hibernate向数据库发送的更新语句还是会包括该实体的所有属性。
所以当你设置了dynamic-update=true时,你需要确保你的三步操作是在同一个session中的。
当然为了确保当进行更新操作时只更新那些修改了的属性,还有其它一些做法,但需要发送的sql语句也就不止一条更新语句那么简单而已,这需要你经过权衡后进行适当的选择。
下面就来讲解还有其它哪些做法能保证在进行更新操作时只更新那些修改了的属性。
第一种做法就是在配置文件中的class元素上再加上另一个属性值,select-before-update="true",这个属性表示当我们在进行更新操作时,会先去数据库中查找这个实体对象的数据,这样就保存了当我们在进行更新操作时,查找后更新始终都在同一个session当中。
第二种是更改更新操作的方法,使用session为我们提供的merge方法,当我们实用该方法时,是不需要配置dynamic-update=true属性的。该方法在更新对象时所做的操作和前一种方法是一样的,会先从数据库中查找该实体对象数据再向数据库发送只更新更改过的属性的更新操作,同样的会发送两条sql语句。但是如果所有对象属性都没有变化时,那么不会发送更新语句。