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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hibernate一对多关联映射

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate一对多关联映射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一對多關聯映射

映射原理

?

??????一對多關聯映射和多對一關聯映射的映射原理是一致的,都是在多的一端加入一個外鍵,指向一的一端。關聯關系都是由多端維護,只是在寫映射時發生了變化。

?

多對一和一對多的區別

???????? 多對一和一對多的區別在于維護的關系不同:

(1)多對一:多端維護一端的關系,在加載多端時,可以將一端加載上來。

(2)一對多:一端維護多端的關系,在加載一端時,可以將多端加載上來。

?

分類

一、一對多單向關聯映射

??????從對象模型中,我們可以看出,Group持有User的一個引用。由于是單向關聯,所以數據在加載Group時,會把User加載上來,但是User并不知道Group的存在。

我們先看一下Group和User的實體,以及映射文件。

Group

public class Group { private int id; private String name; private Set users; ... }

User

public class User { private int id; private String name; ... }

Group.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.liang.hibernate.Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- users屬性,表達的是本對象與User的一對多的關系 --> <set name="users"> <!--當前表(Group)的主鍵--> <key column="groupid"/> <one-to-many class="com.liang.hibernate.User"/> </set> </class> </hibernate-mapping>

缺點:

1)因為多端User不知道Group的存在(也就是User不維護與Group的關系),所以在保存User時,關系字段groupId為null,如果該字段設置為非空,則將無法保存數據。

2)因為User不維護關系,而Group維護關系,Group就會發出多余的update語句,保證Group和User有關系,這樣加載Group時才把該Users對應的用戶加載上來。

二、一對多雙向關聯映射

?雙向關聯映射對比單向關聯映射,對象的加載方向由單向變成了雙向。

我們看一下Group和User的實體,映射文件

Group

public class Group { private int id; private String name; private Set users; ... }

User

public class User { private int id; private String name; private Group groups; ... }

Group.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liang.hibernate"> <class name="Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 影響控制反轉:inverse="false",多的一端維護關系,讓一的一端失效 --> <set name="users" inverse="true"> <key column="groupid" not-null="true"/> <one-to-many class="User"/> </set> </class> </hibernate-mapping>

User.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liang.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- groups屬性,表達的是本對象與Group的多對一的關系 --> <many-to-one name="groups" class="Group" column="groupid"/> </class> </hibernate-mapping>

一對多雙向關聯的映射方式:
?1)在一的一端的集合上采用<key>標簽,在多的一端加入一個外鍵
?2)在多的一端采用<many-to-one>標簽

注意:<key>標簽和<many-to-one>標簽加入的字段保持一直,否則會產生數據混亂。

inverse屬性:

???????? inverse屬性可以用在一對多和多對多雙向關聯上,inverse屬性默認為false,為false表示本端維護關系,如果inversetrue,則本端不能維護關系,會交給另一端維護關系,本端失效。所以一對多關聯映射我們通常在多的一端維護關系,讓一的一端失效,所以設置為inversetrue。

注意:inverse屬性,只影響數據的存儲,也就是持久化。

目的:

???????一對多雙向關聯映射的目的主要是為了解決一對多單向關聯的缺陷而不是需求驅動的。

?

轉載于:https://www.cnblogs.com/gXing/p/8650291.html

總結

以上是生活随笔為你收集整理的hibernate一对多关联映射的全部內容,希望文章能夠幫你解決所遇到的問題。

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