从入门到精通:掌握JPA @ManyToMany级联保存的4个关键步骤

第一章:JPA @ManyToMany级联保存概述

在Java持久化框架JPA中,@ManyToMany注解用于描述两个实体之间多对多的关联关系。这种关系通常通过一张中间表(join table)来维护,适用于如用户与角色、文章与标签等典型场景。当涉及级联保存(Cascade Save)时,JPA允许在一个实体被保存的同时,自动将其关联的另一个实体也持久化到数据库中,前提是正确配置了cascade属性。

核心实现机制

为了实现级联保存,必须在@ManyToMany注解中显式指定级联策略,例如使用cascade = CascadeType.PERSIST或更全面的CascadeType.ALL。此外,需确保关系的拥有方(owning side)正确管理中间表的插入操作。

典型代码示例


@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // 配置多对多关系及级联保存
    @ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
        name = "user_role",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private List roles = new ArrayList<>();

    // getter 和 setter 省略
}
上述代码中,当保存一个包含新角色的用户时,若角色尚未持久化,JPA将自动执行插入操作。

关键注意事项

  • 级联操作仅由关系的拥有方触发,因此应确保在正确的实体上配置@JoinTable
  • 双向关联时,需在双方同步集合引用,避免出现持久化状态不一致
  • 过度使用CascadeType.ALL可能导致意外的数据删除或更新,应根据业务需求谨慎选择
级联类型作用说明
CascadeType.PERSIST保存时级联持久化关联对象
CascadeType.MERGE合并时级联更新关联对象
CascadeType.ALL包含所有级联操作

第二章:理解@ManyToMany关系的核心机制

2.1 双向关联中的拥有方与被拥有方解析

在JPA等ORM框架中,双向关联需明确指定拥有方(Owner)与被拥有方(Inverse)。拥有方负责维护外键关系,被拥有方通过mappedBy声明反向关联。
实体映射示例
@Entity
public class Department {
    @Id private Long id;
    @OneToMany(mappedBy = "department")
    private List<Employee> employees;
}

@Entity
public class Employee {
    @Id private Long id;
    @ManyToOne
    @JoinColumn(name = "dept_id")
    private Department department;
}
上述代码中,Employee为拥有方,其@JoinColumn生成外键字段;Department为被拥有方,通过mappedBy指向对方属性。
责任划分对比
角色外键维护映射注解
拥有方是@JoinColumn
被拥有方否mappedBy

2.2 中间表的生成策略与自定义配置

动态中间表生成机制
在数据集成过程中,中间表作为源与目标系统之间的缓冲层,其生成策略直接影响同步效率与数据一致性。系统支持基于元数据自动推导字段结构,并允许通过配置文件进行字段映射、类型转换和默认值注入。
{
  "tableName": "mid_user_info",
  "primaryKey": ["user_id"],
  "fields": [
    { "source": "uid", "target": "user_id", "type": "BIGINT" },
    { "source": "name", "target": "full_name", "type": "VARCHAR(255)" }
  ],
  "partitionBy": "dt"
}
上述配置定义了中间表的结构映射规则。其中 primaryKey 指定主键用于去重合并,partitionBy 启用分区策略以提升查询性能。
自定义配置扩展
通过实现插件化接口,可扩展中间表的DDL生成逻辑。支持指定索引策略、存储格式(如ORC、Parquet)及压缩方式,满足不同场景下的性能需求。

2.3 级联操作类型详解(CASCADE)及其语义

在关系型数据库中,CASCADE 是一种关键的级联操作类型,用于在主表数据变更时自动传播到从表,确保引用完整性。
级联删除与更新
当主表记录被删除或更新时,启用 CASCADE 的外键约束会自动删除或同步从表中的相关记录。
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE CASCADE
ON UPDATE CASCADE;
上述语句表示:若 customers 表中某客户ID被删除或更改,orders 表中对应订单将自动删除或更新 customer_id。
操作语义对比
操作类型DELETE 语义UPDATE 语义
CASCADE删除所有关联记录更新所有外键值
该机制适用于强依赖关系,如用户与其订单,避免孤立数据。

2.4 FetchType与性能影响的权衡分析

在JPA中,FetchType直接影响实体加载策略与系统性能。主要分为EAGER(急加载)和LAZY(懒加载)两种模式。
加载策略对比
  • EAGER:关联实体在主实体加载时一并获取,适用于强依赖关系,但易导致数据冗余;
  • LAZY:延迟至访问属性时才查询,节省内存,但可能引发N+1查询问题或LazyInitializationException。
性能影响示例
@Entity
public class User {
    @OneToMany(fetch = FetchType.LAZY)
    private List orders;
}
上述配置避免一次性加载所有订单,但在未开启事务的场景下访问orders将抛出异常。
选择建议
场景推荐策略
一对少且必用关联数据EAGER
大数据量或可选关联LAZY

2.5 实体生命周期中集合管理的最佳实践

在实体生命周期管理中,集合的变更追踪与同步尤为关键。应优先采用延迟加载结合脏检查机制,确保集合变更被准确捕获。
避免直接暴露集合引用
应返回不可变视图以防止外部修改:
public class Order {
    private Set<OrderItem> items = new HashSet<>();

    public Set<OrderItem> getItems() {
        return Collections.unmodifiableSet(items);
    }

    public void addItem(OrderItem item) {
        items.add(item);
        item.setOrder(this);
    }
}
上述代码通过封装添加逻辑,保证双向关联一致性,防止集合状态不一致。
使用集合代理优化性能
ORM 框架如 Hibernate 提供了 PersistentSet,可在不加载全部元素的情况下监控增删操作,减少数据库往返。
推荐操作模式
  • 始终在父实体中封装集合修改方法
  • 删除元素时调用双向解除关联
  • 避免在业务逻辑中直接使用 clear() 或 removeAll()

第三章:实现级联保存前的关键设计考量

3.1 实体模型设计中的依赖关系梳理

在复杂系统中,实体模型间的依赖关系直接影响数据一致性与服务解耦程度。合理的依赖梳理可提升系统的可维护性与扩展能力。
依赖类型分类
  • 强依赖:一个实体的生命周期完全依赖另一个实体,如订单与订单项;
  • 弱依赖:仅引用外部实体ID,不控制其生命周期,如用户与地址;
  • 双向依赖:需通过事件或中间层解耦,避免循环引用。
代码示例:Go中的依赖表达
type Order struct {
    ID        uint
    UserID    uint      // 弱依赖用户
    Items     []OrderItem // 强依赖订单项
    CreatedAt time.Time
}
上述结构中,UserID为外键引用,实现弱依赖;而Items作为嵌套子实体,体现聚合根模式下的强依赖关系,确保事务一致性。
依赖管理策略
通过事件驱动机制解耦服务间依赖,例如订单创建后发布OrderCreated事件,由用户服务异步更新积分。

3.2 equals()与hashCode()方法的正确实现

在Java中,重写 `equals()` 和 `hashCode()` 方法是确保对象在集合中行为正确的关键。若两个对象通过 `equals()` 判定相等,则它们的 `hashCode()` 必须返回相同值。
核心契约
  • 自反性:x.equals(x) 应为 true
  • 对称性:若 x.equals(y) 为 true,则 y.equals(x) 也应为 true
  • 传递性:若 x.equals(y) 且 y.equals(z),则 x.equals(z)
  • 一致性:多次调用结果不变
