hibernate的持久化類和物件識別符號
一丶什麼是持久化類:
Hibernate是持久層的ORM對映框架,專注於資料的持久化工作。所謂的持久化,就是將記憶體中的資料永久儲存到關係型資料庫中。那麼知道了什麼是持久化,什麼又是持久化類呢?
持久化類 = 實體類 + 對映檔案。
其實所謂的持久化類指的是一個Java類與資料庫表建立了對映關係,那麼這個類稱為是持久化類。其實你可以簡單的理解為持久化類就是一個Java類有了一個對映檔案與資料庫的表建立了關係。那麼我們在編寫持久化類的時候有哪些要求呢?接下來我們來看一下:
二丶持久化類的編寫規則:
我們在編寫持久化類的時候需要有以下幾點需要注意:
持久化類需要提供無引數的構造方法。因為在Hibernate的底層需要使用反射生成類的例項。
持久化類的屬性需要私有,對私有的屬性提供公有的get和set方法。因為在Hibernate底層會將查詢到的資料進行封裝。
持久化類的屬性要儘量使用包裝類的型別。因為包裝類和基本資料型別的預設值不同,包裝類的型別語義描述更清晰而基本資料型別不容易描述。
舉個例子: 假設表中有一列員工工資,如果使用double型別,如果這個員工工資忘記錄入到系統中,系統會將預設值0存入到資料庫,如果這個員工工資被扣完了,也會向系統中存入0.那麼這個0就有了多重含義,而如果使用包裝類型別就會避免以上情況,如果使用Double型別,忘記錄入工資就會存入null,而這個員工工資被扣完了,就會存入0,不會產生歧義。
持久化類要有一個唯一標識OID與表的主鍵對應。因為Hibernate中需要通過這個唯一標識OID區分在記憶體中是否是同一個持久化類。在Java中通過地址區分是否是同一個物件的,在關係型資料庫的表中是通過主鍵區分是否同一條記錄。那麼Hibernate就是通過這個OID來進行區分的。Hibernate是不允許在記憶體中出現兩個OID相同的持久化物件的。
持久化類儘量不要使用final進行修飾。因為Hibernate中有延遲載入的機制,這個機制中會產生代理物件,Hibernate產生代理物件使用的是位元組碼的增強技術完成的,其實就是產生了當前類的一個子類物件實現的。如果使用了final修飾持久化類。那麼就不能產生子類,從而就不會產生代理物件,那麼Hibernate的延遲載入策略(是一種優化手段)就會失效。. 持久化類我們已經可以正常編寫了,但是在持久化類中需要有一個唯一標識OID與表的主鍵去建立對映關係。而且主鍵一般我們是不會讓客戶手動錄入的,一般我們是由程式生成主鍵。那麼Hibernate中也提供了相應的主鍵生成的方式,那麼我們來看下Hibernate的主鍵生成策略。
簡單的說:
我們的實體類都需要遵從JavaBean的編寫規範。
什麼是JavaBean: Bean:在軟體開發領域,Bean表示可重用元件。 JavaBean就是用java語言開發的可重用元件。 JavaBean的編寫規範是什麼:
類都是public的
都有預設無參建構函式
成員變數都是私有的
都有公有的get/set方法
一般都實現Serializable介面。
基本型別和包裝類的選擇問題: 由於包裝類可以有null值。所以實際開發中都是用包裝類。
三丶hibernate中物件識別符號(OID)
OID全稱是Object Identifier,又叫做物件識別符號。它是hibernate用於區分兩個物件是否是同一個物件的標識。 我們都知道,虛擬機器記憶體區分兩個物件看的是記憶體的地址是否一致。資料庫區分兩個物件,靠的是表的主鍵。hibernate負責把記憶體中的物件持久化到資料庫表中,靠的就是物件識別符號來區分兩個物件是否是同一個。實體類中對映主鍵的欄位就是OID,如下圖所示:
四丶hibernate的主鍵生成策略
在講解Hibernate的主鍵生成策略之前,先來了解兩個概念,即自然主鍵和代理主鍵,具體如下:
自然主鍵:把具有業務含義的欄位作為主鍵,稱之為自然主鍵。例如在customer表中,如果把name欄位作為主鍵,其前提條件必須是:每一個客戶的姓名不允許為null,不允許客戶重名,並且不允許修改客戶姓名。儘管這也是可行的,但是不能滿足不斷變化的業務需求,一旦出現了允許客戶重名的業務需求,就必須修改資料模型,重新定義表的主鍵,這給資料庫的維護增加了難度。
代理主鍵:把不具備業務含義的欄位作為主鍵,稱之為代理主鍵。該欄位一般取名為“ID”,通常為整數型別,因為整數型別比字串型別要節省更多的資料庫空間。在上面例子中,顯然更合理的方式是使用代理主鍵。、
主鍵生成策略
1.increment 資料庫自己生成主鍵. 先從資料庫中查詢最大的ID值,將ID值加1作為新的主鍵
2.identity 依賴於資料的主鍵自增功能
3.sequence 序列,依賴於資料中的序列功能(Oracle). 4.hilo(純瞭解,永遠用不到) : Hibernate自己實現序列的演算法,自己生成主鍵. (hilo演算法 ) 5.native 自動根據資料庫判斷,三選一. identity|sequence|hilo 6.uuid 生成32位的不重複隨機字串當做主鍵 7.assigned 自己指定主鍵值. 表的主鍵是自然主鍵時使用.