Hibernate_持久類的要求

雖然Hibernate對持久類沒有什麼要求,可是咱們仍是應該要遵照以下規則:java

#1,提供一個無參的構造方法:全部的持久化類都應該提供一個無參數的構造器,這個構造器能夠不採用public訪問控制符。所以提供了無參數的構造器,Hibernate就可使用Constructor.newInstance()來建立持久化類的實例了。一般,爲了方便Hibernate在運行時生成代理,構造器的訪問控制修飾符至少是包可見的,即大於或等於默認的訪問控制符。數據庫


#2,提供一個標識屬性:標識屬性一般映射數據庫表的主鍵字段,這個屬性能夠叫任何名字,其類型能夠是任何的基本類型,基本類型的包裝類型,java.lang.String或者java.util.Date。若是使用了數據庫表的聯合主鍵,甚至能夠用一個用戶自定義的類,該類擁有這些類型的屬性。固然,也能夠不指定任何標識屬性,而是在映射文件中直接將多個普通屬性映射成一個聯合主鍵,但一般不推薦這麼作。性能優化


#3,雖然Hibernate能夠容許持久化類沒有標識符屬性,而是讓Hibernate內部來追蹤對象的識別。但這樣作將致使Hibernate許多功能沒法使用。並且,Hibernate建議使用能夠爲空的類型來做爲標識屬性的類型,所以應該儘可能避免使用基本數據類型。性能


#4,爲持久類的每一個屬性提供setter和getter方法:Hibernate默認採用屬性方式來訪問持久化類的屬性。若是持久化類有個foo屬性,則應該提供setFoo()和getFoo()方法。Hibernate持久化JavaBeans風格的屬性,承認以下形式的方法名:getFoo,isFoo和setFoo。若是須要,也能夠切換屬性的訪問策略。優化

#5,使用非final的類:在運行時生成代理是Hibernate的一個重要的功能。若是持久化類沒有實現任何接口的話,Hibernate使用CGLIB生成代理,該代理對象是持久化子類的實例。若是使用了final類,則沒法生成CGLIB代理,將沒法進行性能優化。還有一個可選的策略,讓Hibernate持久化類實現一個全部方法都聲明爲public的接口,此時將使用JDK的動態代理。同時應該避免在非final類中聲明public final的方法。若是非要使用一個有public final方法的類,你必須經過設置lazy="false"來明確地禁用代理。代理


#6,重寫equals()和hashCode()方法:若是須要把持久化類的實例放入Set中(當須要進行關聯映射時,推薦這麼作),則應該爲該持久化類重寫equals()和hashCode()方法。實現equals()和hashCode()最顯而易見的方法時比較兩個對象標示符的值。若是值相同,則兩個對象對應於數據庫的同一行,所以它們是相等的(若是都被添加到Set,則在Set中只有一個元素)。遺憾的是,對採用自動生成標識值的對象不能使用這種方法。Hibernate僅爲那些持久化對象指定標示值,一個新建立的實例將不會有任何標示值。所以,若是一個實例沒有被保存過,但它又確實在一個Set中,保存它將會給這個對象賦一個標識值。若是equals()和hashCode()是基於標示值實現的,則其hashCode返回值會發生改變,這將違反Set的規則。對象

相關文章
相關標籤/搜索