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

关系维护端:

 package com.yl.demo1.bean.manyTomany;

 import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany; @Entity
public class Student {
private Integer id;
private String name;
private Set<Teacher> teachers = new HashSet<Teacher>(); public Student(){} public Student(String name) {
super();
this.name = name;
}
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=10, nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* Student是关系的维护端
* inverseJoinColumns和joinColumns是定义关联表中的字段,其中inverseJoinColumns定义关系被维护端的字段
* joinColumns定义关系维护端的字段
*/
@ManyToMany(cascade=CascadeType.REFRESH)
@JoinTable(name="student_teacher", inverseJoinColumns=@JoinColumn(name="teacher_id"),
joinColumns=@JoinColumn(name="student_id"))
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
} public void addTeacher(Teacher teacher) {
this.teachers.add(teacher);
} public void removeTeacher(Teacher teacher) {
if (this.teachers.contains(teacher)) {
this.teachers.remove(teacher);
}
}
}

关系被维护端:

 package com.yl.demo1.bean.manyTomany;

 import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany; @Entity
public class Teacher {
private Integer id;
private String name;
private Set<Student> students = new HashSet<Student>(); public Teacher(){} public Teacher(String name) {
super();
this.name = name;
}
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=10, nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//teacher为关系的被维护端
@ManyToMany(cascade=CascadeType.REFRESH, mappedBy="teachers", fetch=FetchType.LAZY)
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Teacher other = (Teacher) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
} }

常见操作:

 @Test
public void save() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = new Student("yyyy");
em.persist(student); Teacher teacher = new Teacher("jiawenhui");
em.persist(teacher); em.getTransaction().commit();
em.close();
factory.close();
} /**
* 建立学生与老师之间的关系
*/
@Test
public void buildConnection() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = em.find(Student.class, 1); Teacher teacher = em.getReference(Teacher.class, 1); student.addTeacher(teacher); em.getTransaction().commit();
em.close();
factory.close();
} /**
* 解除学生与老师之间的关系
*/
@Test
public void deleteConnection() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = em.find(Student.class, 1); Teacher teacher = em.getReference(Teacher.class, 1); student.removeTeacher(teacher); em.getTransaction().commit();
em.close();
factory.close();
} /**
* 删除老师(删除关系被维护端)
*/
@Test
public void deleteTeacher() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = em.find(Student.class, 1);
Teacher teacher = em.getReference(Teacher.class, 1);
//先解除Student和Teacher之间的关系
student.removeTeacher(teacher);
//在删除Teacher
em.remove(teacher); em.getTransaction().commit();
em.close();
factory.close();
} /**
* 删除学生(删除关系维护端)
*/
@Test
public void deleteStudent() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始 Student student = em.getReference(Student.class, 1);
em.remove(student); em.getTransaction().commit();
em.close();
factory.close();
}

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

  1. jpa 多对多关系的实现注解形式

    1, 表结构 1)设备表 VTM_DEVICE_INFO create table VTM_DEVICE_INFO ( ID INTEGER not null, SN ) not null, STAT ...

  2. JPA多对多关联

    关于JPA多对多关系,这是使用学生与教师来表示.一个Student由多个Teacher教,同样一个Teacher也可以教多个学生.Student类如下: package com.yichun.bean ...

  3. JPA一对多和多对一关系

    1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录. 维护端注解 @OneToMany(cascade = { CascadeType.PERSIST, Ca ...

  4. [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

  5. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  6. JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明

    JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...

  7. Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

  8. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  9. spring boot - 整合jpa多对对关系保存和查询示例

    pojo: package com.example.zs.springDataJpa; import org.hibernate.annotations.Proxy; import javax.per ...

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

    JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...

随机推荐

  1. Sqoop 1.99.4 安装

    1.安装准备工作:已经装好的 hadoop 环境是 hadoop-2.5.1 64位下载的sqoop安装包(注意是hadoop200)http://www.us.apache.org/dist/sqo ...

  2. 子查询优化成join关联查询时要注意一对多关系

    mysql> select * from t where t.id in (select t1.tid from t1); +------+ | id | +------+ | +------+ ...

  3. Qt库的静态编译

    一.准备软件1. MinGW     (C:\Qt\MinGW)http://pan.baidu.com/share/link?shareid=174269&uk=673227135这个文件解 ...

  4. 轻仿QQ音乐之音频歌词播放、锁屏歌词-b

    先上效果图 歌词播放界面 音乐播放界面 锁屏歌词界面 一. 项目概述 前面内容实在是太基础..只想看知识点的同学可以直接跳到第三部分的干货 项目播放的mp3文件及lrc文件均来自QQ音乐 本文主要主要 ...

  5. embed标签遮住div层

    依然是上次的那个返工友情项目,当时帮忙用jquery ui写了一个漂浮的投票箱,就是类似点击一个项目然后就收藏到了投票箱中的效果.. 虽然不是很复杂,但是由于页面上有大面积的由kindeditor上传 ...

  6. 解决MS Azure 不能ping的问题

    PsPing v2.01 PsPing implements Ping functionality, TCP ping, latency and bandwidth measurement. Use ...

  7. spoj 346

    当一个数大于等于12  那分别处以2, 3, 4之后的和一定大于本身    但是直接递归会超时    然后发现有人用map存了   膜拜..... #include <cstdio> #i ...

  8. 抽象工厂模式(python版)

    http://blog.csdn.net/ponder008/article/details/6886039 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.优点:易 ...

  9. jmeter 一个可能引起性能严重下降的断言设置

    在添加断言时一定要注意: 1. 红框部分选择 "响应文本", 2.  要断言的内容越短越好

  10. 13. 求链表倒数第k个节点

    题目:输入1个链表,输出该链表倒数第k个节点,有头指针和尾指针.链表倒数第0个节点是链表的尾指针节点. 代码: /* 尾指针是倒数第0个,则倒数第k个是正数第len-k个,计算len */ #incl ...