------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
本篇博客将讲述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.将一个学生关联的所有教师都干掉
等等等。。。。。。。。。。。。。