1、定义实体类,代码如下:

(1)、学生实体类:

  1. package learn.jpa.entity;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. import javax.persistence.CascadeType;
  7. import javax.persistence.Column;
  8. import javax.persistence.Entity;
  9. import javax.persistence.GeneratedValue;
  10. import javax.persistence.Id;
  11. import javax.persistence.JoinTable;
  12. import javax.persistence.ManyToMany;
  13. import javax.persistence.JoinColumn;
  14.  
  15. /**
  16. * @doc 多对多关系是对等的,认为决定谁是维护段,谁是被维护段
  17. * 通过中间表(中间表)来关联它们之间的关系
  18. */
  19. @Entity
  20. public class Student {
  21.  
  22. private int id;
  23. private String name;
  24. private Set<Teacher> teacher = new HashSet<Teacher>();
  25.  
  26. public Student() {
  27. super();
  28. }
  29.  
  30. public Student(String name) {
  31. this.name = name;
  32. }
  33.  
  34. @Id
  35. @GeneratedValue
  36. public int getId() {
  37. return id;
  38. }
  39. public void setId(int id) {
  40. this.id = id;
  41. }
  42. @Column(length=10,nullable=false)
  43. public String getName() {
  44. return name;
  45. }
  46. public void setName(String name) {
  47. this.name = name;
  48. }
  49. /**
  50. * inverseJoinColumns 与被维护端关联外键
  51. * joinColumns 与维护段关联外键
  52. */
  53. @ManyToMany(cascade=CascadeType.REFRESH)
  54. @JoinTable(name="student_teacher",inverseJoinColumns=@JoinColumn(name="teacher_id"),joinColumns=@JoinColumn(name="student_id"))
  55. public Set<Teacher> getTeacher() {
  56. return teacher;
  57. }
  58. public void setTeacher(Set<Teacher> teacher) {
  59. this.teacher = teacher;
  60. }
  61.  
  62. // 建立老师和学生的关系
  63. public void addTeacher(Teacher teachers){
  64. this.teacher.add(teachers);
  65. }
  66.  
  67. // 解除老师和学生的关系
  68. // 删除 teacher 是根据 id来删除的,所有在 Teacher 类中要重写 equals() 和 hashCode()
  69. public void removeTeacher(Teacher teachers){
  70. if(this.teacher.contains(teachers)){
  71. this.teacher.remove(teachers);
  72. }
  73. }
  74. }

(2)、老师实体类:

  1. package learn.jpa.entity;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. import javax.persistence.CascadeType;
  7. import javax.persistence.Column;
  8. import javax.persistence.Entity;
  9. import javax.persistence.GeneratedValue;
  10. import javax.persistence.Id;
  11. import javax.persistence.ManyToMany;
  12.  
  13. @Entity
  14. public class Teacher {
  15.  
  16. private int id;
  17. private String name;
  18. private Set<Student> student = new HashSet<Student>();
  19.  
  20. // 如果声明了有参数的构造函数,那么一定要声明无参构造函数
  21. public Teacher(){}
  22.  
  23. public Teacher(String name){
  24. this.name = name;
  25. }
  26.  
  27. @Id
  28. @GeneratedValue
  29. public int getId() {
  30. return id;
  31. }
  32. public void setId(int id) {
  33. this.id = id;
  34. }
  35. @Column(length=10,nullable=false)
  36. public String getName() {
  37. return name;
  38. }
  39. public void setName(String name) {
  40. this.name = name;
  41. }
  42. @ManyToMany(cascade=CascadeType.REFRESH,mappedBy="teacher")
  43. public Set<Student> getStudent() {
  44. return student;
  45. }
  46. public void setStudent(Set<Student> student) {
  47. this.student = student;
  48. }
  49.  
  50. @Override
  51. public int hashCode() {
  52. final int prime = 31;
  53. int result = 1;
  54. result = prime * result + id;
  55. return result;
  56. }
  57.  
  58. @Override
  59. public boolean equals(Object obj) {
  60. if (this == obj)
  61. return true;
  62. if (obj == null)
  63. return false;
  64. if (getClass() != obj.getClass())
  65. return false;
  66. Teacher other = (Teacher) obj;
  67. if (id != other.id)
  68. return false;
  69. return true;
  70. }
  71.  
  72. }

