多对多关系映射

多对多建立关系相当于在第三张表中插入一行数据

多对多解除关系相当于在第三张表中删除一行数据

多对多改动关系相当于在第三张表中先删除后添加

多对多谁维护效率都一样。看需求

在实际开发过程中。多对多的映射关系比較常见。

学生选课演示样例,一个学生能够选多门课,一门课也能够由多个学生去选,这样就形成了多对多的映射关系

public class Student implements Serializable {

	private static final long serialVersionUID = 1L;
private Long sid;
private String name;
private Set<Course> courses = new HashSet<Course>(); }
public class Course implements Serializable {

	private static final long serialVersionUID = 1L;
private Long cid;
private String name;
private Set<Student> students = new HashSet<Student>();
}

*hbm.xml

<class name="Student" table="STUDENT">
<id name="sid">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="courses" table="student_courses" inverse="false" cascade="save-update">
<key column="sid"></key>
<many-to-many class="Course" column="cid"></many-to-many>
</set>
<!-- 两个id的书写,要记牢 -->
</class>
<class name="Course" table="COURSE">
<id name="cid">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- table第三张表的名字:不写会会默认生成,可能会出现两张第三张表 -->
<set name="students" table="student_courses">
<!--
外键
-->
<key column="cid"></key>
<!--
column:外键
-->
<many-to-many class="Student" column="sid"></many-to-many>
</set>
</class>

測试类:

public class many2manyTest {

	private Session session;
private Transaction transaction; @Before
public void init(){
session = HibernateUtils.openSession();
transaction = session.beginTransaction();
} /**
* 学生 级联操作
* 保存的学生的时候,级联保存课程
*/
@Test
public void testSaveStudent_cascade_SaveCourse(){ Student student = new Student();
student.setName("A");
Course course = new Course();
course.setName("a"); Set<Course> courses = new HashSet<Course>();
Set<Student> students = new HashSet<Student>(); courses.add(course);
student.setCourses(courses);
students.add(student);
session.save(student);
//session.save(course);
} /**
* 已经存在一个学生,一个课程,关联两者关系
*/
@Test
public void testBuildRelationship(){ Student student = (Student) session.get(Student.class, 2L);
Course course = (Course) session.get(Course.class, 2L);
//System.out.println(student.getCourses().size()); //0,说明即使学生没有课程,Set<Course> hibernate来帮我们创建,前提是Student类是持久化的
//建议类中定义Set<>时,直接new 出 hashSet
/**
* student.getCourses().add(course);
course.getStudents().add(student); //报错,仅仅能有一个来进行加入操作,
//从 学生来建立关系 或 从课程来建立关系 都能够
*/
student.getCourses().add(course);
} /**
* 已经有一个课程,新建一个学生,建立关系
*/
@Test
public void testSaveStudent_BuildR(){
Course course = (Course) session.get(Course.class, 2L);
Student student = new Student();
student.setName("BB");
//student.getCourses().add(course);//假设不定义Set<> = new HashSet<>,会空指针异常,3条sql
/* Set<Course> courses = new HashSet<Course>();
courses.add(course);
student.setCourses(courses);3条sql*/ // course.getStudents().add(student);//4条sql student.getCourses().add(course);
/**
* hibernate程序,效率与写法有非常大关系
*/
session.save(student);
} /**
* 一个学生从一门课程,转学 还有一门课程
* sid为5的学生从课程2转到课程1
*/
@Test
public void testTransform(){
Student student = (Student) session.get(Student.class,5L);
Course course = (Course) session.get(Course.class, 1L);
Course course2 = (Course) session.get(Course.class, 2L);
student.getCourses().remove(course2);//解除学生和cid为2的课程
student.getCourses().add(course);//6条sql,jdbc仅仅需update,这就是hibernate的坑爹之处
} /**
* 解除一个学生和该学生所学的全部的课程之间的关系
*/
@Test
public void testRealseAllR(){
/**
* 解除sid为1的学生和全部的课程之间的关系
*/
Student student = (Student)session.get(Student.class, 1L);
student.setCourses(null);
transaction.commit();
session.close();
} /**
* 解除一个学生和全部的课程之间的关系。再建立一些课程之间的关系
*/
@Test
public void testRealseAllRAndBuildR(){
Student student = (Student)session.get(Student.class, 1L); /**
* 由于 再建立一些课程之间的关系,所以用Set,千万不要一个一个add
*/
Set<Course> courses = new HashSet<Course>();
Course course = (Course)session.get(Course.class, 3L);
courses.add(course);
//把原来的student中的courses给覆盖掉了
student.setCourses(courses);
} @After
public void destory(){
transaction.commit();
session.close();
}
}

