JPA--多对多关系

JPA中,多对多关系用@ManyToMany标示。

关系维护端:

 1 package com.yl.demo1.bean.manyTomany;
 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.JoinColumn;
12 import javax.persistence.JoinTable;
13 import javax.persistence.ManyToMany;
14
15 @Entity
16 public class Student {
17     private Integer id;
18     private String name;
19     private Set<Teacher> teachers = new HashSet<Teacher>();
20
21
22     public Student(){}
23
24     public Student(String name) {
25         super();
26         this.name = name;
27     }
28     @Id @GeneratedValue
29     public Integer getId() {
30         return id;
31     }
32     public void setId(Integer 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     /**
43      * Student是关系的维护端
44      * inverseJoinColumns和joinColumns是定义关联表中的字段,其中inverseJoinColumns定义关系被维护端的字段
45      * joinColumns定义关系维护端的字段
46      */
47     @ManyToMany(cascade=CascadeType.REFRESH)
48     @JoinTable(name="student_teacher", [email protected](name="teacher_id"),
49     [email protected](name="student_id"))
50     public Set<Teacher> getTeachers() {
51         return teachers;
52     }
53     public void setTeachers(Set<Teacher> teachers) {
54         this.teachers = teachers;
55     }
56
57     public void addTeacher(Teacher teacher) {
58         this.teachers.add(teacher);
59     }
60
61     public void removeTeacher(Teacher teacher) {
62         if (this.teachers.contains(teacher)) {
63             this.teachers.remove(teacher);
64         }
65     }
66 }

关系被维护端:

 1 package com.yl.demo1.bean.manyTomany;
 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.FetchType;
10 import javax.persistence.GeneratedValue;
11 import javax.persistence.Id;
12 import javax.persistence.ManyToMany;
13
14 @Entity
15 public class Teacher {
16     private Integer id;
17     private String name;
18     private Set<Student> students = new HashSet<Student>();
19
20     public Teacher(){}
21
22     public Teacher(String name) {
23         super();
24         this.name = name;
25     }
26     @Id @GeneratedValue
27     public Integer getId() {
28         return id;
29     }
30     public void setId(Integer id) {
31         this.id = id;
32     }
33     @Column(length=10, nullable=false)
34     public String getName() {
35         return name;
36     }
37     public void setName(String name) {
38         this.name = name;
39     }
40     //teacher为关系的被维护端
41     @ManyToMany(cascade=CascadeType.REFRESH, mappedBy="teachers", fetch=FetchType.LAZY)
42     public Set<Student> getStudents() {
43         return students;
44     }
45     public void setStudents(Set<Student> students) {
46         this.students = students;
47     }
48
49     @Override
50     public int hashCode() {
51         final int prime = 31;
52         int result = 1;
53         result = prime * result + ((id == null) ? 0 : id.hashCode());
54         return result;
55     }
56
57     @Override
58     public boolean equals(Object obj) {
59         if (this == obj)
60             return true;
61         if (obj == null)
62             return false;
63         if (getClass() != obj.getClass())
64             return false;
65         Teacher other = (Teacher) obj;
66         if (id == null) {
67             if (other.id != null)
68                 return false;
69         } else if (!id.equals(other.id))
70             return false;
71         return true;
72     }
73
74
75
76
77 }

常见操作:

 1 @Test
 2     public void save() {
 3         EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
 4         EntityManager em = factory.createEntityManager();
 5         em.getTransaction().begin();//事务开始
 6
 7         Student student = new Student("yyyy");
 8         em.persist(student);
 9
10         Teacher teacher = new Teacher("jiawenhui");
11         em.persist(teacher);
12
13         em.getTransaction().commit();
14         em.close();
15         factory.close();
16     }
17
18     /**
19      * 建立学生与老师之间的关系
20      */
21     @Test
22     public void buildConnection() {
23         EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
24         EntityManager em = factory.createEntityManager();
25         em.getTransaction().begin();//事务开始
26
27         Student student = em.find(Student.class, 1);
28
29         Teacher teacher = em.getReference(Teacher.class, 1);
30
31         student.addTeacher(teacher);
32
33         em.getTransaction().commit();
34         em.close();
35         factory.close();
36     }
37
38     /**
39      * 解除学生与老师之间的关系
40      */
41     @Test
42     public void deleteConnection() {
43         EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
44         EntityManager em = factory.createEntityManager();
45         em.getTransaction().begin();//事务开始
46
47         Student student = em.find(Student.class, 1);
48
49         Teacher teacher = em.getReference(Teacher.class, 1);
50
51         student.removeTeacher(teacher);
52
53         em.getTransaction().commit();
54         em.close();
55         factory.close();
56     }
57
58     /**
59      * 删除老师(删除关系被维护端)
60      */
61     @Test
62     public void deleteTeacher() {
63         EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
64         EntityManager em = factory.createEntityManager();
65         em.getTransaction().begin();//事务开始
66
67         Student student = em.find(Student.class, 1);
68         Teacher teacher = em.getReference(Teacher.class, 1);
69         //先解除Student和Teacher之间的关系
70         student.removeTeacher(teacher);
71         //在删除Teacher
72         em.remove(teacher);
73
74         em.getTransaction().commit();
75         em.close();
76         factory.close();
77     }
78
79     /**
80      * 删除学生(删除关系维护端)
81      */
82     @Test
83     public void deleteStudent() {
84         EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
85         EntityManager em = factory.createEntityManager();
86         em.getTransaction().begin();//事务开始
87
88         Student student = em.getReference(Student.class, 1);
89         em.remove(student);
90
91         em.getTransaction().commit();
92         em.close();
93         factory.close();
94     }
95     
时间: 2024-10-07 21:50:27

JPA--多对多关系的相关文章

JPA一对多和多对一关系

1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录. 维护端注解 Java代码   @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER, mappedBy = "order") 被维护端注解 Java代码   @ManyToOne(casc

jpa双向多对多关系

多对多关系相比其他其中关联关系,显得稍微复杂了一点点,这个复杂度主要体现在对这种关联关系的理解上.和其他关联关系不同的是这种关联多出来了一张中间表,操作上多了些许复杂,来随便看下吧 1  实体的定义 Student表: package org.lxh.info; import java.util.*; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.En

JPA总结——实体关系映射(一对多@OneToMany)

JPA总结——实体关系映射(一对多@OneToMany) 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html 一对多模型(单向)说明:一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息.客户和地址是一对多的关系,并且客户与地址是单向关联的关系. 映射策略# 外键关联:两个表的关系定义在一个表中:# 表关联:两个表的关系单独定义一个表中通过一个中间表来关联.映射策略——外键关联 表结构如下: 1 TABLE custom

Laravel5.1 模型 --多对多关系

多对多关系也是很常用的一种关系,比如一篇文章可以有多个标签,一个标签下也可以有多篇文章,这就是一个典型的多对多的关系. 1 实现多对多关系 多对多关系我们需要三张表,一张是文章另一张是标签,第三章表是它们的中间表 因为多对多关系需要抽离成两个一对多关系嘛. 1.1 文章结构 public function up() { Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片:多对多关系(上)

这章介绍了怎样创建一个新的实体来管理图片,怎样使用HTML窗体来上传图片文件和使用多对多关系来使它们与产品相关,并且怎样来保存图片到文件系统中.这章也介绍了更多复杂的错误处理增加客户端错误到模型中为了把它们显示回给用户.在这章中播种数据库使用的产品图片可能在在第六章的从Apress网页站点下载代码中. 注意:如果你想遵从这章的代码,你必须完成第五章的代码或者从www.apress.com下载第五章的源代码作为一个起点. 创建实体保存图片文件名 这个项目,我们正要使用文件系统在Web项目中存储图片

MySql多对多关系中外键的应用

业务需求:用户表r_user保存用户名等信息.现需要给每个用户设置工作基地,一个用户可以有多个工作基地,多个用户也可以有一个工作基地,即多对多关系.(外键,若有两个表A,B,C是A的主键,而B中也有C字段,则C就是表B的外键,外键约束主要用来维护两个表之间数据的一致性) 设计方案: 方案一:建立一张用户基地表,与r_user与用户基地表,保持一对多的关系,如图所示,r_user的主键id做为r_user_base的外键user_id.通过r_user中的id,在r_user_base表中load

Castle.ActiveRecord 多对多关系 引发的错误处理

在Castle.ActiveRecord 实体类中,如果两个对象有 “多对多” 关系,一般的做法是将其分解为 两个“一对多”关系,但有时引发了 “您要删除 或 引用 的对象#2在数据库中不存在”的异常 百思不得其解,同样的用法在“媒体引用”中一直都是正常的,为什么在“专题引用” 和“ Web栏目引用” 中就出现异常呢? 通过遍历代码发现了细微的差别: 在“媒体”的业务对象加载时,为了判断一个对象是否可以删除,常查询其被引用的 次数是多少,使用的方法是:DALMediaReference.Find

在thinkphp中,写的博文标签多对多关系的标签频率统计算法

常常看到别人的博客里面,或者网站里面有这样随机颜色,但字体大小与标签出现频率有关的标签云,于是自己就想写一个.至于颜色的随机显示,那就很简单了,这里就不列代码. 因为正在学thinkphp,所以数据查找的都是用的tp数据查找语句. 1 Public function render( $data ){ 2 //在博文——标签多对多关系的中间表中查找出所有的标签 3 $tags = M('blog_tags')->select(); 4 $a = array(); 5 //去掉重复的标签,将所有不重

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

学习Hibernate是为了更方便的操作数据库,在数据库中的关系模型中存在多对一的关系,比如下图所示的员工和部门之间的关系,那么这种关系在Hibernate中如何映射呢?让我用一个小Demo来详细讲解. 建立映射分为以下几步: 1.设计domain对象Department.Employee,代码如下: package cn.itcast.hibernate.domain; public class Department { private int id; private String name;

Hibernate3 多对多关系

学习hibernate的笔迹第三篇,主要内容:多对多关系, 检索策略,HQL查询,QBC,事物管理,c3p0配置 1.1.1  Hibernate的关联关系映射:(多对多) 1.1.1.1     多对多的配置: 步骤一创建实体和映射: 1 Student: 2 3 public class Student { 4 5 private Integer sid; 6 7 private String sname; 8 9 // 学生选择多门课程. 10 11 private Set<Course>