JPA实现多对多关系

这篇具有很好参考价值的文章主要介绍了JPA实现多对多关系。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文已收录于专栏
《Java》

概念说明

  多对多关系是指两个实体之间存在多对多的关联关系。在数据库中,多对多关系无法直接表示,需要通过中间表来实现。
  举个例子,假设有两个实体类:学生(Student)和课程(Course)。一个学生可以选择多门课程,而一门课程也可以被多个学生选择。这就是一个多对多的关系。
  在数据库中,可以创建三张表来表示多对多关系:学生表(students)、课程表(courses)和中间表(student_course)。中间表中存储了学生和课程之间的关联关系,它包含了学生的ID和课程的ID。
  通过中间表,可以将多对多关系拆分为两个一对多关系。学生和课程之间的关系可以被拆分为学生和中间表之间的一对多关系,以及课程和中间表之间的一对多关系。

优势利弊

  多对多关系的优点是能够灵活地表示实体之间的复杂关联关系。例如,在上述的学生和课程的例子中,一个学生可以选择多门课程,而一门课程也可以被多个学生选择。这种关系在实际应用中非常常见,通过多对多关系可以方便地表示和操作这种复杂的关联关系。
  多对多关系也有一些限制和注意事项。例如,中间表的设计和维护需要一定的注意,以确保关联关系的正确性和一致性。此外,多对多关系可能会导致性能问题,因为查询和操作涉及多个表的关联。因此,在设计和使用多对多关系时,需要仔细考虑和评估实际需求和性能要求。

实现方式

通过两个@ManyToMany注解实现

类图

JPA实现多对多关系,Java,python,数据库,开发语言

代码

学生类

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @ManyToMany
    @JoinTable(name = "student_course",
               joinColumns = @JoinColumn(name = "student_id"),
               inverseJoinColumns = @JoinColumn(name = "course_id"))
    private List<Course> courses;
    
}

  在Student实体类中,使用@ManyToMany注解来表示多对多关系,并通过@JoinTable注解指定中间表的名称和关联字段。joinColumns指定了中间表中与Student实体关联的外键字段,inverseJoinColumns指定了中间表中与Course实体关联的外键字段。

课程类

@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @ManyToMany(mappedBy = "courses")
    private List<Student> students;
    
}

  在Course实体类中,使用@ManyToMany(mappedBy = “courses”)注解来表示多对多关系,并通过mappedBy属性指定了关联的属性名,即Student实体类中的courses属性。
中间表
JPA实现多对多关系,Java,python,数据库,开发语言
JPA实现多对多关系,Java,python,数据库,开发语言
  通过使用@ManyToMany的方式我们确实可以实现多对多的效果,但是我们没有办法在中间表中添加其他字段,中间表中只有学生的id和课程id。如果我们想要添加一些比如创建时间、更新时间、是否删除的字段是没有办法添加的。如果我们没有需要添加字段的需求那我们直接通过@ManyToMany 的方式即可。如果我们需要添加一些其他的字段就需要调整我们的实现方式。下面我们通过两个@OneToMany和两个@ManyToOne注解来解决这个问题。

通过@OneToMany和@ManyToOne注解实现

类图

JPA实现多对多关系,Java,python,数据库,开发语言

代码

学生类

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @OneToMany(mappedBy = "student")
    private List<StudentCourse> studentCourses;
    
}

课程类

@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @OneToMany(mappedBy = "course")
    private List<StudentCourse> studentCourses;
    
}

学生和课程关系类

@Entity
@Table(name = "student_course")
public class StudentCourse {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @ManyToOne
    @JoinColumn(name = "student_id")
    private Student student;
    
    @ManyToOne
    @JoinColumn(name = "course_id")
    private Course course;
    
    private int grade;
    
}

  这样,通过以上的配置,JPA会自动创建中间表,并维护学生和课程之间的关联关系,同时在中间表中添加了grade字段。你可以通过访问StudentCourse实体类来操作中间表的数据,包括添加学生选课、查询学生所选的课程以及对应的成绩等。

少走弯路

  当我们实现了多对多之后我们会发现在具体应用这些对象的时候会出现循环引用的问题,可能会导致堆栈溢出的问题。参考下面博客来解决循环引用带来的问题:
   https://blog.csdn.net/weixin_45490198/article/details/131795009文章来源地址https://www.toymoban.com/news/detail-582637.html

总结提升

  1. 在两个实体类中使用@ManyToMany注解来表示多对多关系,并通过@JoinTable注解指定中间表的名称和关联字段。
  2. JPA会自动创建中间表,并维护两个实体类之间的关联关系。
  3. 如果需要在中间表中添加其他字段,可以创建一个新的实体类来表示中间表,并在两个实体类中使用@OneToMany和@ManyToOne注解来表示与中间表的一对多关系。

