Hibernate根據(jù)對象關(guān)系映射文件來理解持久化類和數(shù)據(jù)表之間的對應(yīng)關(guān)系,也可以理解持久化類屬性與數(shù)據(jù)庫表字段之間的對應(yīng)關(guān)系,并在運行時生成各種SQL語句。


作用:與數(shù)據(jù)表主鍵對應(yīng),用于建立內(nèi)存中的對象和數(shù)據(jù)庫表中記錄的對應(yīng)關(guān)系,進(jìn)而通過標(biāo)識符生成器來為主鍵賦值。 **主鍵:**Hibernate推薦在數(shù)據(jù)表中使用代理主鍵,即不具備業(yè)務(wù)含義的字段;代理主鍵通常為整數(shù)類型,因其比字符串類型要節(jié)省更多的存儲空間。 設(shè)置:在對象關(guān)系映射文件中,id元素用來設(shè)置對象標(biāo)識符,generator子元素用來設(shè)置標(biāo)識符生成器。 Hibernate提供了標(biāo)識符生成器接口IdentifierGenerator,并提供了各種內(nèi)置實現(xiàn)。 
Hibernate提供的內(nèi)置標(biāo)識符生成器有: 
作用:由Hibernate以遞增的方式為代理主鍵賦值。 **原理:**Hibernate先讀取數(shù)據(jù)庫表中主鍵的最大值(有并發(fā)問題),執(zhí)行保存操作時即在最大值基礎(chǔ)上遞增1。 適用范圍: 1). 數(shù)據(jù)庫系統(tǒng):不依賴于底層數(shù)據(jù)庫系統(tǒng),適用于所有數(shù)據(jù)庫系統(tǒng); 2). 單進(jìn)程訪問:適用只有單個Hibernate應(yīng)用進(jìn)程訪問同一個數(shù)據(jù)庫的場合,在集群環(huán)境下不推薦使用; 3). OID定義類型:必須為long、int或short類型,若定義為byte類型,在運行時會拋出異常。
原理:由底層數(shù)據(jù)庫來負(fù)責(zé)生成標(biāo)識符, 要求底層數(shù)據(jù)庫把主鍵定義為自動增長字段類型。 適用范圍: 1). 數(shù)據(jù)庫系統(tǒng):支持自動增長字段類型的數(shù)據(jù)庫,如DB2、MySQL、MSSQLServer、Sybase等; 2). OID定義類型:必須為long、int或short類型,若定義為byte類型,在運行時會拋出異常。
作用:利用底層數(shù)據(jù)庫提供的序列來生成標(biāo)識符。 原理: Hibernate在持久化對象時,先從所指定的底層數(shù)據(jù)庫序列中獲得唯一的標(biāo)識號,在將其作為主鍵值。 適用范圍: 1). 數(shù)據(jù)庫系統(tǒng):支持序列的底層數(shù)據(jù)庫,如DB2、Oracle等; 2). OID定義類型:必須為long、int或short類型,若定義為byte類型,在運行時會拋出異常。
<!-- 利用底層數(shù)據(jù)庫提供的 news_seq 序列來生成標(biāo)識符 --><id name="id"> <generator class="sequence"> <param name="sequence">news_seq</param> </generator></id>作用:由Hibernate按照一種high/low算法生成標(biāo)識符,其從數(shù)據(jù)庫中指定表的特定字段中獲取high值。 原理: Hibernate在持久化對象時,由Hibernate負(fù)責(zé)生成主鍵值。 適用范圍: 1). 數(shù)據(jù)庫系統(tǒng):支持所有的數(shù)據(jù)庫,因其不依賴于底層數(shù)據(jù)庫系統(tǒng); 2). OID定義類型:必須為long、int或short類型,若定義為byte類型,在運行時會拋出異常。
<!-- hilo標(biāo)識符生成器在生成標(biāo)識符時,需要讀取并修改HI_TABLE表中的NEXT_VALUE值 --><id name="id"> <generator class="hilo"> <param name="table">HI_TABLE</param> <param name="colume">NEXT_VALUE</param> <param name="max_lo">10</param> </generator></id>原理:依據(jù)底層數(shù)據(jù)庫對自動生成標(biāo)識符的支持能力,選擇使用identity、sequence或hilo標(biāo)識符生成器。 適用范圍: 1). 數(shù)據(jù)庫系統(tǒng):支持所有的數(shù)據(jù)庫,適合于跨數(shù)據(jù)庫平臺開發(fā); 2). OID定義類型:必須為long、int或short類型,若定義為byte類型,在運行時會拋出異常。


對應(yīng)關(guān)系:在JDBC API中,java.util.Date類是java.sql.Date、java.sql.Time和java.sql.Timestamp類的父類,分別與標(biāo)準(zhǔn)SQL類型中的DATE(日期)、TIME(時間)和TIMESTAMP(時間戳,同時包含日期和時間)類型對應(yīng)。 具體使用:設(shè)置持久化類的Date類型時,應(yīng)設(shè)置為java.util.Date,且可通過property的type屬性來將其映射為DATE、TIME或TIMESTAMP類型。 


新聞熱點
疑難解答