spring-data-jpa 一对多,多对一,多对多

spring-data-jpa 一对多,多对一,多对多

首先介绍几个主要用到的注解

  • @ManyToOne 多对一
  • @ManyToMany 多对多
  • @OneToMany 一对多
  • @JoinColumn 两表之间的关联
  • @JsonIgnoreProperties 忽略属性(避免Jason套娃)

比如我有两张表:customerbill,一个customer数据对应bill中多条数据,两表通过 customer.idbill.customer_id 关联

实体如下

@Entity
@Table(name = "bill")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Bill {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "customer_id")private Long customerId;@Column(name = "bill_no")private String billNo;@Column(name = "bill_amount")private float billAmount;@Column(name = "bill_date")private LocalDate billDate;
}
@Entity
@Table(name = "customer")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Customer {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "customer_name")private String customerName;@Column(name = "customer_age")private Integer customerAge;@Column(name = "customer_account")private String customerAccount;@Column(name = "customer_password")private String customerPassword;
}

为了使两张表关联起来,需要在实体中加入关联的逻辑

customer.java 中加入

@OneToMany( targetEntity = Bill.class, fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@JsonIgnoreProperties(value = {"customer"})
@JoinColumn(name = "customer_id",referencedColumnName = "id",insertable = false,updatable = false )
private List<Bill> bills;

Bill.java 中加入

@ManyToOne(targetEntity = Customer.class, fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@JsonIgnoreProperties(value = {"bills"})
@JoinColumn(name = "customer_id",referencedColumnName = "id",insertable = false,updatable = false )
private Customer customer;

下面说说如何配置使用

@ManyToOne,@ManyToMany,@OneToMany

意义就不解释了,通过注解名称就可以看懂,只说明属性

  • targetEntity

    类型:Class<?>

    指定关系的另一端实体的类型。比如上述代码中,customer实体类与bill实体关联,所以我在customer类的bills属性上的注解@OneToMany的targetEntity属性赋值Bill.class;这个属性是可选的,如果不指定,spring-data-jpa 将根据字段的类型来确定目标实体类,建议写上。

  • fetch

    类型:javax.persistence.FetchType

    指定加载策略:立即加载(FetchType.EAGER)和 延迟加载(FetchType.LAZY)

    • 立即加载:加载主实体时,其关联的实体或集合也会同时被加载。这种策略通过减少数据库查询次数来提高性能,因为它尝试在一个查询中获取所有关联实体的数据

    • 延迟加载:加载主实体时,其关联的实体或集合不会立即被加载,而是在第一次访问关联属性时才进行加载。这种策略可以减少不必要的数据库查询,因为只有在实际需要数据时才会进行加载

      使用延迟加载,我遇到了一个坑,这里顺便记录,有时一条a表数据对应几十万条b表数据,使用立即加载肯定是不合适的,故而用了延迟加载,使用延迟加载的时候,报错如下

       No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->com.train.spr.entities.Bill["customer"]->com.train.spr.entities.Customer$HibernateProxy$g4FqEJel["hibernateLazyInitializer"])
      

      如果你也遇到同样的问题,用如下方式解决
      在实体类名上加一句代码,如下

      @JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
      public class Bill {
      // 实现(略)
      }
      
  • cascade

    类型:javax.persistence.CascadeType[]

    级联操作,定义哪些持久化操作(如保存、更新、删除)应该被级联到关系的另一端实体。CascadeType是枚举类,可选值如下

    • CascadeType.ALL:表示所有的持久化操作都会级联到关系的另一端实体。这包括:PERSIST、MERGE、REMOVE、REFRESH 和 DETACH
    • CascadeType.PERSIST:当实体的对象被创建时,相关的实体也会被级联保存
    • CascadeType.MERGE:当实体被合并到当前持久化上下文时,相关的实体也会被级联合并
    • CascadeType.REMOVE:当实体被删除时,相关的实体也会被级联删除(删customer表中一条数据,jpa自动删除bill表中关联数据)
    • CascadeType.REFRESH:当实体被刷新时,相关的实体也会被级联刷新
    • CascadeType.DETACH:当实体被分离出持久化上下文时,相关的实体也会被级联分离

@JoinColumns 关联关系集合

若两张表之间通过多个字段相关联,比如A表和B表通过A.CREATE_DATE = B.CREATE_DATE AND A.ID = B.A_ID相关联,使用 @JoinColumns 包裹 @JoinColumn 集合

@JoinColumn 关联关系

定义两个实体之间以什么字段相关联;属性如下

  • name

    类型:string

    指定本表关联其他表的本表列名称

  • referencedColumnName

    类型:string

    指定本表关联其他表的其他表列名称(其他表的列名称也叫做外键)

  • unique

    类型:bool

    指定外键列是否具有唯一性约束(可选,默认false),拿我给的例子来说,一个customer可以对应多个bill,但是一个bill仅能对应一个customer,所以bill类中customer属性的@JoinColumn注解的属性改为true,表示customer中仅能有唯一一个实体与之对应

  • nullable

    类型:bool

    指定外键列是否可以为 NULL(可选,默认true),表示列可以为 NULL

  • insertable

    类型:bool

    指定外键列是否在插入操作时可被插入(可选,默认true)

  • updatable

    类型:bool

    指定外键列是否在更新操作时可被更新(可选,默认true)

  • columnDefinition

    类型:string

    指定外键列的 SQL 类型定义。这允许你自定义列的 SQL 类型和大小等详细信息(可选)

  • table

    类型:string

    指定外键列所在的表的名称。这在多表继承的场景中使用

  • foreignKey

    类型:String

    指定外键约束的名称。如果未指定,spring-data-jpa根据实体关系自动生成一个外键约束名称(可选)

@JsonIgnoreProperties JSON属性忽略

如果实体类的关联属性上不加此注解,那么你查出来的json数据结构绝对是“套娃”;属性如下

  • value

    类型:string[]

    指定忽略对方实体类中的某个属性转换为json,比如我上述例子中 customer.java 中有属性 bills,而bill.java中又有customer,所以他俩得互相忽略对方实体类中对自己引用的属性名,故而customer实体中忽略bill中的customer,bill实体中忽略customer中的bills。这么说有点抽象哈,不过你自己试一试就很轻松能明白了

  • ignoreUnknown

    类型:boolean

    ignoreUnknown 属性只适用于从 JSON 数据到 Java 对象的反序列化过程,当设置为 true 时,如果 JSON 中包含未在 Java 类中定义的属性,这些属性将被忽略。这有助于处理 JSON 数据中可能存在的额外字段,而不会抛出异常(可选)

  • allowGetters

    类型:boolean

    当设置为 true 时,即使属性没有 setter 方法,也可以通过 getter 方法访问。这通常用于只读属性(可选)

  • allowSetters

    类型:boolean

    当设置为 true 时,即使属性没有 getter 方法,也可以通过 setter 方法设置值。这通常用于只写属性(可选)


暂且写到这儿,后续有总结再补

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/469097.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金融学期末速成笔记

【拯救者】金融学速成&#xff08;基础习题&#xff09; 重点: 市场经济是发达的商品经济。在市场经济条件下&#xff0c;市场机制作为资源配置方式&#xff0c;发挥基础性作用。 除具有商品经济的一般特征外&#xff0c;与商品经济相比&#xff0c;市场经济还具有一些新的特征…

后悔没早点知道,Coze 插件 + Cursor 原来可以这样赚钱

最近智能体定制化赛道异常火爆。 打开闲鱼搜索"Coze 定制",密密麻麻的服务报价直接刷屏,即使表明看起来几十块的商家,一细聊,都是几百到上千不等的报价。 有趣的是,这些智能体定制化服务背后,最核心的不只是工作流设计,还有一个被很多人忽视的重要角色 —— …

嵌入式采集网关(golang版本)

为了一次编写到处运行&#xff0c;使用纯GO编写&#xff0c;排除CGO&#xff0c;解决在嵌入式中交叉编译难问题 硬件设备&#xff1a;移远EC200A-CN LTE Cat 4 无线通信模块&#xff0c;搭载openwrt操作系统&#xff0c;90M内存

基于Multisim数字电子秒表0-60S电路(含仿真和报告)

【全套资料.zip】数字电子秒表电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.秒表最大计时值为60秒&#xff1b; 2. 2位数码管显示&#xff0c;分辨率为1秒&#xff1b; 3.具有清零…

昇思大模型平台打卡体验活动:项目2基于MindSpore通过GPT实现情感分类

昇思大模型平台打卡体验活动&#xff1a;项目2基于MindSpore通过GPT实现情感分类 1. 载入与处理数据集 在情感分类任务中&#xff0c;我们使用了IMDB数据集&#xff0c;首先需要对数据进行加载和处理。由于原数据集没有验证集&#xff0c;我们将训练集重新划分为训练集和验证…

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计&#xff0c;使得Mac book有着非常棒的使用体验&#xff0c;但是在Mac电脑的使用时间过长时&#xff0c;电脑也会出现响应速度变慢或应用程序崩溃的情况&#xff0c;当发生的时候却不知道什么原因导致的&#xff0c;想要查询电脑…

有趣的Midjourney作品赏析(附提示词)

中文提示词&#xff1a;国风少年 C4D软件,高分辨率,超细节,超现实主义, 英文提示词&#xff1a;National Style Youth Cinema4D,high resolution,hyper detailed,surrealism, --niji 6 --ar 1:1 中文提示词&#xff1a;粘土模型&#xff0c;男性穿着中世纪欧洲蓝色盔甲&#x…

时序预测 | gamma伽马模型锂电池寿命预测 EM算法粒子滤波算法结合参数估计

时序预测 | gamma伽马模型锂电池寿命预测 EM算法粒子滤波算法结合参数估计 目录 时序预测 | gamma伽马模型锂电池寿命预测 EM算法粒子滤波算法结合参数估计预测效果基本介绍参考资料 预测效果 基本介绍 gamma伽马模型锂电池寿命预测 EM算法粒子滤波算法结合参数估计 伽马模型、…

男同事36岁,听说被裁拿了12万。今天看到他退了群,但下午领导就反悔了,让他回来,还要把12万补偿退回来

亲爱的读者们&#xff0c;今天咱们来聊聊职场那些事儿。你听说过吗&#xff1f;有位男同事&#xff0c;36岁&#xff0c;被裁了&#xff0c;拿了12万补偿金&#xff0c;然后退了群。你以为这就是结局&#xff1f;不&#xff0c;故事才刚刚开始&#xff01; 想象一下&#xff0…

李佳琦回到巅峰背后,双11成直播电商分水岭

时间倏忽而过&#xff0c;又一年的双11即将宣告结束。 从双11正式开始前的《新所有女生的offer》&#xff0c;到被作为“比价”标杆被其他平台直播间蹭、被与其他渠道品牌比较&#xff0c;再到直播间运营一时手快多发了红包……整个双11周期下来&#xff0c;李佳琦直播间在刷新…

Golang | Leetcode Golang题解之第546题移除盒子

题目&#xff1a; 题解&#xff1a; func removeBoxes(boxes []int) int {dp : [100][100][100]int{}var calculatePoints func(boxes []int, l, r, k int) intcalculatePoints func(boxes []int, l, r, k int) int {if l > r {return 0}if dp[l][r][k] 0 {r1, k1 : r, k…

Python | Leetcode Python题解之第553题最优除法

题目&#xff1b; 题解&#xff1a; class Solution:def optimalDivision(self, nums: List[int]) -> str:if len(nums) 1:return str(nums[0])if len(nums) 2:return str(nums[0]) "/" str(nums[1])return str(nums[0]) "/(" "/".joi…

新手 Vue 项目运行

前言&#xff1a;前面讲了我们已经将spingboot项目运行起来了&#xff0c;现在我们只需将后台管理的Vue项目运行起来即可完成整个项目。 在运行vue项目之前&#xff0c;请先运行springboot项目&#xff0c;运行步骤请看&#xff1a;运行Springboot Vue 项目_springbootvue项目…

光学全息详解

一、光学全息概述 1.1 光学全息的基本思想与原理的概述 光波是电磁波, 随时间振动,并在空间传播。光波照射物体时, 其振幅和相位就被空间调制。物光波的振幅给出物体的亮度(强度)信息, 相位给出物体的方位(深度和位置)信息。若能采用某种方法把物光波的振幅和相位同时记录下来…

自定义包和第三方包

1.自定义包由自己创建&#xff08;创建步骤如下&#xff09; 2.第三方包由大佬开发可通过python安装后自带的pip安装第三方包&#xff08;安装时由于默认连接的是外网网速较慢&#xff0c;可换国内的网如(清华网)&#xff1a;https://pypi.tuna.ysinghua.edu.cn/simple&#x…

SNH48 GROUP燃动杭州 第五届偶像运动会落下帷幕

2024年11月9日&#xff0c;“我们能赢”SNH48 GROUP第五届偶像运动会在杭州运河体育公园盛大开赛&#xff0c;本次运动会由高榕及SNH48郭爽、GNZ48梁娇作为赛事特邀主持人&#xff0c;并于小红书、微信视频号、SNH48 GROUP官方直播APP口袋48及MEET48全程直播。SNH48&#xff08…

Latex使用花体符号\mathbb{R}报错解决办法

一、背景 latex的优势是可以进行自动排版&#xff0c;以及复杂公式的编辑。然而&#xff0c;编辑花体符号R时&#xff0c;使用命令\mathbb{R}报错&#xff0c;编译不通过&#xff0c;这里记录一下解决办法。 二、Latex使用花体符号\mathbb{R}报错解决办法 在LaTeX中&#xf…

当当网创始人李国庆邀您:共襄创客匠人5000人“全球创始人IP领袖高峰论坛”

创客匠人正式官宣&#xff01;当当网原CEO、联合创始人和首席大股东、CRYSTO董事长、CEO李国庆&#xff0c;受邀参加创客匠人5000人“全球创始人IP领袖高峰论坛”&#xff0c;将与我们携手共赴这场巅峰盛宴。 由创客匠人打造的“全球创始人IP领袖高峰论坛”将在2024年12月26日-…

docker安装zookeeper,以及zk可视化界面介绍

1. zookeeper 1.1. zookeeper简单介绍 ZooKeeper 是一个分布式的开源协调服务&#xff0c;最初由 Apache Hadoop 项目开发&#xff0c;用于构建分布式应用程序。它提供了一个简单的接口&#xff0c;允许开发人员实现诸如配置维护、域名服务、分布式同步、组服务等常见任务。Z…

SIwave:释放 SIwizard 求解器的强大功能

SIwave 是一种电源完整性和信号完整性工具。SIwizard 是 SIwave 中 SI 分析的主要工具&#xff0c;也是本博客的主题。 SIwizard 用于研究 RF、clock 和 control traces 的信号完整性。该工具允许用户进行瞬态分析、眼图分析和 BER 计算。用户可以将 IBIS 和 IBIS-AMI 模型添加…