多对多关系映射

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

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

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

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

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

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

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. linux-mkdir

    mkdir mkdir : 可以用来创建目录,如果不加创建路径即在本路径下创建一个新的指定的目录,否则即在给出的路径下创建目录. 目录创建:目录名尽量见名知意,根据不同需要分层创建,尽量避免在同一目录 ...

  2. Scanner扫描器

    扫描器 : Scanner 接收用户在键盘上的输入内容 是Java自带的一个工具,但是默认情况下没有在我们写的程序中使用三个步骤:1. 导入扫描器 : 导入类文件      import java.u ...

  3. DevExpress.XtraEditors.TextEdit 设为密码输入框

    DevExpress.XtraEditors.TextEdit 设为密码输入框,解决办法: 设计窗口-->属性Properties-->Mask节点-->PasswordChar输入 ...

  4. 表字符集latin1,client如何查看中文字符

    表结构如下: . row *************************** Table: my_data_7e Create Table: CREATE TABLE `my_data_7e` ( ...

  5. react 体验 react与vue的比较

    用了 vue 大半年了,不过我在2016年暑假的时候就看到了 react 这个项目,有点想学习一番,之前学习的都是基础语法和一些基础用法吧,总的来说 mvvm 框架确实都很相似,会一个就可以了; 今天 ...

  6. 【Win 10 应用开发】UI Composition 札记(八):用 XamlLight 制作灯光效果

    前面老周已介绍过灯光的使用,如果你忘了,请用九牛二虎之力猛点击这里去复习一下.本篇老周再介绍另一种添加灯光的方法,这种方法是专为 XAML 元素而设计的,可以很方便地为可视化元素添加灯光效果. 不知道 ...

  7. input取值区间实例

    前端开发中经常会遇到 input 取值区间的需求,比如搜索的时候,价格区间,积分值区间 大致的需求为 input 的值必须是正整数,第二个 input 的值必须大于第一个 DOM结构如下: <d ...

  8. CS窗体程序数据列表分页

    以前,觉得winform程序分页很无趣,也没实际意义,直到近期的项目实践中让我认识到原来winform数据列表分页也是非常有必要的,因为由于数据量过大的情况,当窗体在初始加载数据的时候如果不做条件的限 ...

  9. 读Kafka Consumer源码

    最近一直在关注阿里的一个开源项目:OpenMessaging OpenMessaging, which includes the establishment of industry guideline ...

  10. 项目实战5—企业级缓存系统varnish应用与实战

    企业级缓存系统varnish应用与实战 环境背景:随着公司业务快速发展,公司的电子商务平台已经聚集了很多的忠实粉丝,公司也拿到了投资,这时老板想通过一场类似双十一的活动,进行一场大的促销,届时会有非常 ...