------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------
本篇部落格将講述Hibernate中的多對多關聯關系的操作,準備的篇幅較少,望海涵
一,講述多對多
多對多的關聯關系,比如學生和教師來說,一個學生由多個教師授課,一個教師授課給多個學生,這就是多對多
講述多對多,首先要有一個表叫做中間表,他來承載關聯關系
二,實體類的建立
1.Stu學生類建立:
package cn.dawn.day04.entity;
/**
* Created by Dawn on 2018/6/2.
*/
import java.io.Serializable;
import java.util.Set;
/*學生實體類*/
public class Stu implements Serializable{
private Long sid;
private String sname;
/*教師對象集合*/
private Set<Tea> teas;
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Set<Tea> getTeas() {
return teas;
}
public void setTeas(Set<Tea> teas) {
this.teas = teas;
}
}
2.Tea教室類的建立:
package cn.dawn.day04.entity;
import java.io.Serializable;
import java.util.Set;
/**
* Created by Dawn on 2018/6/2.
*/
/*教師實體類*/
public class Tea implements Serializable {
private Long tid;
private String tname;
/*學生對象集合*/
private Set<Stu> stus;
public Long getTid() {
return tid;
}
public void setTid(Long tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public Set<Stu> getStus() {
return stus;
}
public void setStus(Set<Stu> stus) {
this.stus = stus;
}
}
三,hbm.xml檔案的建立
1.Stu.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.dawn.day04.entity">
<!--如果上面指定package的話,class的name就不必寫全類名-->
<!--lazy:是否懶加載(延遲加載) 預設值是true,延遲加載-->
<!--<class name="Teacher">-->
<!--直接加載-->
<class name="Stu" lazy="false">
<!--主鍵-->
<id name="sid" column="sid">
<!--主鍵生成策咯 assigned程式員自己建立-->
<!--identity是mysql裡的自增,一會做增加操作不必再給主鍵指派-->
<!--increment是先查最大的主鍵列,在下一條給主鍵加一-->
<!--sequence是oracle的主鍵生成策咯,他一會需要指定序列名字<param name="sequence">序列名</param>-->
<generator class="increment"></generator>
</id>
<property name="sname" column="tname"></property>
<!--table指的是中間表,承載關聯關系的表-->
<set name="teas" table="tea_stu" cascade="save-update" inverse="false">
<key>
<!--本類表的id-->
<column name="sid"></column>
</key>
<!--另外與他有多對多關聯的實體類-->
<many-to-many class="Tea" column="tid"></many-to-many>
</set>
</class>
</hibernate-mapping>
2.Tea.hbm.xml檔案的建立:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.dawn.day04.entity">
<!--如果上面指定package的話,class的name就不必寫全類名-->
<!--lazy:是否懶加載(延遲加載) 預設值是true,延遲加載-->
<!--<class name="Teacher">-->
<!--直接加載-->
<class name="Tea" lazy="false">
<!--主鍵-->
<id name="tid" column="tid">
<!--主鍵生成策咯 assigned程式員自己建立-->
<!--identity是mysql裡的自增,一會做增加操作不必再給主鍵指派-->
<!--increment是先查最大的主鍵列,在下一條給主鍵加一-->
<!--sequence是oracle的主鍵生成策咯,他一會需要指定序列名字<param name="sequence">序列名</param>-->
<generator class="increment"></generator>
</id>
<property name="tname" column="tname"></property>
<!--table指的是中間表,承載關聯關系的表-->
<set name="stus" table="tea_stu" cascade="save-update" inverse="false">
<key>
<!--本類表的id-->
<column name="tid"></column>
</key>
<!--另外與他有多對多關聯的實體類-->
<many-to-many class="Stu" column="sid"></many-to-many>
</set>
</class>
</hibernate-mapping>
四,hibernate.cfg.xml中管理上方倆個hbm.xml小配置檔案
<!--與小配置檔案映射-->
<mapping resource="cn/dawn/day04/dao/Tea.hbm.xml"></mapping>
<mapping resource="cn/dawn/day04/dao/Stu.hbm.xml"></mapping>
五,單測方法:
@Test
/*同時儲存,并建立關聯關系*/
public void t1ManyToManyInsert(){
/*
* 建立一個教師
*/
Tea tea1=new Tea();
tea1.setTname("老雨");
/**
* 建立倆個學生
*/
Stu stu1=new Stu();
stu1.setSname("小六");
Stu stu2=new Stu();
stu2.setSname("小八");
Set<Stu> students = new HashSet<Stu>();
students.add(stu1);
students.add(stu2);
/**
* 通過課程建立課程與學生之間的關系
*/
tea1.setStus(students);//因為課程是一個新的,是以根據沒有學生
/*新增*/
session.save(tea1);
/*事務送出*/
tr.commit();
/*
Hibernate: create table Stu (sid bigint not null, tname varchar(255), primary key (sid)) engine=MyISAM
Hibernate: create table Tea (tid bigint not null, tname varchar(255), primary key (tid)) engine=MyISAM
Hibernate: create table tea_stu (tid bigint not null, sid bigint not null, primary key (sid, tid)) engine=MyISAM
Hibernate: alter table tea_stu add constraint FK1lo22k662lgxr7d79rmfajlu3 foreign key (sid) references Stu (sid)
Hibernate: alter table tea_stu add constraint FKgq01y04i2r2ye5pd8abh5x42u foreign key (tid) references Tea (tid)
Hibernate: select max(tid) from Tea
Hibernate: select max(sid) from Stu
Hibernate: insert into Tea (tname, tid) values (?, ?)
Hibernate: insert into Stu (tname, sid) values (?, ?)
Hibernate: insert into Stu (tname, sid) values (?, ?)
Hibernate: insert into tea_stu (tid, sid) values (?, ?)
Hibernate: insert into tea_stu (tid, sid) values (?, ?)
* */
}
六,總結:
我認為此處寫的已經足夠,最好的學習方法就是嘗試,自己來試一下
我可以提出需求:
1.儲存單個學生
2.修改一個教師下關聯的學生
3.将一個學生關聯的所有教師都幹掉
等等等。。。。。。。。。。。。。