天天看點

Hibernate學習筆記 之 持久化對象的狀态一、持久化實體二、根據主鍵加載持久化實體二、更新持久化實體三、更新脫管實體四、删除持久化實體

Hibernate學習筆記 之 持久化對象的狀态一、持久化實體二、根據主鍵加載持久化實體二、更新持久化實體三、更新脫管實體四、删除持久化實體

瞬态、持久态、脫管 概念見:http://blog.csdn.net/fanfan4569/article/details/53054683

一、持久化實體

save() 方法 與 persist()

Hibernate學習筆記 之 持久化對象的狀态一、持久化實體二、根據主鍵加載持久化實體二、更新持久化實體三、更新脫管實體四、删除持久化實體

  注:save() 帶傳回值

Hibernate學習筆記 之 持久化對象的狀态一、持久化實體二、根據主鍵加載持久化實體二、更新持久化實體三、更新脫管實體四、删除持久化實體

  注:persist() 不帶傳回值

差別:

save()方法需要立即傳回持久化對象的辨別屬性值,是以程式執行save()方法會立即将持久化對象對應的資料插入資料庫;而persist()則保證當它在一個事務外部被調用時,并不立即轉換insert語句。這個功能是很有用的,尤其是需要一個長會話流程的時候,persist()方法就顯得尤為重要。

二、根據主鍵加載持久化實體

load() 與 get()

User user = session.get(User.class, "4028dc8158432b8a0158432b8c240000");
User user = session.load(User.class, "4028dc8158432b8a0158432b8c240000");
           
Hibernate學習筆記 之 持久化對象的狀态一、持久化實體二、根據主鍵加載持久化實體二、更新持久化實體三、更新脫管實體四、删除持久化實體

  如果沒有比對的資料庫記錄,load()方法可能抛出HibernateException()異常;如果在持久化注釋中指定了延遲加載,則load()方法會傳回一個未初始化的代理對象(可以了解為持久化對象的替身),這個代理對象并沒有加載資料記錄,知道程式調用該代理對象的某方法時,Hibernate才會去通路資料庫。(如果希望在某對象中建立一個指向另一個對象的關聯,又不想從資料庫中裝載該對象的同時立即裝載所關聯的對象,延遲加載方式就很有用。)

Hibernate學習筆記 之 持久化對象的狀态一、持久化實體二、根據主鍵加載持久化實體二、更新持久化實體三、更新脫管實體四、删除持久化實體

  get()方法會立刻通路資料庫,如果沒有對應的記錄,get()方法傳回null,而不是傳回一個代理對象。

二、更新持久化實體

Hibernate學習筆記 之 持久化對象的狀态一、持久化實體二、根據主鍵加載持久化實體二、更新持久化實體三、更新脫管實體四、删除持久化實體
User user = session.load("User.class", "4028dc8158432b8a0158432b8c240000");
user.setAddress("中國");
session.flush();
           

  這上面相當于一條查詢指定記錄的select語句,另一條用于修改該記錄的update語句。

  Hibernate通常的處理流程是:從資料庫裡加載記錄—>将資訊範松到表現層供使用者修改—->将所做修改重新儲存到資料庫。需要2條SQL語句。

三、更新脫管實體

User user = firtstSession.load("User.class", "4028dc8158432b8a0158432b8c240000");
user.setAddress("中國");
Session secondSession = ...
//儲存脫管對象所做的修改
secondSession.update(user);
           

  如果不清楚該對象是否曾經持久化過,可以選擇使用updateOrSave()

Hibernate學習筆記 之 持久化對象的狀态一、持久化實體二、根據主鍵加載持久化實體二、更新持久化實體三、更新脫管實體四、删除持久化實體

  merge()方法也可将程式對脫管對象所做的修改儲存到資料庫。差別在于session.update(user),user對象會變成持久化狀态;而執行session.merge(user),user對象依然不是持久化狀态,user對象依然不會被關聯到Session上,merge()方法會傳回user對象的副本——-該副本處于持久化狀态。

//使用load()或get()方法加載持久化對象時,還可指定一個“鎖模式”
//LockOptions對象代表“所模式”,LockOptions提供READ和UPGRADE兩個靜态屬性來代表共享、修改鎖
User user = Session.get(User.class, pk, LockOptions.UPGRADE);
           

  Session.LockRequest()的lock()方法也将某個脫管對象重新持久化,但該脫管對象必須是沒有修改過的!

四、删除持久化實體

User user = session.load("User.class", "4028dc8158432b8a0158432b8c240000");
session.delete(user);
           

  一旦删除了該持久化執行個體,該持久化執行個體對應的資料記錄也将被删除;

繼續閱讀