dynamic-update="true".dynamic-insert="true"的使用情况。

来源:互联网 发布:win8无法连接windows 编辑:程序博客网 时间:2024/05/29 06:52

    对于dynamic-insert的理解是当需要进行插入或保存操作的持久化实体时,如果该实体中的某一个属性为NULL,那么在插入语句中就不包括该属性,比  如一个Person有两个属性,一个是name,一个是description,那么当实例化一个Person时,如果description为NULL,那么Hibernate向数据库发送的sql语句就是insert into person(name) values(?)。配置文件中如果没有这一属性,默认为false .


    对于dynamic-update是重点需要讲解的地方,这里的情况比较复杂。首先先来明确这一属性的含义,如果该属性设置为true,表明Hibernate在向数据库发送更新语句时只会包括属性值发生改变的属性,其实要说明的就是当将该属性设置为true,并不表明你的设置就起作用了,这取决于你使用的更新方法和查找与更新操作是否处在同一个session当中。对于更新操作而言,分三步走,第一步是查找出需要更新的实体,第二步是更新需要更新的属性,第三步是保存更新实体。如果这三步操作没有在同一个session的管理之下,那么即便设置了dynamic-update=true,这个属性也是不会起任何作用的,当你在保存更新时,Hibernate向数据库发送的更新语句还是会包括该实体的所有属性。所以当你设置了dynamic-update=true时,你需要确保你的三步操作是在同一个session中的。当然为了确保当进行更新操作时只更新那些修改了的属性,还有其它一些做法,但需要发送的sql语句也就不止一条更新语句那么简单而已,这需要你经过权衡后进行适当的选择。下面就来讲解还有其它哪些做法能保证在进行更新操作时只更新那些修改了的属性。

  

 方法1:在配置文件class元素后面加上一个属性值,select-before-update="true",这样就保证了在更新前先查一次数据库,保证了在查找更新都在同一个session中。

     

 方法2:使用session自带的merge方法。这个方法和上面的配置效果一样。如何属性值有改变将会向数据库发送两条语句(查找和更新),无改变不会。

 

  应用场景:当一个表有许多列(表结构又很复杂),而每次总是更新那么一两列,那么这种如果开启了动态更新,就必然会提升效率。

  我在做项目的时候使用了该属性虽然有效但是总是达不到预期的效果(我的流程比较复杂以至于让我不知道怎么去保证查找和更新在同一个session中),最后放弃了使用,改为了hql语句(最灵活的使用),并且我的表结构并不复杂。最后想说一点,当表结构并不复杂的情况下,我们尽量使用hql语句进行更新。能不用则不用。

0 0
原创粉丝点击