2、相关操作类,代码如下:

  1. package learn.jpa.test;
  2.  
  3. import static org.junit.Assert.*;
  4.  
  5. import javax.persistence.EntityManager;
  6. import javax.persistence.EntityManagerFactory;
  7. import javax.persistence.Persistence;
  8.  
  9. import learn.jpa.entity.Student;
  10. import learn.jpa.entity.Teacher;
  11.  
  12. import org.junit.Test;
  13.  
  14. public class ManyToManyTest {
  15.  
  16. /**
  17. * 测试数据库是否可以生成表
  18. */
  19. @Test
  20. public void test() {
  21. EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
  22. factory.close();
  23. }
  24.  
  25. @Test
  26. public void save(){
  27. EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
  28. EntityManager em = factory.createEntityManager();
  29. em.getTransaction().begin(); // 开启事务
  30. em.persist(new Student("xx"));
  31. em.persist(new Teacher("xiuliu"));
  32. em.getTransaction().commit();
  33. em.close();
  34. factory.close();
  35. }
  36.  
  37. /**
  38. * 建立老师和学生的关系(将关联的字段数据保存到中间表中)
  39. */
  40. @Test
  41. public void buildTS(){
  42. EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
  43. EntityManager em = factory.createEntityManager();
  44. em.getTransaction().begin(); // 开启事务
  45. // 处于托管状态,可以对数据进行更新
  46. Student student = em.find(Student.class, 1);
  47. student.addTeacher(em.getReference(Teacher.class, 1));
  48. em.getTransaction().commit();
  49. em.close();
  50. factory.close();
  51. }
  52.  
  53. // 解除老师和学生的关系
  54. @Test
  55. public void deleteTS(){
  56. EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
  57. EntityManager em = factory.createEntityManager();
  58. em.getTransaction().begin(); // 开启事务
  59. // 处于托管状态,可以对数据进行更新
  60. Student student = em.find(Student.class, 1);
  61. student.removeTeacher(em.getReference(Teacher.class, 1));
  62. em.getTransaction().commit();
  63. em.close();
  64. factory.close();
  65. }
  66.  
  67. // 删除老师
  68. @Test
  69. public void deleteTeacher(){
  70. EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
  71. EntityManager em = factory.createEntityManager();
  72. em.getTransaction().begin(); // 开启事务
  73. // 处于托管状态,可以对数据进行更新
  74. // 先解除老师和学生的关系,在删除老师
  75. Student student = em.find(Student.class, 1);
  76. Teacher teacher = em.getReference(Teacher.class, 1);
  77. student.removeTeacher(teacher);
  78. em.remove(teacher);
  79. em.getTransaction().commit();
  80. em.close();
  81. factory.close();
  82. }
  83.  
  84. // 删除学生
  85. @Test
  86. public void deleteStudent(){
  87. EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
  88. EntityManager em = factory.createEntityManager();
  89. em.getTransaction().begin(); // 开启事务
  90. Student student = em.getReference(Student.class, 1);
  91. em.remove(student);
  92. em.getTransaction().commit();
  93. em.close();
  94. factory.close();
  95. }
  96. }

JPA学习---第十一节:JPA中的多对多双向关联实体定义与注解设置及操作的更多相关文章

  1. JPA中的一对多双向关联与级联操作

    学习Spring有两周时间了 , 个人觉得服务端主要实现的是数据关系的维护和数据结构的制定 , 以及由业务需求产生的CRUD , 只要保证对前端提供的接口稳定高效响应 , 具体的前端实现完全不关心. ...

  2. 风炫安全WEB安全学习第二十一节课 存储型XSS讲解

    风炫安全WEB安全学习第二十一节课 存储型XSS讲解 存储型XSS演示 存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存 ...

  3. Hibernate从入门到精通(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...

  4. Hibernate(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我 们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看 ...

  5. [置顶] Hibernate从入门到精通(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...

  6. Mybatis中使用collection进行多对多双向关联示例(含XML版与注解版)

    Mybatis中使用collection进行多对多双向关联示例(含XML版与注解版) XML版本: 实体类: @Data @NoArgsConstructor public class Course ...

  7. JPA学习---第九节:JPA中的一对多双向关联与级联操作

    一.一对多双向关联与级联操作 1.创建项目,配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> < ...

  8. JPA学习---第十节:JPA中的一对一双向关联

    1.创建实体类,代码如下: 代码清单1: package learn.jpa.entity; import javax.persistence.CascadeType; import javax.pe ...

  9. JPA学习---第五节:日期和枚举等字段类型的JPA映射

    1.在上一节可在数据库中看到创建出来的表和字段,是通过 Entity bean 来创建的,而创建表名和字段名的规则是怎样的? 有类,代码如下: package learn.jpa.bean; impo ...

随机推荐

  1. 打造一个自动检测页面是否存在XSS的小插件

    前言: 还记得刚玩Web安全时,就想着要是能有一个自动挖掘XSS漏洞的软件就好了.然后我发现了Safe3.JSky.AWVS.Netsparker等等,但是误报太多,而且特别占内存.后来发现了fidd ...

  2. js控制div颜色

    <html><head></head><style>#div1{width:400px;height:400px;background-color:re ...

  3. jquery 读取xml

    <script type="text/javascript" src="jquery/jquery-1.11.3.min.js"></scri ...

  4. Winform登录、控制软件只运行一次、回车登录

    Winform登录对很多程序猿来说都有些困惑,登录进入主窗体后要销毁登录窗体,而不是隐藏哦,怎么实现呢? 先贴一段Program.cs的代码 static void Main() { Mutex mu ...

  5. LevelDb系列之简介

    说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat.这两位是Google公司重量 ...

  6. IoC~高效的Autofac

    http://www.cnblogs.com/lori/archive/2012/09/05/2671724.html http://www.cnblogs.com/kissdodog/p/36114 ...

  7. 9.css背景

    这节也是关于盒模型的扩展,而我个人喜欢把盒模型想象成图画.元素的尺寸调整就是画布大小的调整,边框的设置就是画框的镶嵌.但是,作为一个最终要将画作展现到美术馆(网页)的艺术家来说,仅仅是这样还是不够的, ...

  8. Python学习教程(learning Python)--1.2.1 Python输出语句print基本使用

    Python提供很多的内建(built-in)函数,使用者可以不用自己写代码就可以完成一个功能很强大的程序, 在Python里使用最多的(也许是)print函数主要用于用户输出信息. 基本用法:pri ...

  9. Python判断是否是数字(无法判断浮点数)(已解决)

    s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() ...

  10. angularjs2 学习笔记(一) 开发环境搭建

    开发环境,vs2013 update 5,win7 x64,目前最新angular2版本为beta 17 第一步:安装node.js 安装node.js(https://nodejs.org/en/) ...