日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate之深入Hibernate的映射文件

發布時間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate之深入Hibernate的映射文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這周周末 要把hibernate的映射文件搞定 。。

?1.映射文件的主結構?

主要結構? :根元素為<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屬性:指定區分不同子類的值

mutable屬性 :指定 該持久化類的實例是可變對象還是不可變對象 。默認值是 true? 不可變對象時? 更新該對象? 數據庫表不更新? 但是可以insert??delete?

proxy屬性: 指定一個接口?(類),在延遲裝載時作為代理使用。

?dynamic-update屬性: 沒有更新的屬性 對應的數據列? 不會得到更新

dynamic-insert屬性:??? 沒有賦值的屬性 對應的數據列? 不會得到插入

select-before -update屬性; 執行更新之間,是否先發起一條SQL查詢? 看看表中的數據 是否和持久化對象的屬性值一致?? 如果不一致就更新? 如果一致 就不更新

polymorphism屬性:

where屬性: 指定一個附加的SQL語句中的過濾條件? 。 只有符合該where條件的記錄才會被加載 出來

batchsize屬性:指定根據標示符來抓取實例時每批抓取的實例數。默認值時 1

optimistic-lock屬性 :指定樂觀鎖定策略 。默認值 是 version

check屬性? :指定一個SQL表達式? ,用于為該持久化類所映射成的表 指定一個多行的 約束

subselect屬性:

2.使用<class>元素映射持久化類??

使用<class>元素映射某個持久化類時,通常需要<id>和<property>兩個最常見的子元素。

<id>元素 映射表示標識屬性(Field)

<property>元素?? 映射普通屬性?? 如? String類型?? Date類型? Integer類型 等普通屬性

映射標識屬性?:?????? 使用<id>元素

?一般情況,hibernate建議為持久化類定義一個標識屬性,用于唯一的標識這個持久化類的一個實例 ,而標識屬性需要映射到對應數據表的主鍵。

<id>元素有如下可選屬性;

name屬性? : 指定該持久化類的標識屬性? 如果不設置,則表明該持久化類沒有標識屬性????? 該標識屬性映射為數據表的邏輯主鍵?? (什么是邏輯主鍵? 什么是物理主鍵??)

type屬性 : 指定該標識屬性的數據類型?? 建議使用全限定類名??如果不使用該屬性,由hibernate自行判斷標識屬性的數據類型?

column屬性:指定標識屬性所映射的數據表的列的列名。 如果不使用該屬性,默認列名與標識屬性名相同

access:????指定屬性訪問策略? ,默認值是property???,即通過getter方法和setter方法來標識屬性

主鍵生成器 <generator>,常見主鍵生成策略:

assigned :讓應用程序在save()一個對象之前,為這個對象分配一個標識符

native :讓hibernate根據底層數據庫的能力選擇? identity? sequence 或者hilo中的一個??

identity:? DB2,MySQL ,SQL Server 等數據庫 提供的identity(自增長)主鍵生成策略??。?? 返回的標識屬性是 long,short或int類型?? (建議使用包裝類)

sequence: DB2,Oracle,PostgreSQL 等數據庫? 提供的sequence主鍵生成策略 。?? ?返回的標識屬性是 long,short或int類型?? (建議使用包裝類)

hilo:

seqhilo :

uuid:

guid:

這樣使用?? :在<id>元素下???????<generator? class="native" />

?

映射普通屬性:?? 使用<property>元素???

<property>元素有以下可選屬性? :

name屬性? :指定持久化類的屬性名

column屬性?:指定持久化類的屬性 映射到數據表中的列名?? 如果不寫,默認列名為該屬性名

type屬性:指定該持久化類的普通屬性的 類型?? 建議使用全限定類名?(類名+包名)

formula屬性:

unique屬性:設置是否為該屬性所映射的數據列添加唯一約束

not-null屬性:設置是否為該屬性所映射的數據列添加非空約束

optimistic-lock屬性:設置該屬性在進行更新時是否需要使用樂觀鎖定

generated屬性:

index屬性:

unique-key屬性:

length屬性:

?

映射集合類型的屬性:

一個持久化類擁有集合類型的屬性也是非常常見的。

集合類型的屬性大致有兩種:第一種是單純的集合類型屬性,例如像List,Set或數組等。第二種是Map結構的集合類型屬性。

Hibernate要求使用集合接口來聲明 集合類型的屬性。 所以可以用 Set接口,Collection接口,List接口,Map接口等,但不能使用ArrayList這樣的實現類來聲明屬性。

兩個持久化類的實例? 的? 集合類型屬性? 不能同時引用同一個集合對象。

集合類型屬性的映射的元素有如下:???? 不再使用<property>

<array>元素 :用于映射數組類型的屬性

<primitive-array>元素 :專門用于映射基本數據類型的數組

<list >元素??? :用于映射List集合類型的屬性

<set >元素?? :用于映射Set集合類型的屬性

<map >元素? :用于映射Map集合類型的屬性

<bag>元素 :用于映射無序集合類型的屬性

<idbag>元素:用于映射無序集合類型的屬性 ,但為集合增加邏輯次序。

集合類型的屬性 都是通過新建另外一張數據表? 然后通過這張數據表的一列與 主數據表的 邏輯主鍵列建立主外鍵關聯???其他列用于存儲集合類型屬性的值。

如 如下配置:

<array name="myArray"? >
??????????? <key column="id"></key>?????????????? //<key>元素會自動關聯主數據表中的 邏輯主鍵列??? column屬性指定新生成的數據表的對應列名
??????????? <list-index column="indexVal"></list-index>???????//<list-index>元素? 用于存儲數組類型屬性的?下標索引值??? ?column屬性指定新生成的數據表的對應列名
??????????? <element column="val" type="string"></element>??? //<element>元素? 用于存儲數組類型屬性的? 值?????? column屬性指定新生成的數據表的對應列名

</array>

由于list集合的底層是數組? 所以配置類似于數組的映射配置

<list name="myList">
??????????? <key column="id"></key>
??????????? <list-index column="indexVal"></list-index>
??????????? <element column="val" type="string"></element>
</list>

由于set集合 沒有索引?? 所以在新建的數據表中不用存索引值

<set name="mySet">
???????????? <key column="id"></key>
???????????? <element column="val" type="string"></element>
</set>

由于map集合 相對于set集合? 只是其中的每個數據對象 多了一個小尾巴 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>元素來? 映射組件屬性? 組件屬性并不會想集合類型的屬性那樣 存放在另外一張新建的表中?

而是把組件類的屬性(基本類型,字符串,日期類型等)添加的映射到主數據表中的列??

?<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;

?

使用組件屬性 作為數據表的主鍵

?

多列作為聯合主鍵

轉載于:https://www.cnblogs.com/wangliyue/p/4137989.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Hibernate之深入Hibernate的映射文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。