代码示例
public class User {
    private String id;
    private String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof User)) return false;
        User user = (User) o;
        return Objects.equals(id, user.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
上述实现中,`equals()` 首先判断引用是否相同,再检查类型兼容性,最后比较关键字段 `id`。`hashCode()` 基于同一字段生成哈希值,满足集合类(如 HashMap)的存储需求。忽略此规则将导致对象无法从 HashSet 或 HashMap 中正确检索。

3.3 避免循环引用与持久化上下文污染

在使用ORM框架时,循环引用和持久化上下文污染是常见的性能陷阱。当多个实体相互持有引用且被同一会话管理时,容易导致内存泄漏和脏数据传播。
典型问题场景
例如父子实体双向关联未正确处理,会导致序列化时栈溢出或重复保存:

@Entity
public class Parent {
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Child> children = new ArrayList<>();
}

@Entity
public class Child {
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}
上述代码若不加控制地级联操作,会使持久化上下文累积大量未清理的托管对象。
解决方案
  • 使用 @JsonIgnore 或 transient 阻断序列化链
  • 操作完成后及时调用 EntityManager.clear() 重置上下文
  • 采用 DTO 模式隔离领域模型与外部交互

第四章:实战演练——完整级联保存场景开发

4.1 创建实体类并配置@ManyToMany映射

在JPA中,@ManyToMany用于描述两个实体间的多对多关系,通常通过中间表进行关联。
实体类定义与注解配置
以用户(User)和角色(Role)为例,一个用户可拥有多个角色,一个角色也可被多个用户拥有:
@Entity
public class User {
    @Id private Long id;
    
    @ManyToMany
    @JoinTable(
        name = "user_role",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private Set<Role> roles = new HashSet<>();
}
上述代码中,@JoinTable指定中间表名为user_role,joinColumns表示当前实体的外键,inverseJoinColumns表示对方实体的外键。
双向关联注意事项
若需支持双向访问,应在Role实体中添加对应的@ManyToMany(mappedBy = "roles")字段,并注意在业务逻辑中维护两边的关系一致性,避免持久化异常。

4.2 编写Service层逻辑实现双向关联维护

在领域模型中,双向关联常用于表达实体间的互引关系,如订单与用户、文章与评论。为确保数据一致性,必须在Service层显式维护双方引用。
数据同步机制
执行更新操作时,应先更新主控方,再同步反向引用。例如,在添加评论时,不仅要设置评论的“文章”引用,还需将评论加入文章的评论列表中。
public void addCommentToArticle(Comment comment, Long articleId) {
    Article article = articleRepository.findById(articleId);
    comment.setArticle(article);
    article.getComments().add(comment); // 双向绑定
    articleRepository.save(article);
}
上述代码确保了评论指向文章的同时,文章也持有该评论的引用,避免因单向更新导致的级联失效或懒加载异常。
  • 双向维护需注意避免循环引用引发的序列化问题
  • 建议在聚合根内封装关联逻辑,提升业务语义清晰度

4.3 控制器端接收参数与事务管理配置

在Spring MVC中,控制器通过注解高效接收请求参数。使用 @RequestParam、@PathVariable 和 @RequestBody 可分别处理查询参数、路径变量和JSON请求体。
常用参数接收方式
  • @RequestParam:获取URL中的查询参数
  • @PathVariable:提取RESTful风格的路径变量
  • @RequestBody:绑定JSON数据到Java对象
事务管理配置示例
@RestController
@Transactional
public class OrderController {

    @Autowired
    private OrderService orderService;

    @PostMapping("/orders")
    public ResponseEntity createOrder(@RequestBody OrderRequest request) {
        orderService.placeOrder(request);
        return ResponseEntity.ok("订单创建成功");
    }
}
上述代码中,@Transactional 注解确保订单创建过程中的数据库操作具备原子性。若服务方法抛出异常,事务将自动回滚,保障数据一致性。

4.4 测试用例编写与数据库结果验证

在自动化测试中,验证数据库状态是确保业务逻辑正确性的关键环节。测试用例需覆盖数据插入、更新、删除等操作后的持久化结果。
测试用例设计原则
  • 每个测试应独立运行,避免依赖其他用例的执行结果
  • 使用事务回滚或测试后清理机制保障环境纯净
  • 明确预期结果,包括记录数、字段值和关联关系
数据库断言示例(Go + SQL)
// 查询用户积分余额
var points int
err := db.QueryRow("SELECT points FROM user WHERE id = ?", userID).Scan(&points)
assert.NoError(t, err)
assert.Equal(t, 100, points) // 验证积分是否正确增加
上述代码通过直接查询数据库验证业务操作后的状态一致性,points 字段反映充值或消费后的最终值,确保应用层逻辑与存储层一致。

第五章:常见问题排查与最佳实践总结

服务启动失败的典型原因与应对
当微服务无法正常启动时,首先检查依赖配置是否完整。常见问题是数据库连接超时或配置中心拉取失败。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb?connectTimeout=5000&socketTimeout=3000
    username: root
    password: ${DB_PASSWORD} # 确保环境变量已设置
若使用 Spring Cloud Config,需验证 bootstrap.yml 中的 uri 配置正确,并确认配置服务器处于运行状态。
高并发场景下的性能调优建议
在压测中发现响应延迟上升时,应优先分析线程池和连接池配置。以下是推荐的 HikariCP 调整参数:
参数名推荐值说明
maximumPoolSize20根据 CPU 核数合理设置,避免过度竞争
connectionTimeout3000防止阻塞过久
idleTimeout600000空闲连接回收时间
日志定位生产问题的关键技巧
启用 MDC(Mapped Diagnostic Context)可追踪请求链路。在拦截器中注入 traceId:

MDC.put("traceId", UUID.randomUUID().toString());
logger.info("Handling request for {}", request.getUri());
结合 ELK 收集日志后,可通过 traceId 快速串联分布式调用链,精准定位异常节点。
  • 定期审查 GC 日志,识别内存泄漏迹象
  • 使用 Prometheus + Grafana 监控接口 P99 延迟
  • 禁用生产环境的调试端点(如 /actuator/env)
matlab kwave模拟超声换能器学习笔记 kwave模拟超声换能器的学习笔记,从零开始造车轮 阅读详情

相关推荐

Tartancalib标定OAK-FFC_4p(上)

1.使用Tartancalib标定双目或多目相机前,先对单个相机标定获得内参,再获得外参。

qq_51731421的博客 1277

Spring Data JPA多表操作(5)

Spring Data JPA多表操作(5) 数据库中多表之间的关系 多对多 一对多 一对一 数据库设计示例 实体示例 客户:指的是一家公司,我们记为A。 联系人:指的是A公司中的员工。 在不考虑兼职的情况下,公司和员工的关系即为一对多。 表设计示例 实体类关系设计 客户(公司)类(一) @Entity//表示当前类是一个实体类 @Table(name="cst_custom...

weixin_39248420的博客 987

SGX软硬件栈(二)——硬件指令

硬件指令分为内核权限硬件指令和用户权限硬件指令。内核权限硬件指令指的是指令需要通过内核态下才能访问,缩写是ENCLS。用户权限硬件指令指的是指令用户态下便能访问,缩写是ENCLU。每一个具体的功能指令被称为叶功能,如EADD叶功能,因为叶功能之间的区分是硬件指令(如ENCLS指令:0x 0F 01 CF)的EAX值不同,因此ENCLS指令的EAX在输入时都是用作叶功能号。 内核权限硬件指令-ENCLS 如图2所示,SGX 1代指令中,ENCLS主要用于管理Enclave生命周期等。比如下文将介绍的Enc

小气球归来的博客 2889

Spring Data JPA OneToMany中的级联保存

怎么在保存主表的同时将附表也保存 1 需要给附表对象设置关联的主表,然后再把附表对象设置给主表,最后save主表。 在service中 public void add(Student s){ SetCourse> courses = s.getCourses(); courses.forEach(c->{ //关键 c.setS

WangPing1223的博客 1万+

别再让信号‘撞墙’了!手把手教你用嘉立创阻抗计算器搞定PCB高速线(附免费压层结构选择)

本文详细介绍了如何使用嘉立创阻抗计算器解决PCB高速线设计中的阻抗匹配问题,避免信号反射和传输损耗。通过免费压层结构选择和五步计算法,帮助工程师快速掌握USB3.0差分线等高速信号的设计技巧,提升PCB设计效率和信号质量。

weixin_30736301的博客 278

如何使用JMeter进行大模型的压力测试?

使用JMeter进行大模型的压力测试,核心是通过模拟高并发请求,测试大模型在极限负载下的性能表现(如响应时间、吞吐量、错误率、资源瓶颈等)。通过以上步骤,可系统性评估大模型在高压下的性能极限,为优化模型(如量化、蒸馏)、扩容硬件(增加GPU)或调整接口限流策略提供数据依据。)、请求方式(POST)、认证方式(API Key放在Header)、请求参数(作用:避免瞬间高压压垮系统,更精准找到瓶颈点。等)、响应格式(同步/流式)。需获取:API地址(如。通过CSV文件引入不同。

alankuo的专栏 788

SpringData JPA中@OneToMany和@ManyToOne的使用

尝试一次简洁风格 环境:springboot2.1.7+jdk1.8+mysql8.0+druid1.1.10+Springdata JPA+Lombok 作者:cauchy6317在csdn 需求场景:学生和学校的业务设计 博文目标:使用这两个注解的正确姿势 pom.xml文件的dependencies见附录 Student类和School类 @Data @Table @Entity @Acce...

cauchy6317的博客 2万+

S32K314 EB配置MCAL全模块讲解【Autosar——1 MCU模块详解】持续更新中

FIRC(fast internal RC Oscillator) :高速内部时钟,固定48MHZ;SIRC(Slow Internal RC Oscillator):低速内部时钟,固定32KHZ;FXOSC(Fast Crystal Oscillator Digital Controller):高速外部晶振(8-40MHZ),根据原理图选型进行配置;SXOSC():外部低速外部时钟,固定输入32.768KHZ;PLL_PHIn_CLK:时钟倍频锁相环时钟范围(640-1280MHZ);

qq_40488886的博客 1781

0.1、级联保存CascadeType.PERSIST

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33714884的博客 288

华为OD新系统机试真题 4.26 -最大化游戏试玩资格分发

华为OD机试新系统真题【最大化游戏试玩资格分发】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试 4月26号真题【最大化游戏试玩资格分发】。

qq_45776114的博客 825

【EB_Tresos专题】-06-配置一个UDS诊断DID

<--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> 结尾 ...

「汽车电子助手」的博客 4085

jpa 保存一对多对象

在Java Persistence API (JPA) 中,保存一对多关系的对象涉及主表(“一”侧)和从表(“多”侧)的实体。否则,需要手动管理事务,如上面示例中的。在实际项目中,通常会选择一方作为关系维护端,避免冗余操作和数据不一致。通过上述步骤,就可以成功地使用JPA保存一对多关系中的对象了。对象的操作(如保存、更新、删除)会自动传播到关联的。实体(从表,"多"侧)之间存在一对多关系。上述示例中,关系维护是在“多”侧(实体(主表,"一"侧),它与多个。指定了关系的维护端是在。对象的保存操作,包括在。

qq_33240556的博客 785

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

为什么你的@ManyToMany不保存?深度解读JPA实体状态与级联传播

解决JPA中多对多关联不保存的难题,深入解析实体状态与级联机制。涵盖@ManyToMany级联保存的正确配置、双向关系维护及持久化顺序,避免常见陷阱。掌握核心技巧,提升数据操作可靠性,值得收藏。

QuickProceed的博客 885

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JPA之级联关系@OneToMany 和 @ManyToMany

JPA之级联关系@OneToMany 和 @ManyToMany 1. 双向@OneToMany @Entity @Table(name = "TEACHER") public class Teacher { @Id @GenericGenerator(name = "jpa-uuid", strategy = "uuid") @GeneratedValue(genera...

XSemperFI的博客 744

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

级联保存失效?深入剖析JPA @ManyToMany映射底层机制与正确用法

解决JPA的@ManyToMany级联保存失效难题,深入解析双向映射与中间表机制,涵盖实体管理、级联策略配置及保存顺序优化。掌握正确用法避免数据丢失,提升持久化效率,值得收藏。

StepLens的博客 849

【JPA @ManyToMany级联保存全解析】:彻底搞懂双向关联持久化陷阱与最佳实践

掌握JPA的@ManyToMany级联保存核心技巧,解决双向关联持久化失败与数据不一致问题。涵盖实体映射配置、级联策略选择及性能优化要点,避免常见陷阱。适用于权限管理、标签分类等场景,提升开发效率与数据完整性,值得收藏。

CodeNexus的博客 845

JPA中@ManyToMany级联保存的5大坑,90%开发者都踩过(附解决方案)

解决JPA的@ManyToMany级联保存难题,避开常见陷阱。涵盖双向映射、级联策略、集合初始化等5大坑点,结合实际场景讲解正确用法与性能优化技巧。掌握核心解决方案,提升数据持久化稳定性,值得收藏。

DeepLens的博客 975

(JPA级联保存终极方案):解决@ManyToMany新增、更新、删除同步难题

轻松解决JPA的@ManyToMany级联保存难题,涵盖新增、更新与删除操作的同步处理。通过双向映射与集合管理实现数据一致性,适用于权限角色、标签关联等场景。核心方法清晰可靠,值得收藏。

PixelGlow的博客 643

【高级开发必看】JPA中@ManyToMany级联删除的四个关键步骤,少一步都不行

掌握JPA @ManyToMany 的级联删除,解决多对多关系中的数据清理难题。通过实体映射、中间表配置、级联属性设置与事务管理四步实现全自动删除。适用于权限、标签等场景,避免脏数据,提升系统稳定性。值得收藏

ProcePerch的博客 366

【高级JPA技巧】:在@ManyToMany中实现安全级联删除的3种权威方案

掌握JPA @ManyToMany 的级联删除难题,本文提供三种安全高效的解决方案。涵盖双向映射、中间实体优化与手动清理策略,避免数据残留与性能瓶颈。适用于复杂业务场景,确保数据一致性,值得收藏。

FastSolve的博客 1045

【Spring Data JPA性能优化】:@ManyToMany级联删除背后的外键约束与性能影响

掌握JPA @ManyToMany的级联删除机制,解决多对多关系删除性能瓶颈。详解外键约束影响、适用场景及通过中间表优化的实战方法,提升数据操作效率与系统稳定性,值得收藏。

Algorift的博客 873

SpringBoot + JPA @ManyToMany 操作要点

这里写自定义目录标题SpringBoot + JPA @ManyToMany 要点对应的Entity的建立。此处注意不可使用lombok @Data 注解。使用@Setter 、@Getter注解。主要原因时要自己覆写hash() equals(),toString() 方法。这样添加和删除的时候不会出现异常。否则出现循环的引用,不能删除或stackOver;Junit的测试 注意@transac...

leohorry的博客 6181

【Spring Data JPA性能优化秘籍】:解决@ManyToMany级联删除的三大核心策略

掌握JPA @ManyToMany 的级联删除难题,本文提供三大高效解决策略。适用于双向关联、中间表管理等场景,涵盖手动清理、JPQL批量删除与事件监听机制,提升性能与数据一致性。实用方案值得收藏

QuickCode的博客 352

【JPA @ManyToMany级联删除深度解析】:彻底搞懂双向映射中的删除陷阱与最佳实践

深入解析JPA @ManyToMany的级联删除机制,解决双向映射中的数据残留与外键冲突问题。涵盖实际应用场景、正确配置CascadeType的方法及避免持久化异常的关键技巧,助你掌握多对多关系处理的最佳实践,值得收藏。

LogicGap的博客 777

Springboot JPA级联操作

自从接触了JPA,就对立面的级联操作很费解,特此做一下学习。JPA提供的Entity级联可以建立一对一、一对多、多对多的关系,覆盖查询、保存、刷新、删除等操作。 (1)一对一,@OneToOne TUser与TGender成一对一关系 @Entity @Data @Table(name = "user",schema = "hr") @JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"}) @Js

zhong_bao的博客 1343

JPA @ManyToMany级联删除避坑指南(90%开发者都犯过的错误)

掌握JPA @ManyToMany的级联删除正确用法,避免数据不一致陷阱。详解双向关联、级联策略选择与中间表处理技巧,适用于权限管理、标签分类等场景。理解remove与orphanRemoval机制,确保数据库完整性。避坑指南值得收藏。

BreakNexus的博客 277
上一篇: 揭秘Java 20模式匹配for循环:为何它将改变你的编码方式?
下一篇: 彻底搞懂HashSet add返回值(从面试题到生产级代码优化)
varchat
博客等级 码龄11年 159粉丝 1993原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值