1. 程式人生 > >Hibernate4-4 物件關係對映檔案

Hibernate4-4 物件關係對映檔案

  Hibernate根據物件關係對映檔案來理解持久化類和資料表之間的對應關係,也可以理解持久化類屬性與資料庫表字段之間的對應關係,並在執行時生成各種SQL語句。

1. 對映檔案根元素

這裡寫圖片描述

2. class元素

這裡寫圖片描述

3. 對映物件識別符號(OID)

  作用:與資料表主鍵對應,用於建立記憶體中的物件和資料庫表中記錄的對應關係,進而通過識別符號生成器來為主鍵賦值。
  **主鍵:**Hibernate推薦在資料表中使用代理主鍵,即不具備業務含義的欄位;代理主鍵通常為整數型別,因其比字串型別要節省更多的儲存空間。
  設定:在物件關係對映檔案中,id元素用來設定物件識別符號,generator子元素用來設定識別符號生成器。
  Hibernate提供了識別符號生成器介面IdentifierGenerator,並提供了各種內建實現。
這裡寫圖片描述

4. 識別符號生成器

  Hibernate提供的內建識別符號生成器有:
這裡寫圖片描述

4.1 increment識別符號生成器

  作用:由Hibernate以遞增的方式為代理主鍵賦值。
  **原理:**Hibernate先讀取資料庫表中主鍵的最大值(有併發問題),執行儲存操作時即在最大值基礎上遞增1。
  適用範圍:
  1). 資料庫系統:不依賴於底層資料庫系統,適用於所有資料庫系統;
  2). 單程序訪問:適用只有單個Hibernate應用程序訪問同一個資料庫的場合,在叢集環境下不推薦使用;
  3). OID定義型別:必須為long、int或short型別,若定義為byte型別,在執行時會丟擲異常。

4.2 identity識別符號生成器

  原理:由底層資料庫來負責生成識別符號, 要求底層資料庫把主鍵定義為自動增長欄位型別。
  適用範圍:
  1). 資料庫系統:支援自動增長欄位型別的資料庫,如DB2、MySQL、MSSQLServer、Sybase等;
  2). OID定義型別:必須為long、int或short型別,若定義為byte型別,在執行時會丟擲異常。

4.3 sequence識別符號生成器

  作用:利用底層資料庫提供的序列來生成識別符號。
  原理: Hibernate在持久化物件時,先從所指定的底層資料庫序列中獲得唯一的標識號,在將其作為主鍵值。
  適用範圍:


  1). 資料庫系統:支援序列的底層資料庫,如DB2、Oracle等;
  2). OID定義型別:必須為long、int或short型別,若定義為byte型別,在執行時會丟擲異常。

<!-- 利用底層資料庫提供的 news_seq 序列來生成識別符號 -->
<id name="id">
    <generator class="sequence">
        <param name="sequence">news_seq</param>
    </generator>
</id>

4.4 hilo識別符號生成器

  作用:由Hibernate按照一種high/low演算法生成識別符號,其從資料庫中指定表的特定欄位中獲取high值。
  原理: Hibernate在持久化物件時,由Hibernate負責生成主鍵值。
  適用範圍:
  1). 資料庫系統:支援所有的資料庫,因其不依賴於底層資料庫系統;
  2). OID定義型別:必須為long、int或short型別,若定義為byte型別,在執行時會丟擲異常。

<!-- hilo識別符號生成器在生成識別符號時,需要讀取並修改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>

4.5 native識別符號生成器

  原理:依據底層資料庫對自動生成識別符號的支援能力,選擇使用identity、sequence或hilo識別符號生成器。
  適用範圍:
  1). 資料庫系統:支援所有的資料庫,適合於跨資料庫平臺開發;
  2). OID定義型別:必須為long、int或short型別,若定義為byte型別,在執行時會丟擲異常。

5. property元素

這裡寫圖片描述

6. Hibernate內建對映型別

6.1 對映型別對應關係

這裡寫圖片描述

6.2 Java時間日期型別的Hibernate對映

  對應關係:在JDBC API中,java.util.Date類是java.sql.Date、java.sql.Time和java.sql.Timestamp類的父類,分別與標準SQL型別中的DATE(日期)、TIME(時間)和TIMESTAMP(時間戳,同時包含日期和時間)型別對應。
  具體使用:設定持久化類的Date型別時,應設定為java.util.Date,且可通過property的type屬性來將其對映為DATE、TIME或TIMESTAMP型別。
這裡寫圖片描述

<!-- 強制將java.util.Date類對映為SQL型別中的TIMESTAMP類 -->
<property name="date" type="timestamp">
    <column name="DATE" />
</property>

7. Java大物件型別的Hiberante對映

這裡寫圖片描述

<!-- 在物件關係對映檔案中對映大物件 -->
<!-- 
<property name="content" type="clob">       
    <column name="CONTENT"></column>
</property>

<property name="image" type="blob">
    <column name="IMAGE"></column>
</property>
-->
<!-- 利用sql-type屬性精確對映大物件型別與MySQL型別 -->
<property name="content">
    <column name="CONTENT" sql-type="mediumtext"></column>
</property>

<property name="image">
    <column name="IMAGE" sql-type="mediumblob"></column>
</property>
@Test
public void testBlob() throws Exception {
    News news = new News();
    news.setAuthor("qiaob");
    news.setTitle("qiaobc");
    news.setContent("I Love You!"); // 大文字
    news.setDate(new Date());

    // 儲存大物件: private Blob image;     二進位制圖片
    InputStream in = new FileInputStream("test.png");
    Blob image = Hibernate.getLobCreator(session).createBlob(in, in.available());
    news.setImage(image);

    session.save(news);

    // 輸出大物件
    news = (News) session.get(News.class, 14);
    Blob image2 = news.getImage();
    InputStream inputStream = image2.getBinaryStream();
    System.out.println(inputStream.available());
}

8. 對映組成關係

這裡寫圖片描述

<!-- 在Worker.hbm.xml檔案中配置對映組成關係 -->
<component name="pay" class="Pay">
    <!-- 若Pay類中有Worker屬性時可配置 -->
    <parent name="worker"/>
    <!-- 配置組成關係的元件屬性 -->
    <property name="monthlyPay" column="MONTHLY_PAY" type="integer"></property>
    <property name="yearPay" column="YEAR_PAY" type="integer"></property>
    <property name="vocationWithPay" column="VOCATION_WITH_PAY" type="integer"></property>
</component>