標籤:c style class blog code java
POJO 類和資料庫的對應檔*.hbm.xml
- POJO類和關聯式資料庫之間的映射可以用一個XML文檔來定義。
- 對應檔的副檔名為.hbm.xml
- 在運行時Hibernate將根據這個對應檔來產生各種SQL語句
- 通過POJO類的資料庫對應檔,Hibernate可以理解持久化類和資料表之間的對應關係,也可以理解持久化類屬性與資料庫表列之間的對應關係
對應檔說明
hibernate-mapping
類層次:class
- 主鍵:id
- 基本類型:property
- 實體引用類: many-to-one | one-to-one
- 集合:set | list | map | array
one-to-many
many-to-many
- 子類:subclass | joined-subclass
- 其它:component | any 等
查詢語句:query(用來放置查詢語句,便於對資料庫查詢的統一管理和最佳化)
每個Hibernate-mapping中可以同時定義多個類. 但更推薦為每個類都建立一個單獨的對應檔
hibernate-mapping
class
映射物件識別碼
- Hibernate 使用物件識別碼(OID) 來建立記憶體中的對象和資料庫表中記錄的對應關係. 對象的 OID 和資料表的主鍵對應. Hibernate 通過標識符產生器來為主鍵賦值
- Hibernate 推薦在資料表中使用代理主鍵, 即不具備業務含義的欄位. 代理主鍵通常為整數類型, 因為整數類型比字串類型要節省更多的資料庫空間.
- 在對象-關係對應檔中, <id> 元素用來設定物件識別碼. <generator> 子項目用來設定標識符產生器.
- Hibernate 提供了標識符產生器介面: IdentifierGenerator, 並提供了各種內建實現
id
generator
主鍵建置原則generator
Hibernate提供的內建標識符產生器:
increment 標識符產生器
increment 標識符產生器由 Hibernate 以遞增的方式為代理主鍵賦值
Hibernate 會先讀取 NEWS 表中的主鍵的最大值, 而接下來向 NEWS 表中插入記錄時, 就在 max(id) 的基礎上遞增, 增量為 1.
適用範圍:
- 由於 increment 生存標識符機制不依賴於底層資料庫系統, 因此它適合所有的資料庫系統
- 適用於只有單個 Hibernate 應用進程訪問同一個資料庫的場合, 在叢集環境下不推薦使用它,僅用於測試的開發環境,僅適用於單進程開發環境
- OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運行時會拋出異常
identity 標識符產生器
identity 標識符產生器由底層資料庫來負責產生標識符, 它要求底層資料庫把主鍵定義為自動成長欄位類型
適用範圍:
- 由於 identity 產生標識符的機制依賴於底層資料庫系統, 因此, 要求底層資料庫系統必須支援自動成長欄位類型. 支援自動成長欄位類型的資料庫包括: DB2, Mysql, MSSQLServer, Sybase 等
- OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運行時會拋出異常
sequence 標識符產生器
sequence 標識符產生器利用底層資料庫提供的序列來產生標識符.
Hibernate 在持久化一個 News 對象時, 先從底層資料庫的 news_seq 序列中獲得一個唯一的標識號, 再把它作為主鍵值
適用範圍:
- 由於 sequence 產生標識符的機制依賴於底層資料庫系統的序列, 因此, 要求底層資料庫系統必須支援序列. 支援序列的資料庫包括: DB2, Oracle 等
- OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運行時會拋出異常
hilo 標識符產生器
hilo 標識符產生器由 Hibernate 按照一種 high/low 演算法*產生標識符, 它從資料庫的特定表的欄位中擷取 high 值.
Hibernate 在持久化一個 News 對象時, 由 Hibernate 負責產生主鍵值. hilo 標識符產生器在產生標識符時, 需要讀取並修改 HI_TABLE 表中的 NEXT_VALUE 值.
適用範圍:
- 由於 hilo 生存標識符機制不依賴於底層資料庫系統, 因此它適合所有的資料庫系統
- OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運行時會拋出異常
hilo 和 seqhilo產生器給出了兩種hi/lo演算法的實現第一種情況:<id name="id" type="id" column="id"><generator class="hilo"><param name="table">zhxy_hilo_tbl</param><param name="column">next_value</param><param name="max_lo">100</param></generator></id>第二種情況需要sequence的支援,這裡只討論更通用的第一種情況預設請況下使用的表是hibernate_unique_key,預設欄位叫作next_hi。next_hi必須有一條記錄否則會出現錯誤。幾個簡寫解釋:hi:高值-從資料庫取得的那個值lo:低值-hibernate自動維護,取值1到max_lowmax_low:對應檔中配置的那個值那hibernate怎樣產生主鍵呢?1.從資料庫中取得hi值,資料庫的next_value值加12.hibernate取得lo值(0到max_lo-1迴圈,lo到max_lo時,執行步驟1,然後lo繼續從0到max_lo-1迴圈)根據下面的公式計算值:hi*(max_lo+1)+lo;例如hi初始為2,max_lo為3產生的值依次是:讀取hi為2,寫到資料庫為32*(3+1)+0=82*(3+1)+1=92*(3+1)+2=102*(3+1)+3=11這有次讀寫表zhxy_hilo_tbl操作,hi變為3,資料庫成為43*(3+1)+0=123*(3+1)+1=13關閉資料庫,下次開啟時,讀取hi值為4,資料庫變為54*(3+1)+0=16但是有一種特殊情況,就是hi是0的時候,那麼第一個值不是0*(max_lo+1)+0=0而是跳過0,直接就是1
native 標識符產生器
native 標識符產生器依據底層資料庫對自動產生標識符的支援能力, 來選擇使用 identity, sequence 或 hilo 標識符產生器.
適用範圍:
- 由於 native 能根據底層資料庫系統的類型, 自動選擇合適的標識符產生器, 因此很適合於跨資料庫平台開發
- OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運行時會拋出異常
Property
Java 類型, Hibernate 映射類型及 SQL 類型之間的對應關係