2007年8月5日 星期日

Hibernate 生命週期初探

了解 Hibernate 的物件生命週期, 可以協助您確實的進行資料庫的 CRUD. 而 Hibernate 的物件狀態可分為三種, 如下所示:

1. Transient
該狀態只是簡單的 Value Object, 跟資料庫的記錄沒有任何關聯, 也就是該物件的主鍵(id)不對應任何一筆資料.
例如:

User user = new User();
user.setName("first name");
2. Persistent
當一般的物件納入 Hibernate 的容器管理時, Transient 狀態的物件會轉成 Persistent Object, 直到 Session 物件過期, 或呼叫 session.close().
舉個簡單的例子:

session.beginTransaction();

Person aPerson = (Person) session.load(Person.class, personId);
aPerson.setFirstname("Foo");

session.getTransaction().commit();
session.close();
物件在執行 session.load()(或 get,save)之後, 資料會封裝成物件,
並交給 Hibernate 的容器管理, 此時的狀態也就是 Persistence Object.

以上例, 雖然沒有執行 session.update(), 但是 aPerson 物件從 session.load() 取出後, 已進入 Hibernate的管理機制, 表示跟資料庫的某資筆料相關連了. 因此修改 aPerson.setFirstname(),
再執行 session.getTransaction().commit() 之後, 會修改對應的那一筆資料內容.

3. Detached
若某個物件 Persistence Object 的 session 範圍已經失效, 就進入 Detached 狀態, 與 Value Object 的不同是, Detached 狀態可以再次的關連到 session 的實體.
例如:
Person aPerson = new Person();
aPerson.setFirstname("Foo");
...
session.beginTransaction();
session.save(aPerson);
//Persistence.
...
session.getTransaction().commit();
session.close();
//aPerson物件已變成 Detached 狀態
若此時重起一個 session 實例, 再將 aPersion 封裝進Hibernate的管理容器,
則該物件又會進入 Persistence 的狀態.

0 意見: