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)的更多相关文章

  1. Hibernate自身一对多和多对多关系映射

    一对多关系映射大家都明白,关系双方都一个含有对方多个引用,但自身一对多很多同学都不明白什么意思,那么首先我就说明一下什么是自身一对多,其实也很好理解,自身一对多就是自身含有本身的多个引用,例如新闻类别 ...

  2. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  3. Hibernate学习笔记(五) — 多对多关系映射

    多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多改动关系相当于在第三张表中先删除后添加 多对多谁维护效率都一样.看需求 在实际开发过程 ...

  4. 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】

    一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...

  5. 菜鸟学习Hibernate——多对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...

  6. Hibernate制图(两)——许多-于─关系映射

    上篇学习了Hibernate的基本映射,也就是单表映射,非常easy就能理解,可是对于关系数据库来说,表之间存在关系是比不可少的.关系数据库中存在的关系是通过主外键建立起来的.反应到Hibernate ...

  7. Java基础-SSM之mybatis一对多和多对一关系映射

    Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建customers表: ...

  8. 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

    old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...

  9. ORM映射(对象关系映射)

    ORM映射(对象关系映射)分创建表和操作表两个部分创建单表创建关联表(foreignKey) 一对一 一对多(重点) 多对多(重点) 创建表后加str方法把打印的地址转换成对应字符表的操作(增删改查) ...

随机推荐

  1. Nginx 配置指令的执行顺序(十一)

    紧跟在 post-access 阶段之后的是 try-files 阶段.这个阶段专门用于实现标准配置指令 try_files 的功能,并不支持 Nginx 模块注册处理程序.由于 try_files  ...

  2. NDEF-NFC数据交换格式

    为实现NFC标签.NFC设备以及NFC设备之间的交互通信,NFC论坛(NFC FROUM)定义了称为NFC数据交换格式(NDEF)的通用数据格式.NDEF是轻量级的紧凑的二进制格式,可带有URL,vC ...

  3. VMware网络模式介绍(下篇)

    VMware网络模式介绍 VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式). Bridged 模式: 在桥接模式下,VMwa ...

  4. python模块目录文件后续

    1,新增PythonModule加载path Ruiy tip(关于python list[]数据库类型特殊你懂的!append(""),extend([""] ...

  5. flex——dictionary跟Object的区别与遍历

    AS3中Object和 Dictionary都可以用来保存key-value形式的数据,Dictionary类和Object唯一的区别在于:Dictionary对象可以使用非字符串作为键值对的键.例如 ...

  6. spring 3配置文件中如何注入map list set等类型

    首先写个 javabean类吧,如下 package com.bean; import java.util.List; import java.util.Map; import java.util.P ...

  7. ffmpeg+SDl+ 播放器 -01

    最近因公司项目需要,打算自己在LINUX平台整一个播放器,来学习和研究音频编解码. 项目需求: 支持下列格式文件播放. 1> WMA 硬件解码,但需要软件分析ASF格式,提取Payload数据 ...

  8. Endian.BIG_ENDIAN和Endian.LITTLE_ENDIAN(http://smartblack.iteye.com/blog/1129097)

    Endian.BIG_ENDIAN和Endian.LITTLE_ENDIAN 在ByteArray和Socket中,能看到一个属性endain. endian : String 更改或读取数据的字节顺 ...

  9. 手机端页面自适应:rem布局

    rem布局非常简单,首页你只需在页面引入这段原生js代码就可以了 (function (doc, win) { var docEl = doc.documentElement, resizeEvt = ...

  10. Reverse Key Indexes反向索引

    Reverse Key Indexes反向索引A reverse key index is a type of B-tree index that physically reverses the by ...