一.單向一對(duì)多的關(guān)聯(lián)
通過在
一
方使用<set>元素標(biāo)識(shí)多
的對(duì)象;
班級(jí)對(duì)象代表一, 學(xué)生對(duì)象代表多
數(shù)據(jù)結(jié)構(gòu)中班級(jí)表學(xué)生表student2.gid 配置外鍵, 關(guān)聯(lián)班級(jí)表主鍵grade.gid
點(diǎn)擊查看練習(xí)代碼
- 班級(jí)Grade實(shí)體類將學(xué)生屬性設(shè)置為set集合
//在班級(jí)(一方)定義學(xué)生(多方)的集合
private Set<Student2> student2 = new HashSet<Student2>();
- 班級(jí)的hibernate映射文件Grade.hbm.xml的配置
<!-- 配置單向的一對(duì)多關(guān)聯(lián)關(guān)系 -->
<set name="student2" table="student2" inverse="false" lazy="true">
<!-- 指定關(guān)聯(lián)的外鍵列 -->
<key>
<column name="gid" />
</key>
<!-- 指定一對(duì)多中的Student2實(shí)體類 -->
<one-to-many class="entity.Student2" />
</set>
-
set的屬性說明:
二.單向多對(duì)一的關(guān)聯(lián)
- 多對(duì)一的關(guān)聯(lián)和關(guān)系型數(shù)據(jù)庫的外鍵參照關(guān)系匹配,
- 在已有表中的一個(gè)外鍵參照另一個(gè)表的主鍵(比如學(xué)生表添加外鍵關(guān)聯(lián)班級(jí)表主鍵)
- 通過在多方持有一方的引用實(shí)現(xiàn)
public class Student2 implements Serializable {
private int sid;
private String sname;
private String sex;
// 在多方定義一個(gè)一方的引用, 該學(xué)生所屬的班級(jí)
private Grade grade;
}
- 需要在"多"的一端使用<many-to-one>配置
Student2.hbm.xml配置
<!-- 配置多對(duì)一的關(guān)聯(lián)關(guān)系 -->
<many-to-one name="grade" class="entity.Grade" column="gid" ></many-to-one>
- 新增班級(jí)和學(xué)生( 學(xué)生-->班級(jí) 多對(duì)一 )單向關(guān)聯(lián)關(guān)系
/**
* 新增班級(jí)和學(xué)生( 學(xué)生-->班級(jí) 多對(duì)一 )單向關(guān)聯(lián)關(guān)系
*/
public static void add()
{
//實(shí)例班級(jí)以及學(xué)生對(duì)象
Grade grade = new Grade("JAVA-1班", "java1班都是精英");
Student2 st1 = new Student2("張三1", "男");
Student2 st2 = new Student2("李四1", "女");
//設(shè)置多對(duì)一關(guān)聯(lián)關(guān)系
st1.setGrade(grade); //學(xué)生張三1屬于JAVA-1班
st2.setGrade(grade);//學(xué)生李四1屬于JAVA-1班
//保存數(shù)據(jù)庫
Transaction tx = session.beginTransaction();
session.save(grade);
session.save(st1);
session.save(st2);
tx.commit();
HibernateUtil.closeSession();
}
調(diào)用后會(huì)輸出:
Hibernate: select max(gid) from grade
Hibernate: select max(sid) from student2
Hibernate: insert into grade (gname, gdesc, gid) values (?, ?, ?)
Hibernate: insert into student2 (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: insert into student2 (sname, sex, gid, sid) values (?, ?, ?, ?)
- 新增班級(jí)和學(xué)生( 班級(jí)-->學(xué)生一對(duì)多查剖,學(xué)生-->班級(jí)多對(duì)一 )雙向關(guān)聯(lián)關(guān)系
/**
* 新增班級(jí)和學(xué)生( 班級(jí)-->學(xué)生一對(duì)多射窒,學(xué)生-->班級(jí)多對(duì)一 )雙向關(guān)聯(lián)關(guān)系
*/
public static void add2()
{
//實(shí)例班級(jí)以及學(xué)生對(duì)象
Grade grade = new Grade("JAVA-1班", "java1班都是精英");
Student2 st1 = new Student2("張三1", "男");
Student2 st2 = new Student2("李四1", "女");
//設(shè)置關(guān)聯(lián)關(guān)系一對(duì)多
grade.getStudent2().add(st1);
grade.getStudent2().add(st2);
//設(shè)置多對(duì)一關(guān)聯(lián)關(guān)系
st1.setGrade(grade); //學(xué)生張三1屬于JAVA-1班
st2.setGrade(grade);//學(xué)生李四1屬于JAVA-1班
//保存數(shù)據(jù)庫
Transaction tx = session.beginTransaction();
session.save(grade);
session.save(st1);
session.save(st2);
tx.commit();
HibernateUtil.closeSession();
}
執(zhí)行后輸出:
Hibernate: select max(gid) from grade
Hibernate: select max(sid) from student2
Hibernate: insert into grade (gname, gdesc, gid) values (?, ?, ?)
Hibernate: insert into student2 (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: insert into student2 (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: update student2 set gid=? where sid=?
Hibernate: update student2 set gid=? where sid=?
以上結(jié)果多了下面的執(zhí)行語句,是多余的蕊温,因?yàn)槲覀兪请p向關(guān)聯(lián)關(guān)系扒磁,也就是說學(xué)生已經(jīng)知道自己屬于哪個(gè)班級(jí)庆揪,班級(jí)也已經(jīng)知道自已擁有哪些學(xué)生
Hibernate: update student2 set gid=? where sid=?
Hibernate: update student2 set gid=? where sid=?
所以需要在一方Grade.hbm.xml中進(jìn)行配置, set屬性 inverse=ture, 設(shè)置后就不會(huì)出現(xiàn)上面多余的兩行執(zhí)行語句
<!-- 配置單向的一對(duì)多關(guān)聯(lián)關(guān)系, inverse=ture代表由多方維護(hù)關(guān)聯(lián)關(guān)系,一方不需要進(jìn)行維護(hù) -->
<set name="student2" table="student2" inverse="false" lazy="true">
- cascade級(jí)聯(lián)屬性在保存班級(jí)信息時(shí)妨托,如果已經(jīng)對(duì)班級(jí)設(shè)置了班級(jí)屬性學(xué)生集合set缸榛,那么在執(zhí)行session.save(grade)保存班級(jí)的時(shí)候,系統(tǒng)會(huì)自動(dòng)判斷數(shù)據(jù)庫有無改該班級(jí)所擁有的學(xué)生兰伤,如果沒有則自動(dòng)insert學(xué)生内颗;
當(dāng)然保存學(xué)生信息session.save(student)時(shí)同理; - 保存一方級(jí)聯(lián)關(guān)聯(lián)對(duì)象配置Grade.hbm.xml
<!-- 配置單向的一對(duì)多關(guān)聯(lián)關(guān)系, inverse=ture代表由多方維護(hù)關(guān)聯(lián)關(guān)系敦腔,一方不需要進(jìn)行維護(hù)
cascade="save-update"代表當(dāng)進(jìn)行保存和更新時(shí)均澳,級(jí)聯(lián)操作所關(guān)聯(lián)的對(duì)象-->
<set name="student2" table="student2" inverse="true" lazy="true" cascade="save-update">
- 保存多方級(jí)聯(lián)關(guān)聯(lián)對(duì)象配置Student2.hbm.xml
<!-- 配置多對(duì)一的關(guān)聯(lián)關(guān)系 cascade="save-update"代表當(dāng)進(jìn)行保存和更新時(shí),級(jí)聯(lián)操作所關(guān)聯(lián)的對(duì)象 -->
<many-to-one name="grade" class="entity.Grade" column="gid" cascade="save-update"></many-to-one>
-
casecade屬性說明: