@ManyToMany mappedby

article/2025/9/29 7:09:34

学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个学生。多对多映射采取中间表连接的映射策略,建立的中间表将分别引入两边的主键作为外键。jpa 对于中间表的元数据提供了可配置的方式,用户可以自定义中间表的表名,列名。

下面就以学生和老师为例介绍多对多映射关系的实例开发

 

Student实体类 

复制代码
  
package com.ljq.entity;import java.util.HashSet; import java.util.Set;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToMany;@SuppressWarnings("serial") @Entity public class Student implements java.io.Serializable {/** 学生ID **/private Integer studentid;/** 学生姓名 **/private String name;private Set<Teacher> teachers=new HashSet<Teacher>();public Student() {super();}public Student(String name) {super();this.name = name;}@Id@GeneratedValuepublic Integer getStudentid() {return studentid;}public void setStudentid(Integer studentid) {this.studentid = studentid;}@Column(nullable=false,length=32)public String getName() {return name;}public void setName(String name) {this.name = name;}//@ManyToMany注释表示Student是多对多关系的一边,mappedBy属性定义了Student为双向关系的维护端//Teacher表是关系的维护者,owner side,有主导权,它有个外键指向Student表。 @ManyToMany(mappedBy = "students")public Set<Teacher> getTeachers() {return teachers;}public void setTeachers(Set<Teacher> teachers) {this.teachers = teachers;}}
复制代码

Teacher实体类 

复制代码
  
package com.ljq.entity;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.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany;@SuppressWarnings("serial") @Entity public class Teacher implements java.io.Serializable {/** 教师ID **/private Integer teacherid;/** 教师姓名 **/private String name;private Set<Student> students=new HashSet<Student>();public Teacher() {super();}public Teacher(String name) {super();this.name = name;}@Id@GeneratedValuepublic Integer getTeacherid() {return teacherid;}public void setTeacherid(Integer teacherid) {this.teacherid = teacherid;}@Column(nullable=false,length=32)public String getName() {return name;}public void setName(String name) {this.name = name;}//@ManyToMany注释表示Teacher是多对多关系的一端。//@JoinTable描述了多对多关系的数据表关系。name属性指定中间表名称,joinColumns定义中间表与Teacher表的外键关系。//中间表Teacher_Student的Teacher_ID列是Teacher表的主键列对应的外键列,inverseJoinColumns属性定义了中间表与另外一端(Student)的外键关系。 @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)@JoinTable(name = "Teacher_Student", joinColumns = { @JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid") }, inverseJoinColumns = { @JoinColumn(name = "Student_ID", referencedColumnName = "studentid") })public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}/*** 添加学生* * @param student*/public void addStudent(Student student) {if (!this.students.contains(student)) {this.students.add(student);
student.setTeacher(this);}}/*** 删除学生* * @param student*/public void removeStudent(Student student) {if(this.students.contains(student)){
student.setTeacher(null);this.students.remove(student);}} }
复制代码

ManyToManyTest测试类 

复制代码
  
package com.ljq.test;import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence;import org.junit.Test;import com.ljq.entity.Student; import com.ljq.entity.Teacher;public class ManyToManyTest {@Testpublic void save() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em=factory.createEntityManager();em.getTransaction().begin();em.persist(new Teacher("张老师"));em.persist(new Student("小张"));em.getTransaction().commit();em.close();factory.close();}/*** 为老师添加一个学生**/@Testpublic void build() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em=factory.createEntityManager();em.getTransaction().begin();Teacher teacher = em.find(Teacher.class, 2);teacher.addStudent(em.getReference(Student.class, 2));em.getTransaction().commit();em.close();factory.close();}/*** 解除学生跟老师的关系**/@Testpublic void remove() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em=factory.createEntityManager();em.getTransaction().begin();Teacher teacher = em.find(Teacher.class, 2);teacher.removeStudent(em.getReference(Student.class, 2));em.getTransaction().commit();em.close();factory.close();}/*** 删除学生,因为学生不是关系维护者,所以需要先手工解除老师与学生的关联,然后再删除学生**/@Testpublic void deleteStudent() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em=factory.createEntityManager();em.getTransaction().begin();Teacher teacher = em.find(Teacher.class, 2);Student student = em.getReference(Student.class, 2);teacher.removeStudent(student); //手工解除老师与学生的关系 em.remove(student); //删除学生 em.getTransaction().commit();em.close();factory.close();}/*** 删除老师,因为老师是关系维护者,所以可以直接解除老师与学生的关系,不用我们手工解除**/@Testpublic void deleteTeacher() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");EntityManager em=factory.createEntityManager();em.getTransaction().begin();em.remove(em.getReference(Teacher.class, 3));em.getTransaction().commit();em.close();factory.close();}/*** 用来判断映射是否成功* */@Testpublic void test() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq");factory.close();}}

