hibernate一對多關(guān)聯(lián)映射學(xué)習(xí)小結(jié)
一對多關(guān)聯(lián)映射
映射原理
一對多關(guān)聯(lián)映射和多對一關(guān)聯(lián)映射的映射原理是一致的,都是在多的一端加入一個外鍵,指向一的一端。關(guān)聯(lián)關(guān)系都是由多端維護(hù),只是在寫映射時發(fā)生了變化。
多對一和一對多的區(qū)別
多對一和一對多的區(qū)別在于維護(hù)的關(guān)系不同:
(1)多對一:多端維護(hù)一端的關(guān)系,在加載多端時,可以將一端加載上來。
(2)一對多:一端維護(hù)多端的關(guān)系,在加載一端時,可以將多端加載上來。
分類
一對多單向關(guān)聯(lián)映射
對象模型
從對象模型中,我們可以看出,Group持有User的一個引用。由于是單向關(guān)聯(lián),所以數(shù)據(jù)在加載Group時,會把User加載上來,但是User并不知道Group的存在。
我們先看一下Group和User的實體,以及映射文件。
Group
package com.bjpowernode.hibernate;
import java.util.Set;
public class Group {
private int id;
private String name;
private Set users;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
}
User
package com.bjpowernode.hibernate;
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
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> <class name="com.bjpowernode.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
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.bjpowernode.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- users屬性,表達(dá)的是本對象與User的一對多的關(guān)系 -->
<set name="users">
<!--當(dāng)前表(Group)的主鍵-->
<key column="groupid"/>
<one-to-many class="com.bjpowernode.hibernate.User"/>
</set>
</class>
</hibernate-mapping>
生成的表結(jié)構(gòu)和測試數(shù)據(jù)


缺點(diǎn)
1)因為多端User不知道Group的存在(也就是User不維護(hù)與Group的關(guān)系),所以在保存User時,關(guān)系字段groupId為null,如果該字段設(shè)置為非空,則將無法保存數(shù)據(jù)。
2)因為User不維護(hù)關(guān)系,而Group維護(hù)關(guān)系,Group就會發(fā)出多余的update語句,保證Group和User有關(guān)系,這樣加載Group時才把該Users對應(yīng)的用戶加載上來。
一對多雙向關(guān)聯(lián)映射
對象模型
雙向關(guān)聯(lián)映射對比單向關(guān)聯(lián)映射,對象的加載方向由單向變成了雙向。
我們看一下Group和User的實體,映射文件
Group
package com.bjpowernode.hibernate;
import java.util.Set;
public class Group {
private int id;
private String name;
private Set users;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
}
User
package com.bjpowernode.hibernate;
public class User {
private int id;
private String name;
private Group groups;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Group getGroups() {
return groups;
}
public void setGroups(Group groups) {
this.groups = 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.bjpowernode.hibernate"> <class name="Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 影響控制反轉(zhuǎn):inverse="false",多的一端維護(hù)關(guān)系,讓一的一端失效 --> <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.bjpowernode.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- groups屬性,表達(dá)的是本對象與Group的多對一的關(guān)系 --> <many-to-one name="groups" class="Group" column="groupid"/> </class> </hibernate-mapping>
生成的表和測試數(shù)據(jù)


一對多雙向關(guān)聯(lián)的映射方式:
1)在一的一端的集合上采用<key>標(biāo)簽,在多的一端加入一個外鍵
2)在多的一端采用<many-to-one>標(biāo)簽
注意:<key>標(biāo)簽和<many-to-one>標(biāo)簽加入的字段保持一直,否則會產(chǎn)生數(shù)據(jù)混亂。
inverse屬性:
inverse屬性可以用在一對多和多對多雙向關(guān)聯(lián)上,inverse屬性默認(rèn)為false,為false表示本端維護(hù)關(guān)系,如果inverse為true,則本端不能維護(hù)關(guān)系,會交給另一端維護(hù)關(guān)系,本端失效。所以一對多關(guān)聯(lián)映射我們通常在多的一端維護(hù)關(guān)系,讓一的一端失效,所以設(shè)置為inverse為true。
注意:inverse屬性,只影響數(shù)據(jù)的存儲,也就是持久化。
目的
一對多雙向關(guān)聯(lián)映射的目的主要是為了解決一對多單向關(guān)聯(lián)的缺陷而不是需求驅(qū)動的。
總結(jié)
以上所述是小編給大家介紹的hibernate一對多關(guān)聯(lián)映射學(xué)習(xí)小結(jié),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
java正則表達(dá)式如何獲取xml文件中指定節(jié)點(diǎn)的值
這篇文章主要介紹了java正則表達(dá)式如何獲取xml文件中指定節(jié)點(diǎn)的值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
Java?guava框架LoadingCache及CacheBuilder本地小容量緩存框架總結(jié)
Guava?Cache本地緩存框架主要是一種將本地數(shù)據(jù)緩存到內(nèi)存中,但數(shù)據(jù)量并不能太大,否則將會占用過多的內(nèi)存,本文給大家介紹Java?guava框架?LoadingCache及CacheBuilder?本地小容量緩存框架總結(jié),感興趣的朋友一起看看吧2023-12-12
詳解Java中的do...while循環(huán)語句的使用方法
這篇文章主要介紹了Java中的do...while循環(huán)語句的使用方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10
SpringBoot中通過8項配置優(yōu)化提升Tomcat性能的配置方法
優(yōu)化Spring Boot,Spring Cloud 應(yīng)用程序中Tomcat的配置有助于提高性能和資源利用率,這篇文章主要介紹了SpringBoot中通過8項配置優(yōu)化提升Tomcat性能的配置方法,需要的朋友可以參考下2024-08-08

