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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate 一对一关联关系

發(fā)布時(shí)間:2025/6/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate 一对一关联关系 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

雙向一對(duì)一關(guān)聯(lián)關(guān)系:

域模型:

  例如,部門只有一個(gè)部門經(jīng)理,一個(gè)經(jīng)理也只能管理一個(gè)部門。即,Department 中有一個(gè)Manager的引用,Manager 中又有一個(gè)Department 的引用。

關(guān)系數(shù)據(jù)模型:

  按照主鍵映射: 這種方式跟 多對(duì)一關(guān)聯(lián)關(guān)系非常相似,比如department 表有一個(gè)外鍵 MANAGER_ID 指向manager 表的ID, 此時(shí)Department 和 Manager 對(duì)應(yīng)的這兩張表是多對(duì)一的關(guān)聯(lián)關(guān)系,為了實(shí)現(xiàn)一對(duì)一的關(guān)聯(lián)關(guān)系,只要給 外鍵 MANAGER_ID 加上一個(gè)唯一約束,則可以實(shí)現(xiàn)一對(duì)一關(guān)聯(lián)關(guān)系。

    需要注意的問題:

    ①、保存:建議先保存沒有外鍵列的那一端的對(duì)象。

    ②、查詢:默認(rèn)情況下使用懶加載異常。

    ③、沒有外鍵的一端需要使用?one-to-one 元素,該元素使用property-ref 屬性指定使用 被關(guān)聯(lián)實(shí)體主鍵以外的字段作為關(guān)聯(lián)字段。

    ④、在查詢沒有外鍵關(guān)聯(lián)的一端對(duì)象的時(shí)候,使用左外連接一并查詢出其關(guān)聯(lián)的對(duì)象,并進(jìn)行初始化。

      也就是說(shuō):把懶加載屬性設(shè)為true 的時(shí)候,查詢 Manager 會(huì)一并把Department 查詢出來(lái),但是查詢Department 并不會(huì)把Manager對(duì)象查詢出來(lái)。

  按照外鍵映射:

    擁有外鍵的一端生成主鍵的方式要注意,不是使用 native ,而是使用 foreign

?

    示例:

    實(shí)體類按照主鍵映射的一樣,區(qū)別在于映射文件。這里將映射文件代碼貼出來(lái)。

Department類的映射文件

<class name="com.zcd.hibernate.oneToOnePrimary.Department" table="DEPARTMENT"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="foreign" > <!-- 生成主鍵的方式 --><param name="property">manager</param> <!-- 還要指定根據(jù)。。。 --></generator></id><property name="name" type="java.lang.String"><column name="NAME" /></property><one-to-one name="manager" class="com.zcd.hibernate.oneToOnePrimary.Manager" constrained="true"></one-to-one></class>

?

Manager的映射文件

<class name="com.zcd.hibernate.oneToOnePrimary.Manager" table="MANAGER"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="native" /></id><property name="name" type="java.lang.String"><column name="NAME" /></property><one-to-one name="department" class="com.zcd.hibernate.oneToOnePrimary.Department"></one-to-one></class>

不管先插入哪一個(gè)對(duì)象,都會(huì)先發(fā)送被拿主鍵來(lái)作為他人外鍵的那個(gè)對(duì)象的插入SQL語(yǔ)句,比如這里不管先插入Department 還是Manager,都會(huì)先發(fā)送插入Manager 的SQL語(yǔ)句。

?

?

有一個(gè)疑問:下面的代碼為什么會(huì)保存兩次 Manager 對(duì)象呢?

@Testpublic void testDepartmentAndManager(){Department department = new Department();department.setName("研發(fā)部");Manager manager = new Manager();manager.setName("BB");department.setManager(manager);manager.setDepartment(department);oneToOnePrimaryService.saveDepartment(department);oneToOnePrimaryService.saveManager(manager);}

?

Hibernate 一對(duì)一關(guān)聯(lián)關(guān)系,使用外鍵映射和使用主鍵映射的區(qū)別:

目前發(fā)現(xiàn)的一點(diǎn)區(qū)別如下,以后發(fā)現(xiàn)了在進(jìn)行添加。

?

?外鍵映射主鍵映射
生成主鍵方式

使用native

?

<generator class="native" />

?

使用foreign還有

<generator class="foreign" ><param name="property">company</param> </generator>

?

??使用many-to-one?加上unique屬性,另一端不需要修改,按自動(dòng)生成的使用?使用one-to-one,加上contrained="true"屬性,另一端不需要修改,按自動(dòng)生成的使用

轉(zhuǎn)載于:https://www.cnblogs.com/GooPolaris/p/7919416.html

總結(jié)

以上是生活随笔為你收集整理的Hibernate 一对一关联关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。