Hibernate-ORM:12.Hibernate中的多对多关联关系
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
本篇博客将讲述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.将一个学生关联的所有教师都干掉
等等等。。。。。。。。。。。。。
Hibernate-ORM:12.Hibernate中的多对多关联关系的更多相关文章
- Hibernate双向一对多、双向多对多关联关系中的映射文件怎么写
这里以一对多关联关系为例.以Country类为一端,Competition类为多端. 一个国家可以有多个赛事,但是一个赛事只能属于一个国家. Country类 public class Country ...
- 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询
这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...
- (转)Hibernate框架基础——多对多关联关系映射
http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个 ...
- Hibernate中双向多对多的两种配置方式
Hibernate中双向多对多的两种配置方式 1.建立多对多双向关联关系 package cn.happy.entitys; import java.util.HashSet; import java ...
- Hibernate (ORM)
1 框架体系结构 2 hibernate入门 2.1 ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational: ...
- Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XM ...
- 【Hibernate框架】关联映射(多对多关联映射)
按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...
- Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)
One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...
- ORM和Hibernate的配置方式
分层体系结构: 逻辑上一般分为三层:表述层(提供与用户交互的界面).业务逻辑层(实现各种业务的逻辑).数据库层(负责存放和管理应用的持久性业务数据). 物理上一般分为两层:物理层(每一层都运行在网络上 ...
随机推荐
- UOJ 48 次最大公约数
次最大公约数 = gcd / 其中一个数质因数中最小的. gcd(42,12) = 6; div(42) = 2*3*7 div(12) = 2^2*3 sgcd(42,12) = 6 / ...
- Black Rock Shooter 题解
题目描述 在人气动漫 Black Rock shooter 中,当加贺里对麻陶 说出了“滚回去“以后,与此同时,在另一个心灵世界里, BRS 也遭到了敌人的攻击.此时,一共有 n 个攻击排成一行 朝着 ...
- Cesium.js学习第二天(立方体)
var viewer = new Cesium.Viewer('cs'); viewer.entities.add({//图标 position: Cesium.Cartesian3.fromDegr ...
- P1272
P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...
- 【洛谷P1367】蚂蚁
蚂蚁 [题目描述] 在一根无限长的木棍上,用n只蚂蚁,每只蚂蚁有一个初始位置和初始朝向,蚂蚁们以每秒一个单位的速度向前移动,当两只蚂蚁相遇时,它们会掉头(掉头时间忽略不计).现给出每只蚂蚁的初始位置和 ...
- .NET 小程序 wx.getUserInfo(OBJECT) 解密 encryptedData 来获取UnionId
在小程序中通过 wx.getUserInfo 获取用户信息,而UnionId 只有关主了公众号才会返回,不关注公众号想获取UnionId则需要我们从返回的 encryptedData 中解码从而获取U ...
- JS JavaScript深拷贝、浅拷贝
浅拷贝:浅拷贝只是复制了内存地址,如果原地址中的对象改变了,浅拷贝出来的对象也会相应改变. 深拷贝:开辟了一块新的内存存放地址和地址指向的对象,原地址的任何对象改变了,深拷贝出来的对象不变. 浅拷贝数 ...
- LeetCode6.Z字形变换 JavaScript
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...
- vue-resource+iview上传文件取消上传
vue-resource+iview上传文件取消上传 子组件: <template> <div class="upload-area-div"> <U ...
- Java并发编程:JMM和volatile关键字
转载请标明出处: http://blog.csdn.net/forezp/article/details/77580491 本文出自方志朋的博客 Java内存模型 随着计算机的CPU的飞速发展,CPU ...