關(guān)聯(lián)映射
一對(duì)多雙向關(guān)聯(lián)
- 實(shí)體
package com.xingxue.day4.hibernate.demo1.domain;
import java.util.HashSet;
import java.util.Set;
// 一個(gè)班級(jí)對(duì)應(yīng)多個(gè)老師,一個(gè)老師屬于一個(gè)班級(jí)
public class ClassModel {
//標(biāo)識(shí)字段
private Long id;
//業(yè)務(wù)字段
private String cname;
private String description;
//關(guān)聯(lián)字段
private Set<TeacherModel> teacherModels = new HashSet<TeacherModel>();
public Set<TeacherModel> getTeacherModels() {
return teacherModels;
}
public void setTeacherModels(Set<TeacherModel> teacherModels) {
this.teacherModels = teacherModels;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
===============================================================================
package com.xingxue.day4.hibernate.demo1.domain;
public class TeacherModel {
private Long id;
private String tname;
private ClassModel classModel;
public ClassModel getClassModel() {
return classModel;
}
public void setClassModel(ClassModel classModel) {
this.classModel = classModel;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
}
- 映射文件
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.xingxue.day4.hibernate.demo1.domain.TeacherModel" table="t_teacher">
<id name="id" column="id">
<generator class="sequence">
<param name="sequence_name">
teacher_seq
</param>
</generator>
</id>
<property name="tname" column="tname"></property>
<!--通過(guò) many2one 描述 關(guān)系:多對(duì)一的關(guān)系
name 屬性: 設(shè)置關(guān)聯(lián)的字段名稱(chēng)
class 屬性: 關(guān)聯(lián)的類(lèi)型
column 子標(biāo)簽:設(shè)置多方的外鍵名稱(chēng)
-->
<many-to-one name="classModel" class="com.xingxue.day4.hibernate.demo1.domain.ClassModel" column="cid"/>
</class>
</hibernate-mapping>
===============================================================================
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.xingxue.day4.hibernate.demo1.domain.ClassModel" table="t_class">
<id name="id" column="id">
<generator class="sequence">
<param name="sequence_name">
class_seq
</param>
</generator>
</id>
<property name="cname" column="cname"></property>
<property name="description"></property>
<!-- set 標(biāo)簽 描述 關(guān)聯(lián)字段的 類(lèi)型
name 屬性: 關(guān)聯(lián)字段的名稱(chēng)
inverse 屬性:就是描述是否當(dāng)前實(shí)體是否放棄外鍵的維護(hù),默認(rèn)就是false,表示不放棄
設(shè)置為 true 表示 當(dāng)前實(shí)體放棄外鍵的維護(hù)。
-->
<set name="teacherModels" inverse="false">
<!-- 配置多方表中的外鍵,使用 key 標(biāo)簽
column 屬性:指定外鍵的名稱(chēng)
-->
<key>
<column name="cid"></column>
</key>
<!-- one2many 標(biāo)簽 描述 關(guān)系
class 屬性:設(shè)置關(guān)聯(lián)的類(lèi)型
-->
<one-to-many class="com.xingxue.day4.hibernate.demo1.domain.TeacherModel"></one-to-many>
</set>
</class>
</hibernate-mapping>
- 關(guān)系維護(hù)(inverse):默認(rèn)情況下,一方也可以維護(hù)外鍵的關(guān)系,多方必須維護(hù)外鍵的關(guān)系(也就是說(shuō),多方法不能設(shè)置 inverse屬性),往往 一方應(yīng)該放棄外鍵的維護(hù),因?yàn)椴捎靡环酵怄I維護(hù),會(huì)單獨(dú)的發(fā) update 語(yǔ)句去更新外鍵的值,造成多發(fā)sql 的情況。所以可以在一方的 set 標(biāo)簽上設(shè)置 inverse屬性為 true 表示放棄外鍵的維護(hù)。
<set name="teacherModels" inverse="true">
- 關(guān)聯(lián)對(duì)象導(dǎo)航圖查詢(xún)以及優(yōu)化(fetch)
一方 可以配置 fetch:
select(默認(rèn)的):先查主表,同過(guò)主表的記錄中的id 去分別發(fā)sql 查詢(xún)關(guān)聯(lián)表數(shù)據(jù)。
join: 采用 left outter join 進(jìn)行主從連接查詢(xún),如果采用 lazy 屬性 失效。
subselect:只有在一方配置文件中才有該選項(xiàng),在多方配置文件中沒(méi)有該選項(xiàng),在 hql 中 查詢(xún)主表有多個(gè)記錄的時(shí)候,在查詢(xún)關(guān)聯(lián)的數(shù)據(jù)的時(shí)候,就會(huì)采用 子查詢(xún)。
多方 可以配置 fetch:
select(默認(rèn)的):先查主表,同過(guò)主表的記錄中的id 去分別發(fā)sql 查詢(xún)關(guān)聯(lián)表數(shù)據(jù)。
join: 采用 left outter join 進(jìn)行主從連接查詢(xún),如果采用 lazy 屬性 失效。
級(jí)聯(lián)操作 (cascade)
cascade 屬性: 一般 delete 不要去配。
save-update:保存當(dāng)前實(shí)體,就會(huì)級(jí)聯(lián)保存關(guān)聯(lián)的實(shí)體
delete : 刪除當(dāng)前實(shí)體,級(jí)聯(lián)刪除關(guān)聯(lián)的實(shí)體
all : save-update 和 delete
delete-orphan:孤兒刪除,只能在 一對(duì)多關(guān)聯(lián)中使用.主表是一方,從表多方,如果從表的記錄沒(méi)有關(guān)聯(lián)主表的外鍵值,從表的該記錄可以視為是孤兒,就會(huì)刪除。
all-delete-orphan : all delete-orphan-
hql 關(guān)聯(lián)查詢(xún)
迫切左外連接
select c from ClassModel c left join fetch c.teacherModels ,發(fā)一條sql
左外連接
select c from ClassModel c left join c.teacherModels ,發(fā)兩條from ClassModel c left join c.teacherModels:返回的類(lèi)型是 Object[] 類(lèi)型
多對(duì)多雙向關(guān)聯(lián)
詳見(jiàn)代碼,注意一般來(lái)說(shuō)應(yīng)該放棄一方的外鍵維護(hù)