1. 程式人生 > >Hibernate中物件的編寫要求及物件的三種狀態

Hibernate中物件的編寫要求及物件的三種狀態

介紹

Hibernate是一個ORM(Object-Relational-Mapping,物件關係對映)框架,它提供了另一種管理資料庫的思想,即將表與物件進行對應,資料庫中的每一張表都與一個物件對應,在Hibernate中對於資料的操作都要在session中進行,session的本質是一個連線(Connection),使用session儲存物件時,即向資料庫中的一張表中插入資料.那麼對於session的操作目標,物件有什麼特殊要求呢?

物件(資料類)

1/需要提供無參構造(底層使用反射建立例項);

2/所有欄位應儘量為引用型別

        因為基本型別無法用於表達無這個概念,比如int作為欄位時會有預設值0,而0是有意義的,所以應使用Integer,預設值為NULL

3/為所以欄位提供get/set方法

4/不能使用final修飾

        這裡涉及到session的get()/load()方法的區別,get()方法是直接返回的一個數據類物件,而load()返回的是一個CGlig代理物件,而CGlib是返回的一個子類物件,所以使用final修飾後便不能再生成子類物件.還有一點區別時,使用load()時還使用了延時載入技術,即當呼叫load方法時,並沒有立即傳送SQL語句,僅當操作代理物件時,才會傳送SQL語句,查詢相關資料.

5/必須為物件提供id屬性

        開發中建議使用代理主鍵,不建議使用自然主鍵.在筆者的文章Hibernate框架的一級快取與快照技術中向讀者介紹了Hibernate的一級快取與快照技術,當session管理一級快取時以什麼依據來區分每個物件呢?!沒有錯,就是使用的id,所以id的重要性不言而喻.

資料類物件的三種狀態

瞬時態-TO(Transient Object):無id,不在session中.資料庫中沒有

技術態-PO(Persistence Object):有id,在session中.資料庫中也不一定有,開啟事務的情況下,進行了回滾操作.

託管態或遊離態-DO(Detach Object):有id,不在session中.資料庫中也不一定有,id可以手動設定.

在對資料進行修改時,建議不要對DO進行操作,因為有可能會引發異常,比如DO與一級快取中的PO具有相同的id,或者StaleStateException,導致的原因是使用Hibernate執行刪除和使用SQL執行刪除的狀態不一致導致的.建議使用PO進行操作,因為Hibernate是可以檢測到一級快取中的資料是否發生修改的(快照技術),發生修改後會自動對資料庫中的資料進行更新.