JavaWeb 筆記之 Hibernate 對象映射文件

對象映射文件

1. hibernate-mapping

  • package (可選): 指定一個包前綴,如果在映射文檔中沒有指定全限定的類名, 就使用這個作爲包名。

2. class

  • name:指定該持久化類映射的持久化類的類名
  • table:指定該持久化類映射的表名, Hibernate 默認以持久化類的類名作爲表名
  • dynamic-insert: 若設置爲 true, 表示當保存一個對象時, 會動態生成 insert 語句, insert 語句中僅包含所有取值不爲 null 的字段. 默認值爲 false
  • dynamic-update: 若設置爲 true, 表示當更新一個對象時, 會動態生成 update 語句, update 語句中僅包含所有取值需要更新的字段. 默認值爲 false
  • select-before-update:設置 Hibernate 在更新某個持久化對象之前是否需要先執行一次查詢. 默認值爲 false

3. id

映射對象標識符簡介

  • Hibernate 使用對象標識符(OID) 來建立內存中的對象和數據庫表中記錄的對應關係. 對象的 OID 和數據表的主鍵對應. Hibernate 通過標識符生成器來爲主鍵賦值
  • Hibernate 推薦在數據表中使用代理主鍵, 即不具備業務含義的字段. 代理主鍵通常爲整數類型, 因爲整數類型比字符串類型要節省更多的數據庫空間.
  • 在對象-關係映射文件中, <id> 元素用來設置對象標識符. <generator> 子元素用來設定標識符生成器.

幾種常用的標識符生成器

  • increment
  • increment 標識符生成器由 Hibernate 以遞增的方式爲代理主鍵賦值
  • Hibernate 會先讀取 NEWS 表中的主鍵的最大值, 而接下來向 NEWS 表中插入記錄時, 就在 max(id) 的基礎上遞增, 增量爲 1.
  • 由於 increment 生存標識符機制不依賴於底層數據庫系統, 因此它適合所有的數據庫系統
  • 適用於只有單個 Hibernate 應用進程訪問同一個數據庫的場合, 在集羣環境下不推薦使用它
  • identity
  • identity 標識符生成器由底層數據庫來負責生成標識符, 它要求底層數據庫把主鍵定義爲自動增長字段類型
  • 由於 identity 生成標識符的機制依賴於底層數據庫系統, 因此, 要求底層數據庫系統必須支持自動增長字段類型. 支持自動增長字段類型的數據庫包括: DB2, Mysql, MSSQLServer, Sybase 等
  • sequence
  • sequence 標識符生成器利用底層數據庫提供的序列來生成標識符.
  • Hibernate 在持久化一個 News 對象時, 先從底層數據庫的 news_seq 序列中獲得一個唯一的標識號, 再把它作爲主鍵值
  • 由於 sequence 生成標識符的機制依賴於底層數據庫系統的序列, 因此, 要求底層數據庫系統必須支持序列. 支持序列的數據庫包括: DB2, Oracle 等
  • hilo
  • hilo 標識符生成器由 Hibernate 按照一種 high/low 算法*生成標識符, 它從數據庫的特定表的字段中獲取 high 值.
  • Hibernate 在持久化一個 News 對象時, 由 Hibernate 負責生成主鍵值. hilo 標識符生成器在生成標識符時, 需要讀取並修改 HI_TABLE 表中的 NEXT_VALUE 值.
  • 由於 hilo 生存標識符機制不依賴於底層數據庫系統, 因此它適合所有的數據庫系統
  • native
  • native 標識符生成器依據底層數據庫對自動生成標識符的支持能力, 來選擇使用 identity, sequence 或 hilo 標識符生成器.
  • 由於 native 能根據底層數據庫系統的類型, 自動選擇合適的標識符生成器, 因此很適合於跨數據庫平臺開發

id 其他屬性

  • name: 標識持久化類 OID 的屬性名
  • column: 設置標識屬性所映射的數據表的列名(主鍵字段的名字).

4. Property

  • name:指定該持久化類的屬性的名字
  • column:指定與類的屬性映射的表的字段名. 如果沒有設置該屬性, Hibernate 將直接使用類的屬性名作爲字段名.
  • type:指定 Hibernate 映射類型. Hibernate 映射類型是 Java 類型與 SQL 類型的橋樑. 如果沒有爲某個屬性顯式設定映射類型, Hibernate 會運用反射機制先識別出持久化類的特定屬性的 Java 類型, 然後自動使用與之對應的默認的 Hibernate 映射類型.
  • not-null:若該屬性值爲 true, 表明不允許爲 null, 默認爲 false
  • access:指定 Hibernate 的默認的屬性訪問策略。默認值爲 property, 即使用 getter, setter 方法來訪問屬性. 若指定 field, 則 Hibernate 會忽略 getter/setter 方法, 而通過反射訪問成員變量
  • unique: 設置是否爲該屬性所映射的數據列添加唯一約束. > - length: 指定該屬性所映射數據列的字段的長度
  • scale: 指定該屬性所映射數據列的小數位數, 對 double, float, decimal 等類型的數據列有效.
  • formula:設置一個 SQL 表達式, Hibernate 將根據它來計算出派生屬性的值.

示例

<hibernate-mapping package="com.atguigu.hibernate.helloworld">

    <class name="News" table="NEWS" dynamic-insert="true">
    	
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <!-- 指定主鍵的生成方式, native: 使用數據庫本地方式 -->
            <generator class="native" />
        </id>
    
        <property name="title" not-null="true" unique="true"
        	index="news_index" length="50"
        	type="java.lang.String" column="TITLE" >
        </property>
        
        <property name="author" type="java.lang.String"
        	index="news_index">
            <column name="AUTHOR" />
        </property>
        
        <property name="date" type="date">
            <column name="DATE" />
        </property>
        
        <property name="desc" 
        	formula="(SELECT concat(title, ',', author) FROM NEWS n WHERE n.id = id)"></property>
		
		<property name="content">
			<column name="CONTENT" sql-type="text"></column>
		</property>
		
		<property name="picture" column="PICTURE" type="blob"></property>
		
    </class>
    
</hibernate-mapping>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章