複製鏈接
請複製以下鏈接發送給好友

持久化類

鎖定
持久化類:在應用程序中,用來實現業務問題實體的類(如,在電子商務應用程序中的Customer和Order)就是持久化類。不能認為所有的持久化類的實例都是持久的狀態——一個實例的狀態也可能是瞬時的或託管的。就如同它的名字暗示的,它的實例會被持久性保存於數據庫中。
中文名
持久化類
分    類
持久化
定    義
hibernate 持久化

目錄

持久化類定義

持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。
持久化類(persistent class):可以被hibernate保存到數據庫,並且從數據庫讀取的類。

持久化類性質

1、持久化類:是指其實例需要被Hibernate持久化到數據庫中的類。持久化類符合JavaBean的規範,包含一些屬性,以及與之對應的getXXX( )和setXXX( )方法。
注:
(1)get/set方法必須符合特定的命名規則,get和set後面緊跟屬性的名字,並且屬性名的首字母為大寫。
(2)name屬性的get方法為getName( ),如果寫成getname( )或getNAME( )會導致Hibernate在運行時拋出以下異常:
net.sf.hibernate.PropertyNotFoundException:Could not find a getter for porperty name in class mypack XXX
2、如果持久化類的屬性為boolean類型,那麼他的get方法名即可以用get作為前綴,也可以用is作為前綴。
3、持久化類有一個id屬性,用來唯一標識Account類的每一個對象。這個id屬性被稱為對象標示符(OID,Object Identifier),通常它都用整數表示。
4、Hibernate要求持久化類必須提供一個不帶參的默認構造方法,在程序運行時,Hibernate運用Java反射機制,調用java.Lang.raflect.Constructor.newInstance( )方法來構造持久化類的實例。

持久化類應用

1、Account.hbm.xml文件用於映射Account類,如果需要映射多個持久化類,有兩種方法 :
(1)在同一個映射文件中映射所有類;
(2)為每一個類創建單獨的映射文件,映射文件最好和類同名,擴展名為hbm.xml(推 薦使用,這有利於在團隊開發中維護和管理映射文件) ;
2、映射文件的分析:
(1)<hibernate-mapping package="XXX.XXX.XXX">
package:映射類所在的包,注意:包中間用"."隔開
(2)<class name="Xxxxxx" table="Xxxxx">
<class>元素指定類和表的映射
name:設定類名 table:設定表名
注:如果沒寫tableHibernate直接以類名作為表名。
(3)<id name="studentId" column="studentId">
<generator class="native"/>
</id>
(1)<id>子元素設定持久化類的OID和表的主鍵的映射,<class>元素只有一個<id>子元素。
(2)<generator>子元素指定對象標識符生成器,他負責為OID生成唯一標識符。
(3)Hibernate的內置標示符生成器(id生成器):
(a)increment:由Hibernate以遞增的方式為代理主鍵賦值。Hibernate在初始化階段讀取表中最大主鍵值,然後再最大值的基礎上遞增,增量為1。
eg .
<id name="oid" column="oid" type="integer">
<generator class="increment"/> </id>
適用範圍:
1、increament不依賴於底層數據庫系統,所以適於所有的DBS。
2、適用於只有單個Hibernate應用程序訪問同一個DB的場合。
3、OID必須為long、int或short類型,定義為byte類型,在運行時會拋異常。
(b)identity:由底層DB來負責生成,要求底層DB把主鍵定義為自增類型,例如在SQL Server中,應該把主鍵定義為identity類型,MySQL中,定義為auto_increment類型。
<id name="oid" column="oid">
<generator class="identity"/> </id>
適用範圍:
1、由於identity生成機制依賴於底層DB系統,要求底層DB必須支持自增字段類型。
2、OID必須為long、int或short類型,定義為byte類型,在運行時會拋異常。
(c)sequence:利用底層DB提供的序列生成。
eg.
<id name="id" column="id">
<generator class="sequence">
<param name="sequence">tt_oid_seq</param>< </generator> </id>
注:tt_oid_seq 是我們在Oracle中建立的,create sequence tt_oid_seq;
適用範圍:
1、sequence依賴於底層DB,要求底層DB系統必須支持序列,eg.Oracle、DB2等
2、OID必須為long、int或short類型,定義為byte類型,在運行時會拋異常。
(d)hilo(高低位算法):由Hibernate按照一種high/low算法來生成標識符,他從DB的特定表的字段中獲取high值。
eg .
<id name="id" column="id">
<generator class="hilo">
<!--設置高位值取值的表-->
<param name="table">tt_hilo</param> <!--設置高位值取值的字段-->
<param name="column">hi</param>
<!--指定低位最大值,當取到最大值時會再取一個高位值再運算-->
<param name="max_lo">50</param>
</generator>
</id>
適用範圍:
1〉hilo不依賴於底層DB系統,適用於所有的DBS。
2〉OID必須為long、int或short類型,定義為byte類型,在運行時會拋異常。
3〉hign/low算法生成的標識符只能在一個DB中保證唯一。
4〉當用户為Hibernate自行提供DB連接,或者Hibernate通過JTA,從應用服務器的數據源獲得數據庫連接時無法使用hilo,因為這不能保證hilo在新的DB連接的事務中訪問hi值所在的表,這時如果DBS支持Sequence,可以使用seqhilo來產生OID,seqhilo從名為hi_sequence的序列裏獲取high值。
(e)native:依據底層數據庫自動生成標識符的能力,來選擇使用identity、sequence或hilo標識符生成器。它能自動判斷底層DB提供的生成標識符的機制。
eg.
<id name="oid" column="oid"> <generator class="native"/> </id>
注:針對Oracle數據庫的生成方式是sequence,只不過需要一個特定名字的sequence,"hibernate_sequence"。MySQL和SQLServer選擇 identity。
適用範圍:
1〉適合跨DB平台開發,即同一個Hibernate應用需要連接多種DBS的場合。
2〉OID必須為long、int或short類型,定義為byte類型,在運行時會拋異常。
3、<property name="XXX" column="XXXX" type="string" not-null="true"/>
(1)<class>元素包含多個<property>子元素。
(2)<property>子元素設定類的屬性和表的字段的映射。
(a)name:指定持久化類的屬性名。
(b)type:指定Hibernate映射類型,Hibernate映射類型是Java類型與SQL類型的橋樑。
(c)not-null:為true,表明不允許為空,默認為false。 (d)column:指定與類屬性映射的表的字段名,沒設置Hibernate直接以類名作為字段名。
4、Hibernate採用XML文件來配置對象-關係映射,有以下優點:
(1)Hibernate既不會滲透到上層域模型中,也不會滲透到下層數據模型中。
(2)軟件開發人員可以獨立設計域模型,不必強迫遵守任何規範。
(3)數據庫設計人員可以獨立設計數據模型。
(4)對象-關係不依賴於任何程序代碼,如果需要修改對象-關係映射,只需修改XML文件,不需要修改任何程序,提高了軟件的靈活性,並且使維護更加方便