而一对一关系映射。一般不写one-to-one,是把one-to-many,many的一方加入unique="true"

Hibernate学习笔记(五) — 多对多关系映射的更多相关文章

  1. HIbernate学习笔记(六) 关系映射之多对多

    六.多对多 - 单向 Ø        一般的设计中,多对多关联映射,需要一个中间表 Ø        Hibernate会自动生成中间表 Ø        Hibernate使用many-to-ma ...

  2. Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)

    如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...

  3. Hibernate学习笔记(四)关系映射之一对一关联映射

    一. 一对一关联映射 ²        两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²        有两种策略可以实现一对一的关联映射 Ø        主键关联:即让 ...

  4. hibernate学习(设计多对多 关系 映射)

    // package org.crazy.app.domain; import java.util.HashSet; import java.util.Set; import javax.persis ...

  5. Hibernate框架之双向多对多关系映射

    昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...

  6. 深入浅出Hibernate(二)多对一关系映射

    学习Hibernate是为了更方便的操作数据库,在数据库中的关系模型中存在多对一的关系,比方下图所看到的的员工和部门之间的关系,那么这样的关系在Hibernate中怎样映射呢?让我用一个小Demo来具 ...

  7. Hibernate学习笔记五:反向工程快速开发

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6768513.html  一:反向工程 Myeclipse提供由 数据库表 生成 java pojo 和 hib ...

  8. hibernate学习(设计一对多 关系 映射)

    1,配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-conf ...

  9. Mybatis学习笔记(五) —— Mapper.xml(输入映射和输出映射)

    一.parameterType(输入类型) 1.1 传递简单类型 <!-- 根据用户id查询用户 --> <select id="queryUserById" p ...

随机推荐

  1. tamper-proof 对象 nonextensible对象 sealed对象 frozen对象

    tamper-proof 对象JavaScript的缺点之一就是每个对象都可以被相同执行上下文的代码修改,很容易导致意外覆盖,或则一不小心把native 对象覆盖.Ecmascript  5提供了 t ...

  2. 京东首页原生----js制作|css动画|js动画|计时器--轮播图(好久没更新,这两天闲的蛋疼做个京东页面分辨率1366*768,919京东,适应没调!)要文件加关注找我要哦!

  3. phpstorm php $post数据为空的原因

    今天拿PHPstoem 写了个PHP的表单插入数据,然后直接在里面一运行,就一直提示什么未定义,其实是因为$_PSOT[] 取不到值. 后面发现原来是直接用phpstorm 运行PHP的话,他会自带端 ...

  4. Task及Mvc的异步控制器 使用探索

    微软的Task已经出来很久了,一直没有去研究,以为就是和Thread差不多的东西.直到最近看到了Task的使用介绍,发现比Thread的语法要精炼多了,于是便在项目中用上了. 结果就出问题了,数据库连 ...

  5. Python模糊查询本地文件夹去除文件后缀(7行代码)

    Python模糊查询本地文件夹去除文件后缀 import os,re def fuzzy_search(path): word= input('请输入要查询的内容:') for filename in ...

  6. Linux学习(十九)软件安装与卸载(二)更换yum源

    一.简介 系统自带的源数量有限,而且是国外的源,速度肯定不如国内的.而断网的时候,本地源就可以派得上用处.而RPMForge源是传说中规模最大的一个源.那么接下来我们就来分别配一下本地源,国内源,RP ...

  7. How to Quickly Create a Copy of a Table using Transact-SQL

    The easiest way to create a copy of a table is to use a Transact-SQL command. Use SELECT INTO to ext ...

  8. linux 更新源miss问题

    1.之前新装的linuxMint 执行 apt-get install vim 安装失败 发现原因是源更新失败导致,后来执行apt-get update 发现老是获取失败,查了google总结出以下解 ...

  9. meta 是什么??

    META http-equiv 大全HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容.常用的HTTP-EQUIV类型有: 1.Content- ...

  10. TF30042: The database is full. Contact your Team Foundation Server administrator.

    TF30042: The database is full. Contact your Team Foundation Server administrator. 在一个阳光明媚的下午,迁入代码的时候 ...