天天看点

【hibernate框架】核心开发接口-update方法

1.更新一个detached(脱管状态)对象,把它重新变成persistent(持久化状态),然后在数据库里做更新。

示例:

2.更新transient(游离状态)对象会报错

3.更新自己设定id的transient(游离状态)对象才可以

由于每次更新都要更新所有字段,在你不更新其他多余字段的情况下比较浪费资源,所以要考虑下面的“5.更新部分更改的字段”

4.persistent状态的对象只要设定不同字段就会发生更新。

在get出teacher对象时它发出了一条update语句,原因是我们改了它的name了。因为修改数据了,所以在提交(commit();)时,session会检查缓存和数据库的同步情况,当不同步时,就更新数据库至两者同步。不幸的是还是更新了所有字段。

5.更新部分更改的字段

a)xml设定property标签的update属性,annotation设定@column的updatable属性,不过这种方式很少用,因为不灵活。

annotation做法示例:

在不需要更新的字段或字段的get方法上加column(updatable=false)注解即可。

xml做法示例:

<property update="false" .../>

b)使用xml中的dynamic-update,jpa1.0 annotation没有对应的属性(等待hibernate扩展)

xml示例:

例如 <class name="student" table="student" dynamic-update="true">

对student对象的数据实行动态更新(没改过就不更新了)。

这里看到hibernate发出的sql语句只更新了一个属性:

update

        student 

    set

        age=? 

    where   //联合主键

        id=? 

        and name=?

题外话:

对于dynamic-update,同一个session可以,跨session不行,不过可以用merge()代替原来的update。merge()将这个对象合并到数据库中,原来没改的就没必要合并了(比较不是从缓存中比较的,而是从数据库load出数据去比较,效率并没有提高多少)(不重要)

c)使用hql(ejbql)(建议)

观察hibernate发出的sql语句确实如此,很方便。记住,hql是面向对象的sql语句。

总结:你要觉得全更新字段效率可以不考虑,就可以不去理会它(说不定数据库中也会进行优化,没改的它就不改了)。

转载请注明出处:http://blog.csdn.net/acmman