Hibernate的實體規則
一、 hibernate的實體類有一定的規則,類似於mybatis的逆向工程導出的實體類。具體的規則以及原因如下:
1.持久化類需要提供午餐的構造方法。
因為hibernate底層采用反射機制創建對象,采用class.newInstance()創建對象,此方法默認調用無參構造方法創建對象。如果我們只寫一個帶參數的構造函數在查詢的時候會報錯誤 org.hibernate.InstantiationException
2.成員變量私有,提供共有get/set方法訪問.需提供屬性
hibernate底層將查詢到的數據采用set方法進行設置。
此處聲明一個常識,一個類下聲明的變量是成員變量不能說是屬性,而屬性說的是get/setter建造器,一個類有幾個屬性看這個類有幾個getter/setter建造器。
3.持久化類中的屬性,應盡量使用包裝類型
例如int采用Integer,long采用Long。原因如下:
(1)有可能我們對一些值不需要設值,比如null,但是我們如果用int這樣的基本數據類型將不能存儲null,比如我們想用成績為null表示缺考,成績為0表示考試了但是獲得 的成績為0.
(2)數據庫中的null如果映射到基本數據類型會報錯誤,采用包裝類型可以避免這些問題。
4.持久化類需要提供oid(Object Identifier,對象標識符).與數據庫中的主鍵列對應
註意如果沒有主鍵的表hibernate是不能進行操作的。
數據庫中的表采用ID進行區分,每條唯一的是一條記錄;Java中通過內存地址區分兩個對象是否是相同對象,而hibernate通過 OID進行區分,hibernate不允許在內存中出現兩個相同OID的對象。
5.不要用final修飾class
hibernate使用cglib代理生成代理對象.代理對象是繼承被代理對象.如果被final修飾.將無法生成代理。JDK代理采用實現接口的方式,而cgib采用繼承的方式實現代理。
二、hibernate主鍵類型
1. 自然主鍵(少見)
表的業務列中,有某業務列符合,必須有,並且不重復的特征時,該列可以作為主鍵使用.比如用戶表有身份證號字段,身份證號不能為空而且能唯一區分一條記錄,則可以將身份證號作為主鍵。
2.代理主鍵(常見)
表的業務列中,沒有某業務列符合,必須有,並且不重復的特征時,創建一個沒有業務意義的列作為主鍵。(這也是設計數據庫的一條常用規則,每個表都有一個與業務無關的主鍵)
三、hibernate主鍵生成策略
Hibernate的實體規則