轉自:https://www.cnblogs.com/uoar/p/6670612.html
1.
1 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 2 <hibernate-mapping package="com.aegop.mto.pojo"> 3 <!-- 標識一個類的xml映射,name為類名,table為表名 --> 4 <class name="Street" table="Streets"> 5 <!-- 主鍵的設置,generator標識主鍵生成方式,因為native便於數據庫的移植所以.嘿嘿!你懂的 --> 6 <id name="id" type="int"> 7 <column name="Id"/> 8 <generator class="native"/> 9 </id> 10 <!-- 這里配了該類一個屬性街道名稱 name屬性字段,column,數據庫對應列 --> 11 <property name="streetName" type="string" column="StreetName" /> 12 <!-- 這里同上,寫法不同而已 --> 13 <property name="streetPhone" type="string"> 14 <column name="Streetphone" /> 15 </property> 16 <!-- 下面同樣是配該類一個屬性,只是比較特殊而已! DisrtictId它是對應實體(數據庫中主鍵,hibernate有缺省)如果加property-ref=DistrictId,效果是一樣!此屬性用在有聯合主鍵的時候--> 17 <many-to-one name="district" class="District"> 18 <column name="DistrictId"/> 19 </many-to-one> 20 </class> 21 </hibernate-mapping> 22 23 //當column不指定的時候默認是和name相同 24 25 //這里簡單介紹,<property>簡單類型的配置標簽,<many-to-one>多對一的配置標簽,以此xml為例,需要注意的是該xml是一個街道的實體映射,也就是說一個區可以包含多個街道,所以這里街道配置了和區的多對一關系! 26 //name="district";這個仍然代表該類字段,不同的是class="District",他的類型沒有用type,而是class!因為不是一個簡單數據類型. 27 28 //這個只是一個多對一的簡單表述,其實一對一,多對多...等!道理是一樣的 29 30 //District.hbm.xml 31 32 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 33 <hibernate-mapping package="com.aegop.mto.pojo"> 34 <class name="District" table="Districts"> 35 <id name="id" type="int"> 36 <column name="Id"/> 37 <generator class="native"/> 38 </id> 39 <property name="districtName" type="string"> 40 <column name="DistrictName"/> 41 </property> 42 43 </class> 44 </hibernate-mapping>
2.
一.hibernate映射文件的作用:
Hibernate映射文件是Hibernate與數據庫進行持久化的橋梁
二,Hibernate映射文件主要內容:
(1).映射內容的定義:
Hibernate映射文件由節點定義映射內容並指定所對應的JavaBean的位置(也可以不在該節點中用package屬性指定對應的JavaBean位置,而在該節點下的class節點中的name屬性中指定)
(2).數據庫和JavaBean的關聯:
Hibernate映射文件中用<hibernate-mapping>節點下的
( 該節點的父節點中用package屬性指定了JavaBean的包名時用)/全路徑(該節點的父節點中沒用package屬性指定JavaBean的包名時用)
(3).主鍵映射:
在<class >節點下用
節點映射對應的主鍵,該節點必須有且只有一個(因為主鍵只有一個),同時必須放在<property ...>節點前
(4).普通字段映射:
在<class ...>節點下用
節點映射普通字段,該節點可有多個(一個字段用一個該節點來映射)
三,heibernate的主鍵映射方式:
在<id ...>節點下用<generator class="映射方式"/>節點指定Hibernate向數據庫插入數據時主鍵的生成方式
l assigned:應用程序自身對id賦值。當設置<generator class="assigned"/>時,應用程序自身需要負責主鍵id的賦值,id l native:由數據庫對id賦值。當設置<generator class="native"/>時,數據庫負責主鍵id的賦值,最常見的是int型的自增型主鍵。例如,在SQLServer中建立表的id字段為identity,配置了該生成器,程序員就不用為該主鍵設置值,它會自動設置。
lSQL Server、MySQL中的自增主鍵生成機制。
l hilo:通過hi/lo算法實現的主鍵生成機制,需要額外的數據庫表保存主鍵生成歷史狀態。
l seqhilo:與hi/lo類似,通過hi/lo算法實現的主鍵生成機制,只是主鍵歷史狀態保存在sequence中,適用於支持sequence的數據庫,如Oracle。
l
l sequence:采用數據庫提供的sequence機制生成主鍵,用於用序列方式產生主鍵的數據庫(如:Oracle、DB2等的Sequence),用於為long/short/int型列生成唯一標識,如:<generator class="sequence"><param name="sequence">序列名</param></generator>如Oracle sequence。
l uuid.hex:由Hibernate基於128位唯一值產生算法,根據當前設備IP、時間、JVM啟動時間、內部自增量等4個參數生成十六進制數值(編碼后長度為32位的字符串表示)作為主鍵。即使是在多實例並發運行的情況下,這種算法在最大程度上保證了產生id的唯一性。當然,重復的概率在理論上依然存在,只是概率比較小。一般而言,利用uuid.hex方式生成主鍵將提供最好的數據插入性能和數據平台適應性。
l uuid.string:與uuid.hex類似,只是對生成的主鍵進行編碼(長度為16位)。在某些數據庫中可能出現問題。
l l select:Hibernate 3新引入的主鍵生成機制,主要針對遺留系統的改造工程。
由於常用的數據庫,如SQLServer、MySQL等,都提供了易用的主鍵生成機制(如auto-increase字段),可以在數據庫提供的主鍵生成機制上,采用native生成器來配置主鍵生成方式。
四,映射文件的元素結構和屬性
1,根元素:<hibernate-mapping>,每一個hbm.xml文件都有唯一的一個根元素,包含一些可選的屬性
- <hibernate-mapping package="com.demo.hibernate.beans">
- <class name="User" ...>
- </hibernate-mapping>
- <hibernate-mapping>
- <class name="com.demo.hibernate.beans.User" ...>
- </hibernate-mapping>
(2).schema: 指定當前映射文件對應的數據庫表的schema名
(3).catalog: 指定當前映射文件對應的數據庫表的catalog名
(4).default-cascade: 設置默認的級聯方式(默認值為none)
(5).default-access: 設置默認的屬性訪問方式(默認值為property)
(6).default-lazy: 設置對沒有指定延遲加載的映射類和集合設定為延遲加載(默認值為true)
(7).auto-import: 設置當前映射文件中是否可以在HQL中使用非完整的類名(默認值為true)
hibernate-mapping節點的字節點:
(1).class: 為當前映射文件指定對應的持久類名和對應的數據庫表名
(2).subclass: 指定多態持久化操作時當前映射文件對應的持久類的子類
(3).meta: 設置類或屬性的元數據屬性
(4).typedef: 設置新的Hibernate數據類型
(5).joined-subclass: 指定當前聯結的子類
(6).union-subclass: 指定當前聯結的子類
(7).query: 定義一個HQL查詢
(8).sql-query: 定義一個SQL查詢
(9).filter-def: 指定過濾器
2,<class>定義類:根元素的子元素,用以定義一個持久化類與數據表的映射關系,如下是該元素包含的一些可選的屬性
(1).name: 為當前映射文件指定對應的持久類名
(3).schema: 設置當前指定的持久類對應的數據庫表的schema名
(4).catalog: 設置當前指定的持久類對應的數據庫表的catalog名
(5).lazy: 設置是否使用延遲加載
(7).check: 指定一個SQL語句用於Schema前的條件檢查
(8).where: 指定一個附加的SQL語句的where條件
(9).rowid: 指定是否支持ROWID
(10).entity-name:實體名稱 默認值為類名
(11).subselect: 將不可變的只讀實體映射到數據庫的子查詢中
(12).dynamic-update: 指定用於update的SQL語句是否動態生成 默認值為false
(13).dynamic-insert: 指定用於insert的SQL語句是否動態生成 默認值為false
(14).insert-before-update: 設定在Hibernate執行update之前是否通過select語句來確定對象是否確實被修改了,如果該對象的值沒有改變,update語句將不會被執行(默認值為false)
(15).abstract: 用於在聯合子類中標識抽象的超類(默認值為false)
(16).emutable: 表明該類的實例是否是可變的 默認值為fals
(17).proxy: 指定延遲加載代理類
(18).polymorphism: 指定使用多態查詢的方式 默認值為implicit
(19).persister: 指定一個Persister類
(20).discriminator-value: 子類識別標識 默認值為類名
(21).optimistic-lock: 指定樂觀鎖定的策略 默認值為vesion
class節點的字節點:
(1).id: 定義當前映射文件對應的持久類的主鍵屬性和數據表中主鍵字段的相關信息
(2).property: 定義當前映射文件對應的持久類的屬性和數據表中字段的相關信息
(3).sql-insert: 使用定制的SQL語句執行insert操作
(4).sql-delete: 使用定制的SQL語句執行delete操作
(5).sql-update: 使用定制的SQL語句執行update操作
(6).subselect: 定義一個子查詢
(7).comment: 定義表的注釋
(8).composite-id: 持久類與數據庫表對應的聯合主鍵
(9).many-to-one: 定義對象間的多對一的關聯關系
(10).one-to-one: 定義對象間的一對一的關聯關系
(11).any: 定義any映射類型
(12).map: map類型的集合映射
(13).set: set類型的集合映射
(14).list: list類型的集合映射
(15).array: array類型的集合映射
(16).bag: bag類型的集合映射
(17).primitive-array: primitive-array類型的集合映射
(18).query: 定義裝載實體的HQL語句
(19).sql-query: 定義裝載實體的SQL語句
(20).synchronize: 定義持久化類所需要的同步資源
(21).query-list: 映射由查詢返回的集合
(22).natural-id: 聲明一個唯一的業務主鍵
(23).join: 將一個類的屬性映射到多張表中
(24).sub-class: 聲明多態映射中的子類
(25).joined-subclass: 生命多態映射中的來連接子類
(26).union-subclass: 聲明多態映射中的聯合子類
(27).loader: 定義持久化對象的加載器
(28).filter: 定義Hibernate使用的過濾器
(29).component: 定義組件映射
(30).dynamic-component: 定義動態組件映射
(31).properties: 定義一個包含多個屬性的邏輯分組
(32).cache: 定義緩存的策略
(33).discriminator: 定義一個鑒別器
(34).meta: 設置類或屬性的元數據屬性
(35).timestamp: 指定表中包含時間戳的數據
(36).vesion: 指定表所包含的附帶版本信息的數據
4,<id>定義主鍵:
Hibernate使用OID(對象標識符)來標識對象的唯一性,OID是關系數據庫中主鍵在Java對象模型中的等價物,在運行時,Hibernate根據OID來維持Java對象和數據庫表中記錄的對應關系
id節點的屬性:
(1).name: 指定當前映射對應的持久類的主鍵名
(2).column: 指定當前映射對應的數據庫表中的主鍵名(默認值為對應持久類的主鍵/屬性名)
(3).type: 指定當前映射對應的數據庫表中的主鍵的數據類型
(4).unsaved-value: 判斷此對象是否進行了保存
(5).daccess: Hibernate訪問主鍵屬性的策略(默認值為property)
5.generator節點的屬性:
(1).class: 指定主鍵生成器
(2).name: 指定當前映射對應的持久類的主鍵名
(3).column: 指定當前映射對應的數據庫表中的主鍵名(默認值為對應持久類中的主鍵名)
(4).type: 指定當前映射對應的數據庫中主鍵的數據類型
(5)not-null: 設置該字段的值是否可以為null(默認值為false)
(7).update: 設置update操作時是否包含本字段的數據(默認值為true)
(8).insert: 設置insert操作時是否包含本字段的數據(默認值為true)
(9).formula: 設置查詢操作時該屬性的值用指定的SQL來計算
(10).access: Hibernate訪問這個屬性的策略(默認值為property)
(11).lazy: 設置該字段是否采用延遲加載策略(默認值為false)
(12).optimistic-lock: 指定此屬性做更新操作時是否需要樂觀鎖定(默認值為true)
6.property節點的屬性:
用於持久化類的屬性與數據庫表字段之間的映射,包含如下屬性:
(1)name:持久化類的屬性名,以小寫字母開頭
(2)column:數據庫表的字段名
(3)type:Hibernate映射類型的名字
(4).formula: 設置當前節點對應的持久類中的屬性的值由指定的SQL從數據庫獲取
注:指定的SQL必須用()括起來,指定SQL中使用列時必須用表的別名加.加列名的方式訪問,但如果指定SQL中要使用當前映射對應的列時不能用表的別名加.加列名的方式訪問,而是直接訪問即可
如:formula="(select tn.columnName from tableName tn where tn.columnName=當前映射中的屬性名)"
(5).unique: 設置該字段的值是否唯一(默認值為false)
(6).not-null: 設置該字段的值是否可以為null(默認值為false)
(7).not-found: 設置當當前節點對應的數據庫字段為外鍵時引用的數據不存在時如何讓處理(默認值為exception:產生異常,可選值為ignore:對不存在的應用關聯到null)
(8).property-ref: 設置關聯類的屬性名,此屬性和本類的關聯相對應 默認值為關聯類的主鍵
(9).entity-name: 被關聯類的實體名
(10).lazy: 指定是否采用延遲加載及加載策略(默認值為proxy:通過代理進行關聯,可選值為true:此對象采用延遲加載並在變量第一次被訪問時抓取、false:此關聯對象不采用延遲加載)
(11).access: Hibernate訪問這個屬性的策略(默認值為property)
(12).optimistic-lock: 指定此屬性做更新操作時是否需要樂觀鎖定(默認值為true)
7.one-to-one節點的屬性:
(1).name: 映射類屬性的名字
(2).class: 關聯類的名字
(3).formula: 絕大多數一對一關聯都指向其實體的主鍵。在某些情況下會指向一個或多個字段或是一個表達式,此時可用一個SQL公式來表示
(4).cascade: 設置級聯操作時的級聯類型
(5).constrained: 表明當前類對應的表與被關聯的表之間是否存在着外鍵約束 默認值為false
(6).fetch: 設置抓取數據的策略 可選值為 join外連接抓取、select序列選擇抓取
(7).property-ref: 設置關聯類的屬性名,此屬性和本類的主鍵相對應 默認值為關聯類的主鍵
(8).access: Hibernate訪問這個屬性的策略(默認值為property)
(9).lazy: 指定是否采用延遲加載及加載策略 默認值為proxy通過代理進行關聯 可選值為 true此對象采用延遲加載並在變量第一次被訪問時抓取、false此關聯對象不采用延遲加載
(10).entity-name: 被關聯類的實體名
8.many-to-one 元素:
(1).name: 映射類屬性的名字
(2).class: 關聯類的名字
(3).formula: 絕大多數一對一關聯都指向其實體的主鍵。在某些情況下會指向一個或多個字段或是一個表達式,此時可用一個SQL公式來表示
(4).column: 中間關聯表映射到目標關聯表的關聯字段
(5).cascade: 設置級聯操作時的級聯類型
(6).fetch: 設置抓取數據的策略 默認值為select序列選擇抓取 可選值為join外連接抓取
(7).lazy: 指定是否采用延遲加載及加載策略 默認值為proxy通過代理進行關聯 可選值為 true此對象采用延遲加載並在變量第一次被訪問時抓取、false此關聯對象不采用延遲加載
(8).update: 進行update操作時是否包含此字段
(9).insert: 進行insert操作時是否包含此字段
(10).not-found: 指定外鍵引用的數據不存在時如何讓處理 默認值為exception產生異常 可選值為ignore對不存在的應用關聯到null
9.many-to-many 元素
10.set 元素
(1).name: 映射類屬性的名字
(2).table: 關聯的目標數據庫表
(3).schema: 目標數據庫表的schema名字
(4).catalog: 目標數據庫表的catalog名字
(5).subselect: 定義一個子查詢
(6).sort: 設置排序的類型 默認值為 unsorted不排序 可選值為 natural自然排序、comparatorClass實現接口類作為排序算法 避免與order-by同時使用
(7).lazy: 是否采用延遲加載
(8).inverse: 用於標識雙向關聯中被動的一方 默認值為false
(9).cascade: 設置級聯操作時的級聯類型
(10).mutable: 標識被關聯對象是否可以改變 默認值為true
(11).order-by: 設置排序規則
(12).where: 增加篩選條件
(13).batch-size: 延遲加載時,一次讀取數據的數量 默認值為1
(14).fetch: 設置抓取數據的策略 可選值為 join外連接抓取、select序列選擇抓取
11.list 元素
12.map 元素