Hibernate之对象关系映射文件
一、對象關系映射文件
-
POJO類和關系數據庫之間的映射可以用一個XML文檔來定義
-
在運行時Hibernate將根據這個映射文件來生成各種SQL語句
-
映射文件的拓展名為 .hbm.xml
1.映射文件說明
<hibernate-mapping> ?<class name="com.yfy.hibernate.entity.NewsEntity" table="news" schema="hibernate" dynamic-insert="true" dynamic-update="true" ><id name="id" type="java.lang.Integer"><column name="id" /><generator class="native" /></id><property name="title" column="title"/><property name="author" column="author"/><property name="data" column="data"/></class> </hibernate-mapping>-
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可以同時定義多個類,但推薦為每個類都創建一個單獨的映射文件
(1)hibernate-mapping
Hibernate-mapping是hibernate映射文件的根元素
-
schema:指定所映射的數據庫schema的名稱。若指定該屬性,則表明會自動添加該schema前綴
select * from 數據庫名.表名 -
catalog:指定所映射的數據庫catalog的名稱
-
default-cascade(默認:none):設置Hibernate默認的級聯分格
-
default-access(默認:property):指定Hibernate的默認屬性訪問策略。property會使用getter、setter方法訪問屬性,若指定access,則會通過反射訪問成員變量
-
default-lazy(默認:true):默認啟用延遲加載策略
-
auto-import(默認:true):指定是否可以在查詢語句中使用非全限定的類名
-
package:指定一個包前綴,如果在映射文檔中沒有指定全限定的類名,就使用這個作為包名
(2)class屬性
class元素用于指定類和表的映射
-
name:指定該持久化類的類名
-
table:指定該持久化類映射的表名
-
dynamic-insert(默認:false):若設置為true,表示當保存一個對象時,會動態生成insert語句,insert語句中僅包含所有取值不為null的字段
NewsEntity newsEntity = new NewsEntity();newsEntity.setTitle("hibernate入門");newsEntity.setData(new Date());session.save(newsEntity); //title為null,不會插入title ? ? ? ? sql語句:Hibernate: insert intohibernate.news(title, data) values(?, ?)?
-
dynamic-update(默認:false):若設置為true,表示當更新一個對象時,會動態生成update語句,update語句中僅包含所有取值需要更新的字段
? ? ? ?NewsEntity newsEntity = (NewsEntity)session.get(NewsEntity.class, 20);newsEntity.setAuthor("java23");newsEntity.setData(new Date());session.update(newsEntity); ? //title沒有改變,author和之前一樣updatehibernate.news setdata=? whereid=??
-
batch-size:指定根據OID來抓取實例時每批抓取的例數
-
lazy:指定是否使用延遲加載
-
multable(默認:true):若設置為false,等價于所有的property元素的update屬性為false,表示整個實例不能被更新,默認為true
(3)映射對象標識符
-
Hibernate使用對象標識符(OID)來建立內存中的對象和數據表中記錄的對應關系。對象的OID和數據表的主鍵對應,Hibernate通過標識符生成器來為主鍵賦值
-
Hibernate推薦在數據表中使用代理主鍵,即不具備業務含義的字段,代理主鍵通常為整數類型,因為整數類型要比字符串類型節省更多的數據庫空間
-
在映射文件中,<id>元素用來設置對象標識符,<generator>子元素用來設定標識符生成器
-
Hibernate提供了標識符生成器接口:IdentifierGenerator,并提供了各種內置實現
(4)id
設定持久化類的OID和表的主鍵的映射
-
name:標識持久化類OID的屬性名
-
column:設置標識屬性所映射的數據表的列名
-
unsaved- value:若設定了該屬性,Hibernate會通過比較持久化類的OID值和該屬性值來區分當前持久化類的對象是否為臨時對象
-
type:指定Hibernate映射類型
注意:Hibernate映射類型,基本數據類型無法表達null,所以對于持久化類的OID推薦使用包裝類型
? ? ? ?<id name="id" type="java.lang.Integer"><column name="id" /><generator class="native" /></id>(5)generator
設定持久化類設定標識符生成器
-
主鍵生成策略
| increment | 由Hibernate以遞增方式生成 |
| identity | 由底層數據庫生成標識符 |
| sequence | 底層數據庫的序列生成標識符,要求數據庫支持序列 |
| hilo | Hibernate分局high/low算法生成標識符 |
| sequilo | 使用高/低位算法高效的生成long,short,int類型標識符 |
| native | 根據底層數據庫對自動生成標識符的方式,自動選擇identity,sequence或hilo |
| uuid.hex | 采用128位的UUID算法生成標識符 |
| uuid.string | UUID被編碼成一個16字符長的字符串 |
| assigned | 由java應用程序負責生成標識符 |
| foreign | 使用另外一個相關聯的對象的標識符 |
increment:
-
Hibernate會先讀取對應表中主鍵的最大值,接下來向表中插入記錄時,就在max(id)的基礎上遞增,增量為1
-
適用范圍:
-
適合所有的數據庫系統
-
適用于只有單個Hibernate應用進程訪問同一個數據庫的場合,在集群環境下不推薦使用
-
OID必須為long,int或short類型
-
identity:
-
要求底層數據庫把主鍵定義為自動增長類型
-
適用范圍:
-
支持自動增長字段類型的數據庫:DB2,Mysql,MSSQLServer,Sybase等
-
OID必須為long,int或short類型
-
sequence:
-
在持久化一個對象時,先從底層數據庫的序列中獲得一個唯一的標識號,再把它作為主鍵值
-
適用范圍:
-
支持序列的數據庫:DB2,Oracle等
-
OID必須為long,int或short類型
-
hilo:
-
按照一種high/low算法生成標識符,它從數據庫的特定表的字段中獲取high值
native:
-
適用范圍:
-
能根據底層數據庫系統的類型,自動選擇合適的標識符生成器,因此很適合與跨數據庫平臺開發
-
OID必須為long,int或short類型
-
(6)Property
property元素用于指定類的屬性和表的字段的映射
-
name:指定該持久化類的屬性的名字
-
column:指定與類的屬性映射的表的字段名,如果沒有設置該屬性,將直接使用類的屬性名作為字段名
-
type:指定Hibernate映射類型
-
not-null:若該屬性為true,表名不允許為null,默認為false
-
access:指定Hibernate的默認的屬性訪問策略。默認為property,若指定filed,則通過反射訪問成員變量
-
unique:設置是否為該屬性所映射的數據列添加唯一約束
-
index:指定一個字符串的索引名稱
-
length:指定該屬性所映射數據列的字段的長度
-
scale:指定該屬性鎖映射數據列的小樹數位
-
formula:設置一個SQL表達式,Hibernate將根據它來計算出派生屬性的值
-
formula="sql"
-
sql表達式中的列名和表名都應該和數據庫對應,而不是和持久化對象的屬性對應
-
如果需要在formula屬性中使用參數,直接使用 where cur.id=id形式,其中id就是參數,和當前持久化對象的id屬性對應的列的id值將被作為參數傳入
-
(7)java類型與SQL類型之間的對應關系
| integer/int | java.lang.Integer/int | integer | 4字節 |
| long | java.lang.Long/long | bigint | 8字節 |
| short | java.lang.Short/short | smallint | 2字節 |
| byte | java.lang.Byte/byte | tinyint | 1字節 |
| float | java.lang.Float/float | float | 4字節 |
| double | java.lang.Double/double | double | 6字節 |
| big_decimal | java.math.BigDecimal | mumeric | ? |
| character | java.lang.Character/char | char(1) | 定長字符 |
| string | java.lang.String | varchar | 變長字符 |
| boolean | java.lang.Boolean/boolean | bit | 布爾類型 |
| date | java.util.Date/java.sql.Date | date | 日期 |
| timestamp | java.util.Date/java.sql.Timestamp | timestamp | 日期 |
| calandar | java.util.Calendar | timestamp | 日期 |
| calandar_date | java.util.Calendar | date | 日期 |
| binary | byte[] | blob | blob |
| text | java.lang.String | text | clob |
| serializable | 實現java.io.Serializable接口的類 | blob | blob |
| clob | java.sql.Clob | clob | clob |
| blob | java.sql.Blob | blob | blob |
| class | java.lang.Class | varchar | 定長字符 |
| locale | java.util.Locale | varchar | 定長字符 |
| timezone | java.util.TimeZone | varchar | 定長字符 |
| currency | java.util.Currency | varchar | 定長字符 |
-
以下情況下必須顯示指定Hibernate映射類型
-
一個Java類型可能對應多個Hibernate映射類型。例如:如果持久化類的屬性為java.util.Date類型,對應的Hibernate映射類型可以是date,time或timestamp。此時必須根據對應的數據表的字段的SQL類型,來確定Hibernate映射類型
-
-
java大對象的Hibernate映射
-
java中,提供了Clob和Blob類型,對應SQL中的CLOB和BLOB類型。CLOB表示字符串大對象,BLOB表示二進制對象
-
Mysql不支持標準SQL的CLOB類型,在Mysql中,用text,mediumtext及longtext類型表示長文本數據
-
實際上在Java中處理長度超過255的字符串,使用String更方便
?
-
總結
以上是生活随笔為你收集整理的Hibernate之对象关系映射文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate之Session解析
- 下一篇: Hibernate之对象关系映射