http://chatgpt.dhexx.cn/article/DmEnVOOQ.shtml

相关文章

MapDB简单用法

MapDB提供了Java映射、集、列表、队列和其他由非堆或磁盘存储支持的集合。它是java集合框架和嵌入式数据库引擎之间的混合。它是Apache许可下的免费和开放源码。 如果处理GB级数据&#xff0c;请考虑使用非缓存存储容器&#xff0c;比如本篇提到的MapDB&#xff0c;而不要把庞大…

BaseMapper

* 1.公共的方法进行抽取,抽取到BaseMapper接口中,将用户操作的方法对象,转化为数据库能够识别的SQL语句 * 2.通过userMapper查找父级接口BaseMapper * 3.根据BaseMapper查找泛型对象User对象 * 4.根据user对象查找指定的注解TableName,获取表明 * 5.根据user对象的属性,动态获取…

MappedBy

对于mappedBy复习下&#xff1a; a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性&#xff0c;ManyToOne不存在该属性&#xff1b; b) mappedBy标签一定是定义在the owned side(被拥有方的)&#xff0c;他指向the owning side(拥有方)&#xff1b; c) mappedBy的含义…

Data Mapper

使用 Data Mapper分离数据源的Model和页面现实的Model&#xff0c;不要因为数据源的增加、修改或者删除&#xff0c;导致上层页面也要跟着一起修改 interface Mapper<I,O> {fun map(input:I):O }data class CarEntity(var no:String) data class CarModel(var num:String…

全网最详细的postman接口测试教程,一篇文章满足你

目录 目录 1、前言 2、接口理论 3、接口实例 一、POST 二、GET 4、总结&#xff1a; 1、前言 之前还没实际做过接口测试的时候呢&#xff0c;对接口测试这个概念比较渺茫&#xff0c;只能靠百度&#xff0c;查看各种接口实例&#xff0c;然后在工作中也没用上&#xff0c;…

简单粗暴的PostMan使用说明文档让你一片文章看懂PostMan怎么使用

PostMan功能简单介绍 创建文件夹 点击Collections创建新的文件夹&#xff0c;可以将不同的接口存入不同的文件夹中 点击右边三个点可以进行设置&#xff0c;Rename是重新命名 点击Add request&#xff0c;会在右侧创建一个get请求方式的request。 点击Add Folder&#xff0…

postman基础使用教程

Postman教程大全 - 简书推荐一款接口测试工具&#xff01;POSTMAN&#xff01;简单来说&#xff0c;四个词&#xff0c;简单实用大方美观&#xff01; Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 Postman背景...https://www.jianshu.com/p/97ba64888894 …

不会接口测试?用Postman轻松入门(一)—— Postman实现get和post请求

测试行业现在越来越卷&#xff0c;不会点接口测试好像简历都已经拿不出手了&#xff0c;但很多小伙伴都会头疼&#xff1a;接口测试应该怎么入门&#xff1f;那么多的接口测试工具应该学哪个&#xff1f; 其实&#xff0c;接口测试工具&#xff0c;就像吃饭用的筷子&#xff0…

Postman快速入门(一)

