1. 程式人生 > >Hibernate Session 操作資料庫的方法詳解

Hibernate Session 操作資料庫的方法詳解

在講Session 方法之前我們必須弄清在Hibernate 中一個例項物件的三種狀態。

① 自由狀態(transisent)又叫瞬時狀態:物件被例項化但沒有給物件的OID 屬性賦值。

User user = new User();     這時的user 處於自由狀態。

② 遊離狀態(detached)又叫託管狀態:例項化物件的OID 屬性也被賦值。

user.setId(1);          這時的user 處於遊離狀態。

③ 持久化狀態(persistent):僅與一個Session 相關聯。

session.save(user);  這時user 處於持久化狀態。

粗略地可以這樣認為:當一個例項物件的OID 被賦值,並且在資料庫中葉有這樣一條記錄存在,那麼這個物件就是持久物件;當一個例項物件的OID 也被賦值,但在資料庫中沒有這樣的一條記錄時,該物件就處於遊離狀態。

現在我們來講當Session 中的方法來操作遊離物件和持久物件有什麼區別:

㈠ 操作遊離物件

User user = new User();
user.setId(1);
user.setName("Joe");

save() 方法:

session.save(user);
這時hibernate 會執行一條SQLINSERT 語句。當資料庫存在這條記錄時,會丟擲異常。

saveOrUpdate()方法:

session.saveOrUpdate(user);

 當資料庫中沒有這條有記錄時,Hibernate 會執行一條SQLINSERT 語句。當資料庫中有這條記錄時,Hibernate的髒檢查機制會自動檢查遊離物件的屬性值與資料庫中對應的欄位值是否一樣。如果一樣就什麼也不做;如果不一樣就執行SQLUPDTE 語句。

比如:這時的user 物件的屬性 name = "Joe",資料表 t_user 的欄位 name = "Joe",Hibernate 什麼也不會做,當資料表 t_user 的欄位 name = "JOJ" ,那麼Hibernate 就會執行一條SQLUPDATE 語句。

persist() 方法:

這個方法基本和save() 方法的用法一樣。

update() 方法:

session.update(user);

當資料庫中存在這條記錄時,Hibernate 總會執行一條SQLUPDATE 語句;當資料庫中不存這條記錄時,就會丟擲異常。

delete() 方法:

session.delete(user);

當資料庫中存在這條記錄時,Hibernate 總會執行一條SQLDELETE 語句;當資料庫中不存這條記錄時,就會丟擲異常。

merge() 方法:

這個方法基本和saveOrUpdate() 方法的用法相似。

lock() 方法:

session.lock(user,LockMode.NONE);  //必須在後面有一條setter 方法,不然Hibernate 什麼也不會做

user.setAge(29);

當資料庫中存在這條記錄時,Hibernate 總會執行一條SQLUPDATE 語句;當資料庫中不存這條記錄時,就會丟擲異常。

replicate() 方法:

session.replicate(user,ReplicationMode.EXCEPTION);

這個方法基本和save() 方法和 persist() 方法的用法相似。

㈡ 操作持久狀態物件

load() 方法:通過OID 從資料庫中抓取資料,並把資料載入到一個新例項物件上。

User user =(User) session.load(User.class1);   // 此時的 user 處於持久狀態

呼叫這個方法時,當資料庫中存在這條記錄時,Hibernate 會執行一條 SQLSELECT 語句;當資料庫中沒有這條記錄時,會丟擲異常。

get() 方法:通過OID 從資料庫中抓取資料,並把資料載入到一個新例項物件上。

User user = (User) session.get(User.class, 1);  // 此時的 user 處於持久狀態

呼叫這個方法時,當資料庫中存在這條記錄時,Hibernate 會執行一條 SQLSELECT 語句;當資料庫中沒有這條記錄時,user = null。

save() 方法:

User user = (User) session.load(User.class, 1);  
user.setName("JOE");
session.save(user);

Hibernate的髒檢查機制會自動檢查物件的屬性(name)值與資料庫中對應的欄位(name)值是否一樣。如果一樣就什麼也不做;如果不一樣就執行SQLUPDTE 語句。

saveOrUpdate()方法:這時的saveOrUpdate() 和 save() 方法用法一樣。

persist() 方法:與 save() 方法一樣。

update() 方法:與 save() 方法一樣。

delete() 方法:

session.delete(user);

Hibernate 執行一條 SQLDELETE 語句,這時 user 變為遊離狀態。

merge() 方法:與 update() 方法一樣。

lock() 方法:與 update() 方法一樣。

session.lock(user,LockMode.NONE);  //此時不必在後面有一條setter 方法。

replicate() 方法:與 update() 方法一樣。

session.replicate(user,ReplicationMode.EXCEPTION);

flush() 方法:與 update() 方法一樣。

User user = (User) session.load(User.class, 1);  
user.setName("JOE");
session.flush();

refresh() 方法:

User user = (User) session.get(User.class, 1);  
user.setName("JOE");
session.flush();
session.refresh(user);

 ########################################################################################################

clear() 方法:清空Session 快取

session.clear();

evcit() 方法:把持久物件從Session 快取中移除。

session.evcit(user);