持久化類

持久化類

持久化類:在應用程式中,用來實現業務問題實體的類(如,在電子商務應用程式中的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檔案,不需要修改任何程式,提高了軟體的靈活性,並且使維護更加方便

相關詞條

熱門詞條

聯絡我們