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