🎯 此文章对你有用的话记得留言+点赞+收藏哦🎯

到了这里,关于JPA实现多对多关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理

    目录 一.关联关系配置的好处  二. 导入数据库表:  三.    一对多关系:--    一个订单对应多个订单项        四.一对一关系:---一个订单项对应一个订单 五.多对多关系(两个一对多)          MyBatis是一个Java持久化框架,可以 通过XML或注解的方式 将对象与数据库

    2024年02月11日
    浏览(64)
  • Django中使用反向关系名称(related_name)解决由“多对多”关系引起的字段名字冲突问题引起的迁移命令报错。

    当在模型中为关系字段添加了 related_name 参数后,您可以使用该参数指定的名称来引用反向关系。下面是一个简单的例子来说明如何引用反向关系。 假设您有以下两个模型: 在上面的例子中, Book 模型有一个外键字段 author ,它关联到 Author 模型。通过添加 related_name=\\\'books\\\' 参

    2024年02月16日
    浏览(48)
  • Mybatis多对多查询案例!

    在MyBatis中执行多对多查询需要使用两个主要表和一个连接表(通常称为关联表)来演示。在这个示例中,我们将使用一个示例数据库模型,其中有三个表:`students`、`courses` 和 `student_courses`,它们之间建立了多对多关系。`students` 表存储学生信息,`courses` 表存储课程信息,

    2024年02月11日
    浏览(33)
  • hibernate 一对一 一对多 多对多

    User 实体类 Address 实体类 测试 User实体类 Vlog实体类 测试 测试 mappedby : 属性指向实体关联表的拥有者,声明在被拥有者。 简单说就是另一边定义了关联规则,这边不用再定义一遍了,直接引用就行。 @JoinColumn : 外键列 在一对一中 @JoinColumn 声明在那个实体类中,生成数据库表

    2024年02月13日
    浏览(50)
  • MySQL表设计思路(一对多、多对多...)

    要开始单独负责需求了,捋一捋表设计的思路。 字符串类型 varchar:即variable char ,可边长度的字符串,会根据实际数据的长度动态分配空间,以节省空间,如varchar(10)存jack,则只给4字节 char:定长字符串,最大255 字符 。不论实际数据长度都以定长空间存储,使用不当容易浪

    2024年02月07日
    浏览(41)
  • Kurento多对多webrtc会议搭建测试

    环境ubuntu18.04 KMS版本6.13.0 多对多通信demo7.0.0 KMS运行起来后,通过运行它的一个个demo,来实现不同的功能,它的demo很多如下: https://github.com/Kurento 里面有一对一,多对多,还有一些特效的demo。这里运行的是多对多通话的demo。 它的KMS可以通过apt方式安装,然后拉下来每个d

    2024年02月08日
    浏览(47)
  • queryWrapper处理一对一,一对多,多对多

    是的,定义一个 BankUser 对象时,通常需要在其内部定义一个 BankCard 字段来表示其与 bank_card 表的关联关系。 例如,在 BankUser 类中定义一个 BankCard 对象作为其属性:```java ``` 然后,在查询 BankUser 对象时,需要使用 LEFT JOIN 将 bank_user 和 bank_card 表进行关联,并使用 select 方法指

    2024年02月04日
    浏览(50)
  • MySQL-多表设计-一对一&多对多

    案例:用户 与身份证信息 的关系 关系:一对一关系, 多用于单表拆分 ,将一张表的基础字段放在一张表中,其它字段放在另一张表中,以提高操作效率 实现: 在任意一方加入外键,关联另一方的主键,并且设计外键为唯一的(unique) 具体代码及运行结果如下:   上述的

    2024年02月16日
    浏览(48)
  • 杨中科 .NETCORE EFCORE第七部分 一对一,多对多

    1、builder.HasOne(o =o.Delivery).WithOne(d=d.Order).HasForeignKey(d=dOrderId); 2、测试插入和获取数据 示例 新建 Order 新建 Delivery DeliveryConfig OrderConfig 执行 迁移命令 查看数据库 测试数据插入 运行查看数据 1、多对多:老师一学生 2、EF Core 5.0开始,才正式支持多对多 3、需要中间表,举例数据

    2024年01月17日
    浏览(45)
  • websocket 局域网 webrtc 一对一 多对多 视频通话 的示例

    基本介绍 WebRTC(Web Real-Time Communications)是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC 包含的这些标准使用户在无需安装任何插件或者第

    2024年04月28日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包