天天看點

【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