Hibernate 、多表关联映射 - 多对多关系映射(many-to-many)
hibernate.cfg.xml:
<hibernate-configuration>
<session-factory name="sessionFactory">
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="cn/hbm/Teacher.hbm.xml" />
<mapping resource="cn/hbm/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
Teacher:
public class Teacher {
private Integer id;
private String name;
private Set<Student> students;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
hbm.xml
<hibernate-mapping package="cn.model">
<class name="Teacher" table="TEACHER">
<id name="id" column="ID">
<generator class="native"></generator>
</id>
<property name="name" column="NAME" type="java.lang.String" />
<set name="students" table="TEACHER_STUDENT">
<key column="TEACHER_ID" />
<many-to-many class="Student" column="STUDENT_ID" />
</set>
</class>
</hibernate-mapping>
Student:
public class Student {
private Integer id;
private String name;
private Set<Teacher> teachers;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
hbm.xml:
<hibernate-mapping package="cn.model">
<class name="Student" table="STUDENT">
<id name="id" column="ID">
<generator class="native"></generator>
</id>
<property name="name" column="NAME" type="java.lang.String" />
<set name="teachers" table="TEACHER_STUDENT">
<key column="STUDENT_ID" />
<many-to-many class="Teacher" column="TEACHER_ID" />
</set>
</class>
</hibernate-mapping>
测试添加代码:
public void saveTeacherAndStudent(){
Session session=null;
Transaction tran=null;
try{
Teacher t1=new Teacher();
t1.setName("张老师");
Teacher t2=new Teacher();
t2.setName("王老师");
Student stu1=new Student();
stu1.setName("小明");
Student stu2=new Student();
stu2.setName("小强");
Set<Student> set1=new HashSet<Student>();
set1.add(stu1);
set1.add(stu2);
Set<Student> set3=new HashSet<Student>();
set3.add(stu1);
t1.setStudents(set1);
t2.setStudents(set3);
session=HibernateSessionFactory.getSession();
tran=session.beginTransaction();
session.save(t1);
session.save(t2);
session.save(stu1);
session.save(stu2);
tran.commit();
}catch(Exception e){
if(session!=null){
session.close();
}
}
}
添加完成以后,会看到数居库中多添加了一个TEACHER_STUDENT表,表中有两个字段作为联合主键;多对多关系其实就是两个一多的结合体;
测试查询:
public Teacher getTeacherById(Integer id){
Session session=null;
try{
session=HibernateSessionFactory.getSession();
return (Teacher)session.get(Teacher.class, id);
}catch(Exception e){
if(session!=null){
session.close();
}
}
return null;
}
public Student getStudentById(Integer id){
Session session=null;
try{
session=HibernateSessionFactory.getSession();
return (Student)session.get(Student.class, id);
}catch(Exception e){
if(session!=null){
session.close();
}
}
return null;
}
@Test
public void testManytoMany2(){
Demo demo=new Demo();
Teacher t=demo.getTeacherById(3);
System.out.println("老师名字:"+t.getName());
System.out.println("----有学生:");
for(Student stu : t.getStudents()){
System.out.println(stu.getName());
}
}
通过老师查询老师下有多少学生的这一操作其实是使用了一个关联查询来实现的。下面的通过学生查老师也是同理:
@Test
public void testManytoMany3(){
Demo demo=new Demo();
Student stu=demo.getStudentById(3);
System.out.println("学生名字:"+stu.getName());
System.out.println("----有老师:");
for(Teacher t : stu.getTeachers()){
System.out.println(t.getName());
}
}
Hibernate 、多表关联映射 - 多对多关系映射(many-to-many)的更多相关文章
- Hibernate自身一对多和多对多关系映射
一对多关系映射大家都明白,关系双方都一个含有对方多个引用,但自身一对多很多同学都不明白什么意思,那么首先我就说明一下什么是自身一对多,其实也很好理解,自身一对多就是自身含有本身的多个引用,例如新闻类别 ...
- Hibernate多对多关系映射(建表)
下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...
- Hibernate学习笔记(五) — 多对多关系映射
多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多改动关系相当于在第三张表中先删除后添加 多对多谁维护效率都一样.看需求 在实际开发过程 ...
- 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】
一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...
- 菜鸟学习Hibernate——多对多关系映射
Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...
- Hibernate制图(两)——许多-于─关系映射
上篇学习了Hibernate的基本映射,也就是单表映射,非常easy就能理解,可是对于关系数据库来说,表之间存在关系是比不可少的.关系数据库中存在的关系是通过主外键建立起来的.反应到Hibernate ...
- Java基础-SSM之mybatis一对多和多对一关系映射
Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建customers表: ...
- 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】
old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...
- ORM映射(对象关系映射)
ORM映射(对象关系映射)分创建表和操作表两个部分创建单表创建关联表(foreignKey) 一对一 一对多(重点) 多对多(重点) 创建表后加str方法把打印的地址转换成对应字符表的操作(增删改查) ...
随机推荐
- JAVA中synchronized和lock详解
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...
- MEMS陀螺仪(gyroscope)的结构
MEMS陀螺仪(gyroscope)的设计和工作原理可能各种各样,但是公开的MEMS陀螺仪均采用振动物体传感角速度的概念.利用振动来诱导和探测科里奥利力而设计的MEMS陀螺仪没有旋转部件.不需要轴承, ...
- Linux常用C函数---内存控制篇
函数讲解部分参考http://net.pku.edu.cn/~yhf/linux_c/ calloc(配置内存空间) 相关函数 malloc,free,realloc,brk 表头文件 #includ ...
- linux之SQL语句简明教程---Alias
接下来,我们讨论 alias (别名) 在 SQL 上的用处.最常用到的别名有两种: 栏位别名及表格别名. 简单地来说,栏位别名的目的是为了让 SQL 产生的结果易读.在之前的例子中,每当我们有营业额 ...
- javascript数据类型、初始化
Javascript数据类型有6种: 数值型数据类型(Number): 字符串(String): 布尔型数据(Boolean): 对象数据(Object): 空(Null): 未定义(Undefine ...
- linux学习方法之六
相信不少想学习linux的新手们正愁不知道看什么linux学习教程好,下面小编给大家收集和整理了几点比较重要的教程,供大家学习,如需想学习更多的话,可到wdlinux学堂寻找更多教程. 1.linux ...
- Make 命令教程 -- 阮一峰
摘自http://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(c ...
- 奇妙的算法之LCS妙解
LCS算法妙解 LCS问题简述:最长公共子序列 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列. LCS问题的分支:最长公共子串 ...
- Cooley-Tukey算法 (蝶形算法)
Cooley-Tukey算法差别于其它FFT算法的一个重要事实就是N的因子能够随意选取.这样也就能够使用N=rS的Radix-r算法了.最流行的算法都是以r=2或r=4为基的,最简单的DFT不须要不论 ...
- Endian.BIG_ENDIAN和Endian.LITTLE_ENDIAN(http://smartblack.iteye.com/blog/1129097)
Endian.BIG_ENDIAN和Endian.LITTLE_ENDIAN 在ByteArray和Socket中,能看到一个属性endain. endian : String 更改或读取数据的字节顺 ...