Hibernate之对象关系映射文件
一、對象關(guān)系映射文件
-
POJO類和關(guān)系數(shù)據(jù)庫之間的映射可以用一個XML文檔來定義
-
在運(yùn)行時Hibernate將根據(jù)這個映射文件來生成各種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
-
實(shí)體引用類:many-to-one | one-to-one
-
集合:set | list | map | array
-
one-to-many | many-to-many
-
-
子類:subclass | joined-subclass
-
其它:component | any等
-
-
查詢語句:query
-
-
每個hibernate-mapping可以同時定義多個類,但推薦為每個類都創(chuàng)建一個單獨(dú)的映射文件
(1)hibernate-mapping
Hibernate-mapping是hibernate映射文件的根元素
-
schema:指定所映射的數(shù)據(jù)庫schema的名稱。若指定該屬性,則表明會自動添加該schema前綴
select * from 數(shù)據(jù)庫名.表名 -
catalog:指定所映射的數(shù)據(jù)庫catalog的名稱
-
default-cascade(默認(rèn):none):設(shè)置Hibernate默認(rèn)的級聯(lián)分格
-
default-access(默認(rèn):property):指定Hibernate的默認(rèn)屬性訪問策略。property會使用getter、setter方法訪問屬性,若指定access,則會通過反射訪問成員變量
-
default-lazy(默認(rèn):true):默認(rèn)啟用延遲加載策略
-
auto-import(默認(rèn):true):指定是否可以在查詢語句中使用非全限定的類名
-
package:指定一個包前綴,如果在映射文檔中沒有指定全限定的類名,就使用這個作為包名
(2)class屬性
class元素用于指定類和表的映射
-
name:指定該持久化類的類名
-
table:指定該持久化類映射的表名
-
dynamic-insert(默認(rèn):false):若設(shè)置為true,表示當(dāng)保存一個對象時,會動態(tài)生成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(默認(rèn):false):若設(shè)置為true,表示當(dāng)更新一個對象時,會動態(tài)生成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:指定根據(jù)OID來抓取實(shí)例時每批抓取的例數(shù)
-
lazy:指定是否使用延遲加載
-
multable(默認(rèn):true):若設(shè)置為false,等價于所有的property元素的update屬性為false,表示整個實(shí)例不能被更新,默認(rèn)為true
(3)映射對象標(biāo)識符
-
Hibernate使用對象標(biāo)識符(OID)來建立內(nèi)存中的對象和數(shù)據(jù)表中記錄的對應(yīng)關(guān)系。對象的OID和數(shù)據(jù)表的主鍵對應(yīng),Hibernate通過標(biāo)識符生成器來為主鍵賦值
-
Hibernate推薦在數(shù)據(jù)表中使用代理主鍵,即不具備業(yè)務(wù)含義的字段,代理主鍵通常為整數(shù)類型,因?yàn)檎麛?shù)類型要比字符串類型節(jié)省更多的數(shù)據(jù)庫空間
-
在映射文件中,<id>元素用來設(shè)置對象標(biāo)識符,<generator>子元素用來設(shè)定標(biāo)識符生成器
-
Hibernate提供了標(biāo)識符生成器接口:IdentifierGenerator,并提供了各種內(nèi)置實(shí)現(xiàn)
(4)id
設(shè)定持久化類的OID和表的主鍵的映射
-
name:標(biāo)識持久化類OID的屬性名
-
column:設(shè)置標(biāo)識屬性所映射的數(shù)據(jù)表的列名
-
unsaved- value:若設(shè)定了該屬性,Hibernate會通過比較持久化類的OID值和該屬性值來區(qū)分當(dāng)前持久化類的對象是否為臨時對象
-
type:指定Hibernate映射類型
注意:Hibernate映射類型,基本數(shù)據(jù)類型無法表達(dá)null,所以對于持久化類的OID推薦使用包裝類型
? ? ? ?<id name="id" type="java.lang.Integer"><column name="id" /><generator class="native" /></id>(5)generator
設(shè)定持久化類設(shè)定標(biāo)識符生成器
-
主鍵生成策略
| increment | 由Hibernate以遞增方式生成 |
| identity | 由底層數(shù)據(jù)庫生成標(biāo)識符 |
| sequence | 底層數(shù)據(jù)庫的序列生成標(biāo)識符,要求數(shù)據(jù)庫支持序列 |
| hilo | Hibernate分局high/low算法生成標(biāo)識符 |
| sequilo | 使用高/低位算法高效的生成long,short,int類型標(biāo)識符 |
| native | 根據(jù)底層數(shù)據(jù)庫對自動生成標(biāo)識符的方式,自動選擇identity,sequence或hilo |
| uuid.hex | 采用128位的UUID算法生成標(biāo)識符 |
| uuid.string | UUID被編碼成一個16字符長的字符串 |
| assigned | 由java應(yīng)用程序負(fù)責(zé)生成標(biāo)識符 |
| foreign | 使用另外一個相關(guān)聯(lián)的對象的標(biāo)識符 |
increment:
-
Hibernate會先讀取對應(yīng)表中主鍵的最大值,接下來向表中插入記錄時,就在max(id)的基礎(chǔ)上遞增,增量為1
-
適用范圍:
-
適合所有的數(shù)據(jù)庫系統(tǒng)
-
適用于只有單個Hibernate應(yīng)用進(jìn)程訪問同一個數(shù)據(jù)庫的場合,在集群環(huán)境下不推薦使用
-
OID必須為long,int或short類型
-
identity:
-
要求底層數(shù)據(jù)庫把主鍵定義為自動增長類型
-
適用范圍:
-
支持自動增長字段類型的數(shù)據(jù)庫:DB2,Mysql,MSSQLServer,Sybase等
-
OID必須為long,int或short類型
-
sequence:
-
在持久化一個對象時,先從底層數(shù)據(jù)庫的序列中獲得一個唯一的標(biāo)識號,再把它作為主鍵值
-
適用范圍:
-
支持序列的數(shù)據(jù)庫:DB2,Oracle等
-
OID必須為long,int或short類型
-
hilo:
-
按照一種high/low算法生成標(biāo)識符,它從數(shù)據(jù)庫的特定表的字段中獲取high值
native:
-
適用范圍:
-
能根據(jù)底層數(shù)據(jù)庫系統(tǒng)的類型,自動選擇合適的標(biāo)識符生成器,因此很適合與跨數(shù)據(jù)庫平臺開發(fā)
-
OID必須為long,int或short類型
-
(6)Property
property元素用于指定類的屬性和表的字段的映射
-
name:指定該持久化類的屬性的名字
-
column:指定與類的屬性映射的表的字段名,如果沒有設(shè)置該屬性,將直接使用類的屬性名作為字段名
-
type:指定Hibernate映射類型
-
not-null:若該屬性為true,表名不允許為null,默認(rèn)為false
-
access:指定Hibernate的默認(rèn)的屬性訪問策略。默認(rèn)為property,若指定filed,則通過反射訪問成員變量
-
unique:設(shè)置是否為該屬性所映射的數(shù)據(jù)列添加唯一約束
-
index:指定一個字符串的索引名稱
-
length:指定該屬性所映射數(shù)據(jù)列的字段的長度
-
scale:指定該屬性鎖映射數(shù)據(jù)列的小樹數(shù)位
-
formula:設(shè)置一個SQL表達(dá)式,Hibernate將根據(jù)它來計(jì)算出派生屬性的值
-
formula="sql"
-
sql表達(dá)式中的列名和表名都應(yīng)該和數(shù)據(jù)庫對應(yīng),而不是和持久化對象的屬性對應(yīng)
-
如果需要在formula屬性中使用參數(shù),直接使用 where cur.id=id形式,其中id就是參數(shù),和當(dāng)前持久化對象的id屬性對應(yīng)的列的id值將被作為參數(shù)傳入
-
(7)java類型與SQL類型之間的對應(yīng)關(guān)系
| integer/int | java.lang.Integer/int | integer | 4字節(jié) |
| long | java.lang.Long/long | bigint | 8字節(jié) |
| short | java.lang.Short/short | smallint | 2字節(jié) |
| byte | java.lang.Byte/byte | tinyint | 1字節(jié) |
| float | java.lang.Float/float | float | 4字節(jié) |
| double | java.lang.Double/double | double | 6字節(jié) |
| 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 | 實(shí)現(xiàn)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類型可能對應(yīng)多個Hibernate映射類型。例如:如果持久化類的屬性為java.util.Date類型,對應(yīng)的Hibernate映射類型可以是date,time或timestamp。此時必須根據(jù)對應(yīng)的數(shù)據(jù)表的字段的SQL類型,來確定Hibernate映射類型
-
-
java大對象的Hibernate映射
-
java中,提供了Clob和Blob類型,對應(yīng)SQL中的CLOB和BLOB類型。CLOB表示字符串大對象,BLOB表示二進(jìn)制對象
-
Mysql不支持標(biāo)準(zhǔn)SQL的CLOB類型,在Mysql中,用text,mediumtext及l(fā)ongtext類型表示長文本數(shù)據(jù)
-
實(shí)際上在Java中處理長度超過255的字符串,使用String更方便
?
-
總結(jié)
以上是生活随笔為你收集整理的Hibernate之对象关系映射文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate之Session解析
- 下一篇: Hibernate之对象关系映射