Springboot JPA级联操作的实现(一对一、一对多、多对多)

 更新时间:2025年07月13日 11:36:30   作者:zhong_bao  
本文深入解析JPA中的一对一、一对多和多对多级联操作,包括实体间的关系建立、查询、保存、刷新和删除等操作,具有一定的参考价值,感兴趣的可以了解一下

自从接触了JPA,就对立面的级联操作很费解,特此做一下学习。JPA提供的Entity级联可以建立一对一、一对多、多对多的关系,覆盖查询、保存、刷新、删除等操作。

(1)一对一,@OneToOne

TUser与TGender成一对一关系

@Entity
@Data
@Table(name = "user",schema = "hr")
@JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class TUser {
    @Id
    @GeneratedValue(generator="jpa-uuid")
    @Column(name = "user_id")
    private String id;

    @Column(name = "user_name")
    private String name;

    @Column(name = "user_describe")
    private String desc;

   //@JoinColumn的name指的是当前表user的字段gender_id,referencedColumnName指关联表gender的字段id
    @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST,CascadeType.REMOVE,CascadeType.ALL})
    @JoinColumn(name = "gender_id",referencedColumnName = "id")
    private TGender genderId;
}

而TGender为:

@Entity
@Data
@Table(name = "gender",schema = "hr")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"})
public class TGender {
    @Id
    @GenericGenerator(name = "jpa-uuid", strategy = "uuid")
    private String id;

    private String sex;
	
	//可维护可不维护,mappedBy就是被维护端,被TUser类中的属性“genderId”维护
    @OneToOne(mappedBy = "genderId", cascade = {CascadeType.MERGE, CascadeType.REFRESH}, optional = false)
    private TUser tUser;

(2)一对多,@OneToMany 和 @ManyToOne

两个是一起用的,以Company和User为例子,一个公司有多个职工

@Entity
@Data
@Table(name = "user",schema = "hr")
@JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class TUser {
    @Id
    @GeneratedValue(generator="jpa-uuid")
    @Column(name = "user_id")
    private String id;

    @Column(name = "user_name")
    private String name;

    @Column(name = "user_describe")
    private String desc;

    @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST,CascadeType.REMOVE,CascadeType.ALL})
    @JoinColumn(name = "gender_id",referencedColumnName = "id")
    private TGender genderId;
   
    //@JoinColumn的name指的是当前表user的字段company_id,referencedColumnName指关联表company的字段id
    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "company_id",referencedColumnName = "id")
    private TCompany companyId;
}

TCompany 为:

@Entity
@Data
@Table(name = "company",schema = "hr")
@JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"})
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class TCompany {

    @Id
    @GeneratedValue(generator="jpa-uuid")
    private String id;

    private String name;
    
   //查询时建议把userList忽略
   //可维护可不维护,mappedBy就是被维护端,被TUser类中的属性“companyId”维护
    @OneToMany(mappedBy="companyId",cascade = {CascadeType.ALL})
    private List<TUser> userList;
}

(3)多对多,@ManyToMany

已TUser和TRole为例子

@Entity
@Data
@Table(name = "user",schema = "hr")
@JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class TUser {
    @Id
    @GeneratedValue(generator="jpa-uuid")
    @Column(name = "user_id")
    private String id;

    @Column(name = "user_name")
    private String name;

    @Column(name = "user_describe")
    private String desc;

   //使用JoinTable属性把中间表关联起来,中间表主键为自增,joinColumns指的当前表user,name 属性指向中间表的user_id,referencedColumnName 指向user中的id,inverseJoinColumns是role表,name 属性指向中间表的role_id,referencedColumnName 指向role中的id
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST,CascadeType.REMOVE})
    @JoinTable(name = "user_role", schema = "hr",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    private List<TRole> roleSet = new ArrayList<>();
}

TRole为:

@Entity
@Data
@Table(name = "role",schema = "hr")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class TRole {

    @Id
    @GeneratedValue(generator="jpa-uuid")
    private String id;

    private String name;

    @Column(name = "role_desc")
    private String desc;
    
    //mappedBy就是被维护端,被TUser类中的属性“roleSet”维护
    @ManyToMany(mappedBy = "roleSet",cascade = {CascadeType.PERSIST,CascadeType.REMOVE})
    private List<TUser> userSet = new ArrayList<>();
}

依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.8.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <dependencies>
    <!-- Compile -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- config -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>2.9.2</version>
    </dependency>
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
      <version>2.9.2</version>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.47</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- Test -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
  </dependencies>

到此这篇关于Springboot JPA级联操作的实现(一对一、一对多、多对多)的文章就介绍到这了,更多相关Springboot JPA级联操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA TIMER简单用法学习

    JAVA TIMER简单用法学习

    Timer类是用来执行任务的类,它接受一个TimerTask做参数
    2013-07-07
  • SpringBoot3.0整合chatGPT的完整步骤

    SpringBoot3.0整合chatGPT的完整步骤

    ChatGPT是OpenAI推出的一个语言模型系统,它能够实时回答用户提问,包括聊天、纠正语法错误,甚至是写代码、写剧本等,由于可玩性很高,迅速在全球范围内风靡起来,下面这篇文章主要给大家介绍了关于SpringBoot3.0整合chatGPT的完整步骤,需要的朋友可以参考下
    2022-12-12
  • mybatis 新增返回id的实现

    mybatis 新增返回id的实现

    Mybatis插入数据时,可以通过两种方式返回生成的ID,两种方式都需要在实体类中提供userId的getter和setter方法,本文就详细的介绍一下这两种方法,感兴趣的可以了解一下
    2024-09-09
  • idea全局设置Maven配置的实现步骤

    idea全局设置Maven配置的实现步骤

    本文主要介绍了idea全局设置Maven配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Jmeter安装及配置教程详解

    Jmeter安装及配置教程详解

    很多朋友私信小编Jmeter安装及配置教程能出一期教程吗?正巧赶上疫情,不是太忙,下面小编把Jmeter安装及配置教程分享到脚本之家平台,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • Springboot使用jsp具体案例解析

    Springboot使用jsp具体案例解析

    这篇文章主要介绍了Springboot使用jsp具体案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java实现微信公众号自定义菜单的创建方法示例

    Java实现微信公众号自定义菜单的创建方法示例

    这篇文章主要介绍了Java实现微信公众号自定义菜单的创建方法,结合实例形式分析了java创建微信公众号自定义菜单的具体步骤、实现方法及相关操作注意事项,需要的朋友可以参考下
    2019-10-10
  • Guava轻松创建和管理不可变集合方法技巧

    Guava轻松创建和管理不可变集合方法技巧

    这篇文章主要为大家介绍了Guava轻松创建和管理不可变集合方法技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Java 中的 DataInputStream 介绍_动力节点Java学院整理

    Java 中的 DataInputStream 介绍_动力节点Java学院整理

    DataInputStream 是数据输入流。它继承于FilterInputStream。接下来通过本文给大家介绍Java 中的 DataInputStream的相关知识,需要的朋友参考下吧
    2017-05-05
  • vscode开发maven的javaweb项目并部署到tomcat及配置指南

    vscode开发maven的javaweb项目并部署到tomcat及配置指南

    这篇文章主要给大家介绍了关于vscode开发maven的javaweb项目并部署到tomcat及配置的相关资料,在vscode中创建maven项目,需要逐一操作下面的环节,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论