一、基本介绍 postman是一款流程的接口调试工具&#xff0c;其特点就是使用简单&#xff0c;功能强大。使用角色也非常广泛&#xff0c;后端开发&#xff0c;前端人员&#xff0c;测试人员都可以使用它进行接口调试或测试。 下图是基本功能介绍 发送第一个请求 如果你是第一次…

Postman工具介绍以及使用方法教程(一)

Postman工具 1、postman简介 Postman最早是Google浏览器的一个插件存在的&#xff0c;因为Google退出国内市场&#xff0c;现在postman主要是以一个 APP的形式存在。 Postman最初设计上就是为接口测试而设计的&#xff0c;对于测试人员来说主要用来做接口测试。 2、postman的…

使用PostMan上传文件,有图易懂

现在&#xff0c;越来越多的人习惯用postman来测试接口。那么&#xff0c;关于如何使用postman来上传文件&#xff0c;本文进行讲解 1、将请求方式选择为post 2、填写接口地址 3、填写请求头 key&#xff1a;Content-Type value&#xff1a;multipart/form-data 4、填写Body…

postman-使用post请求

一. postman简介 Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果, 从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上…

Postman全网最详细使用教程

Postman全网最详细使用教程 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「postman」, 获取postman插件和安装程序&#xff1a; http://www.javaman.cn/jszw/postman 一、postman的安装 postman的安装分为两种&#xff0c;通过chrome浏览器插件安装…

Postman-APIs是干什么的?

最近用postman探索接口自动化&#xff0c;发现里面的APIs这个模块&#xff0c;很少用到&#xff0c;平常都是直接在Collections模块创建请求就完事了。但是想做自动化时&#xff0c;发现需要先把接口定义出来&#xff0c;基于接口创建用例&#xff0c;这样直接用Collections就显…

2022最新Postman安装以及基本操作使用教程

一、postman安装 Postman一款非常流行的API调试工具。其实&#xff0c;开发人员用的更多。因为测试人员做接口测试会有更多选择&#xff0c;例如Jmeter、soapUI等。不过&#xff0c;对于开发过程中去调试接口&#xff0c;Postman确实足够的简单方便&#xff0c;而且功能强大。…

接口测试之Postman使用全图文指南(原来使用Postman测试API接口如此简单)

为什么要做接口测试&#xff1f; 接口的由来&#xff1a; 连接前后端以及移动端。 因为不同端的工作进度不一样&#xff0c;所以需要对开始出来的接口进行接口测试。 做接口测试的好处&#xff1a; 1、节约时间&#xff0c;缩短项目成本 2、提高工作效率 3、提高系统的健壮性…

Postman使用小技巧 - 用Postman生成Request代码

Postman这款工具可以让你很方便的测试你的Web API&#xff0c;那如果你实在是没办法用Postman&#xff0c;必须手写代码&#xff0c;又或者你有别的需求是Postman没法实现的&#xff0c;你必须写一个特殊的script或App来测试你的接口&#xff0c;那这时候是不是Postman就没有用…

Postman工具的简单介绍

Postman工具简单介绍 前言一、侧边栏二、工具栏三、构建器四、控制台五、菜单栏六、状态栏七、选项卡和窗口八、键盘快捷键九、数据编辑器十、支持多行 前言 Postman提供了一种多窗口和多选项卡页面用于发送和接收接口请求&#xff08;如图&#xff09;Postman努力保持清洁和灵…

一文带你全面解析postman工具的使用(效率篇)

说明&#xff1a;由于前面的一文篇幅太大&#xff0c;导致无法放在一文发布&#xff0c;故这篇文章只是postman工具介绍的第二部分&#xff0c;若需要回看第一部分内容可通过如下链接&#xff1a;​​​​​​​一文带你全面解析postman工具的使用 。接下来介绍的内容是基于上文…

全面解析postman工具的使用

postman是一款支持http协议的接口调试与测试工具&#xff0c;其主要特点就是功能强大&#xff0c;使用简单且易用性好 。无论是开发人员进行接口调试&#xff0c;还是测试人员做接口测试&#xff0c;postman都是我们的首选工具之一 。那么接下来就介绍下postman到底有哪些功能&…