hibernate 對象關係對應檔詳解

來源:互聯網
上載者:User

標籤: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 類型之間的對應關係






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.