Hibernate之深入Hibernate的映射文件
這周周末 要把hibernate的映射文件搞定 。。
?1.映射文件的主結(jié)構(gòu)?
主要結(jié)構(gòu)? :根元素為<hibernate-mapping?></hibernate-mapping>??? 該元素下可以擁有多個<class></class>元素,每一個<class>元素代表一個持久化類的映射。
<hibernate-mapping>
??????? <class ></class>
?????? <class></class>
??????? .......
</hibernate-mapping>
其中<hibernate-mapping>元素支持如下屬性? :
schema:
catalog:
default-access:????指定hibernate默認的屬性訪問策略? ,默認值是property???,即通過getter方法和setter方法來訪問持久化類的屬性(Field)
default-lazy:?? 指定hibernate的延遲加載策略???,默認值是true ,即啟用啟用延遲加載策略。
auto-import:? 指定hibernate是否使用非全限定類名? 。默認值是true ,即可以使用非全限定的類名 (即不含報名)。
package: 該屬性 指定一個默認的包名 ,對于沒有使用全限定類名的 <class>映射塊 ,則到指定的包中去找該類。
其中<class>元素支持如下屬性:
<class>元素可是指定schema catalog default-access default-lazy auto-import package 屬性來覆蓋父元素<hibernate-mapping>中指定的值。
?name屬性?:指定要映射的持久化類的類名?? 建議是全限定類名(包名+類名),如果使用非全限定類名?? 則會到<hibernate-mapping>元素package屬性,指定的包中去找該類。
table屬性?? :指定該持久化類 映射成的表名? 。hibernate默認以持久化類的類名作為表名。
discriminator-value屬性:指定區(qū)分不同子類的值
mutable屬性 :指定 該持久化類的實例是可變對象還是不可變對象 。默認值是 true? 不可變對象時? 更新該對象? 數(shù)據(jù)庫表不更新? 但是可以insert??delete?
proxy屬性: 指定一個接口?(類),在延遲裝載時作為代理使用。
?dynamic-update屬性: 沒有更新的屬性 對應的數(shù)據(jù)列? 不會得到更新
dynamic-insert屬性:??? 沒有賦值的屬性 對應的數(shù)據(jù)列? 不會得到插入
select-before -update屬性; 執(zhí)行更新之間,是否先發(fā)起一條SQL查詢? 看看表中的數(shù)據(jù) 是否和持久化對象的屬性值一致?? 如果不一致就更新? 如果一致 就不更新
polymorphism屬性:
where屬性: 指定一個附加的SQL語句中的過濾條件? 。 只有符合該where條件的記錄才會被加載 出來
batchsize屬性:指定根據(jù)標示符來抓取實例時每批抓取的實例數(shù)。默認值時 1
optimistic-lock屬性 :指定樂觀鎖定策略 。默認值 是 version
check屬性? :指定一個SQL表達式? ,用于為該持久化類所映射成的表 指定一個多行的 約束
subselect屬性:
2.使用<class>元素映射持久化類??
使用<class>元素映射某個持久化類時,通常需要<id>和<property>兩個最常見的子元素。
<id>元素 映射表示標識屬性(Field)
<property>元素?? 映射普通屬性?? 如? String類型?? Date類型? Integer類型 等普通屬性
映射標識屬性?:?????? 使用<id>元素
?一般情況,hibernate建議為持久化類定義一個標識屬性,用于唯一的標識這個持久化類的一個實例 ,而標識屬性需要映射到對應數(shù)據(jù)表的主鍵。
<id>元素有如下可選屬性;
name屬性? : 指定該持久化類的標識屬性? 如果不設(shè)置,則表明該持久化類沒有標識屬性????? 該標識屬性映射為數(shù)據(jù)表的邏輯主鍵?? (什么是邏輯主鍵? 什么是物理主鍵??)
type屬性 : 指定該標識屬性的數(shù)據(jù)類型?? 建議使用全限定類名??如果不使用該屬性,由hibernate自行判斷標識屬性的數(shù)據(jù)類型?
column屬性:指定標識屬性所映射的數(shù)據(jù)表的列的列名。 如果不使用該屬性,默認列名與標識屬性名相同
access:????指定屬性訪問策略? ,默認值是property???,即通過getter方法和setter方法來標識屬性
主鍵生成器 <generator>,常見主鍵生成策略:
assigned :讓應用程序在save()一個對象之前,為這個對象分配一個標識符
native :讓hibernate根據(jù)底層數(shù)據(jù)庫的能力選擇? identity? sequence 或者hilo中的一個??
identity:? DB2,MySQL ,SQL Server 等數(shù)據(jù)庫 提供的identity(自增長)主鍵生成策略??。?? 返回的標識屬性是 long,short或int類型?? (建議使用包裝類)
sequence: DB2,Oracle,PostgreSQL 等數(shù)據(jù)庫? 提供的sequence主鍵生成策略 。?? ?返回的標識屬性是 long,short或int類型?? (建議使用包裝類)
hilo:
seqhilo :
uuid:
guid:
這樣使用?? :在<id>元素下???????<generator? class="native" />
?
映射普通屬性:?? 使用<property>元素???
<property>元素有以下可選屬性? :
name屬性? :指定持久化類的屬性名
column屬性?:指定持久化類的屬性 映射到數(shù)據(jù)表中的列名?? 如果不寫,默認列名為該屬性名
type屬性:指定該持久化類的普通屬性的 類型?? 建議使用全限定類名?(類名+包名)
formula屬性:
unique屬性:設(shè)置是否為該屬性所映射的數(shù)據(jù)列添加唯一約束
not-null屬性:設(shè)置是否為該屬性所映射的數(shù)據(jù)列添加非空約束
optimistic-lock屬性:設(shè)置該屬性在進行更新時是否需要使用樂觀鎖定
generated屬性:
index屬性:
unique-key屬性:
length屬性:
?
映射集合類型的屬性:
一個持久化類擁有集合類型的屬性也是非常常見的。
集合類型的屬性大致有兩種:第一種是單純的集合類型屬性,例如像List,Set或數(shù)組等。第二種是Map結(jié)構(gòu)的集合類型屬性。
Hibernate要求使用集合接口來聲明 集合類型的屬性。 所以可以用 Set接口,Collection接口,List接口,Map接口等,但不能使用ArrayList這樣的實現(xiàn)類來聲明屬性。
兩個持久化類的實例? 的? 集合類型屬性? 不能同時引用同一個集合對象。
集合類型屬性的映射的元素有如下:???? 不再使用<property>
<array>元素 :用于映射數(shù)組類型的屬性
<primitive-array>元素 :專門用于映射基本數(shù)據(jù)類型的數(shù)組
<list >元素??? :用于映射List集合類型的屬性
<set >元素?? :用于映射Set集合類型的屬性
<map >元素? :用于映射Map集合類型的屬性
<bag>元素 :用于映射無序集合類型的屬性
<idbag>元素:用于映射無序集合類型的屬性 ,但為集合增加邏輯次序。
集合類型的屬性 都是通過新建另外一張數(shù)據(jù)表? 然后通過這張數(shù)據(jù)表的一列與 主數(shù)據(jù)表的 邏輯主鍵列建立主外鍵關(guān)聯(lián)???其他列用于存儲集合類型屬性的值。
如 如下配置:
<array name="myArray"? >
??????????? <key column="id"></key>?????????????? //<key>元素會自動關(guān)聯(lián)主數(shù)據(jù)表中的 邏輯主鍵列??? column屬性指定新生成的數(shù)據(jù)表的對應列名
??????????? <list-index column="indexVal"></list-index>???????//<list-index>元素? 用于存儲數(shù)組類型屬性的?下標索引值??? ?column屬性指定新生成的數(shù)據(jù)表的對應列名
??????????? <element column="val" type="string"></element>??? //<element>元素? 用于存儲數(shù)組類型屬性的? 值?????? column屬性指定新生成的數(shù)據(jù)表的對應列名
</array>
由于list集合的底層是數(shù)組? 所以配置類似于數(shù)組的映射配置
<list name="myList">
??????????? <key column="id"></key>
??????????? <list-index column="indexVal"></list-index>
??????????? <element column="val" type="string"></element>
</list>
由于set集合 沒有索引?? 所以在新建的數(shù)據(jù)表中不用存索引值
<set name="mySet">
???????????? <key column="id"></key>
???????????? <element column="val" type="string"></element>
</set>
由于map集合 相對于set集合? 只是其中的每個數(shù)據(jù)對象 多了一個小尾巴 value
?<map name="myMap">
???????????? <key column="id"></key>
???????????? <map-key column="mapKey" type="string"></map-key>
???????????? <element column="mapValue" type="string"></element>
</map>
?
映射組件屬性
組件屬性:通過組合的方式為持久類提供 另一個Java Bean類的 屬性(Field)
Hibernate提供了 <component>元素來? 映射組件屬性? 組件屬性并不會想集合類型的屬性那樣 存放在另外一張新建的表中?
而是把組件類的屬性(基本類型,字符串,日期類型等)添加的映射到主數(shù)據(jù)表中的列??
?<component?? name="owner">???????? //name屬性是 組件屬性名
???????? <property? name="firstName" />??????? //name屬性是? 組件類的 屬性名
???????? <property? name="lastName" />??????? //name屬性是? 組件類的 屬性名
???????? <list >??????????????????????????????????????????? // 組件類 的 屬性是 list等集合類型屬性時???? 會映射到另外一張表
???????? </list >
???????? <component>??????????????????????????????? //組件類 中的屬性 是一個組件組件屬性時?? 可以嵌套?<component>元素
?????????</component>???
</component>
?。。。。。
幾種映射的特殊情況? :
集合類型的屬性? 中的元素是 一個組件類型????????? private??? List<Person>???myList;
這種情況? 需要在<list>元素中使用 <composite>元素
Map類型的屬性??中的key是一個組件類型?????????? private??? Map<Person , String>? myMap;
?
使用組件屬性 作為數(shù)據(jù)表的主鍵
?
多列作為聯(lián)合主鍵
轉(zhuǎn)載于:https://www.cnblogs.com/wangliyue/p/4137989.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Hibernate之深入Hibernate的映射文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS转的服务器磁盘规划
- 下一篇: (原创)OpenStack服务如何使用K