多对多关系映射

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

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

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

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

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

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

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. [译]移动API安全终极指南

    文章主要讲了移动api调用的授权和验证问题,原文链接:The Ultimate Guide to Mobile API Security 移动API的使用是Stack Overflow和 Stormp ...

  2. 【持续更新】JavaScript常见面试题整理

    [重点提前说]这篇博客里的问题涉及到了了JS中常见的的基础知识点,也是面试中常见的一些问题,建议初入职场的园友Mark收藏,本文会持续更新~ 1. 引入JS的三种方式 1.在HTML标签中直接使用,直 ...

  3. Maven快速使用阿里云的代理maven仓库

    自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从此不在浪费生命…… 仓库地址: ...

  4. Kotlin(二) 函数定义

    1.不带参数,不返回值的函数 fun sum(){} 2.带参数,不带返回值的函数 fun sum(a:Int){} 3.带参数,带返回值的函数 fun sum(a:Int,b:Int) : Int{ ...

  5. [转载] Thrift原理简析(JAVA)

    转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...

  6. pandas基本介绍-【老鱼学pandas】

    前面我们学习了numpy,现在我们来学习一下pandas. Python Data Analysis Library 或 pandas 主要用于处理类似excel一样的数据格式,其中有表头.数据序列号 ...

  7. 八、VueJs 填坑日记之参数传递及内容页面的开发

    我们在上一篇博文中,渲染出来了一个列表,并在列表中使用了router-link标签,标签内的:to就是链接地址,昨天咱们是<router-link :to="'/content/' + ...

  8. 手写particles

    var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); var Grewer = { in ...

  9. Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...

  10. CSS常见布局解决方案

    最近要准备移动端项目,大半年没好好写过CSS了,今天恶补了一下CSS的一些布局,下面做一些分享. 水平居中布局 1.margin + 定宽 <div class="parent&quo ...