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

第一章:JPA @ManyToMany级联保存的核心概念

在JPA(Java Persistence API)中,@ManyToMany注解用于映射两个实体之间的多对多关系。这种关系通常通过一个中间关联表来实现,该表包含两个外键,分别指向两个相关实体的主键。理解如何正确配置和使用级联保存(Cascade Persist)是确保数据一致性与简化持久化操作的关键。

关系建模的基本结构

在多对多关系中,必须明确指定拥有方(owning side),通常是在其中一方配置@JoinTable。例如,用户(User)和角色(Role)之间存在多对多关系:
@Entity
public class User {
    @Id
    private Long id;
    
    @ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
        name = "user_role",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private Set<Role> roles = new HashSet<>();
    // getter and setter
}
上述代码中,CascadeType.PERSIST表示当保存用户时,其所关联的角色也会被自动保存。

级联操作的行为说明

JPA支持多种级联类型,常见包括:
  • CascadeType.PERSIST:保存主实体时级联保存关联实体
  • CascadeType.MERGE:合并主实体时同步更新关联实体
  • CascadeType.ALL:包含所有级联操作

双向关系中的注意事项

为避免持久化异常,需在业务逻辑中同步维护双方引用。例如:
User user = new User(1L);
Role admin = new Role(1L);

// 正确做法:双向绑定
user.getRoles().add(admin);
admin.getUsers().add(user); // 若存在反向关系

entityManager.persist(user); // 级联保存 role
级联类型触发操作适用场景
PERSIST保存新实体创建用户同时创建角色
MERGE更新实体状态修改用户角色集合

第二章:双向关联的理论基础与常见陷阱

2.1 双向@ManyToMany的映射原理与ORM机制

在JPA中,双向@ManyToMany关系通过中间关联表维护两个实体间的多对多映射。该机制依赖于外键在连接表中的双向引用,实现数据的联动查询与管理。
映射结构解析
双向@ManyToMany需在双方实体中声明关系字段,并指定mappedBy属性以避免重复插入:
@Entity
public class Student {
    @Id private Long id;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id"))
    private Set courses = new HashSet<>();
}

@Entity
public class Course {
    @Id private Long id;
    @ManyToMany(mappedBy = "courses")
    private Set students = new HashSet<>();
}
上述代码中,Student为关系拥有方,负责维护student_course表;Course通过mappedBy指向对方,实现反向导航。
数据同步机制
当保存Student实例时,ORM框架自动同步中间表记录。若未正确维护双方集合引用,将导致脏读或外键约束异常。

2.2 级联操作中持久化顺序引发的数据不一致问题

在级联操作中,若父实体与子实体的持久化顺序未严格遵循依赖关系,可能导致数据不一致。例如,先持久化子实体而外键约束尚未建立,数据库将抛出完整性异常。
典型场景分析
考虑订单(Order)与其明细项(OrderItem)的级联保存。若框架先插入 OrderItem 而此时 Order 主键未生成,则外键字段为空,违反约束。

entityManager.persist(order);     // 必须先持久化父实体
for (OrderItem item : items) {
    item.setOrder(order);         // 建立引用
    entityManager.persist(item);  // 再持久化子实体
}
上述代码确保了 Order 主键生成后才赋值给 OrderItem,维护了数据一致性。
解决方案对比
策略优点缺点
手动控制顺序精确可控开发负担重
ORM 自动排序透明化处理依赖框架实现质量

2.3 中间表外键约束与唯一索引导致的保存失败

在多对多关系管理中,中间表常用于关联两个实体。若未合理设计外键约束与索引,极易引发数据保存失败。
外键约束的作用
外键确保关联记录在主表中存在,防止出现孤立引用。例如,在用户-角色中间表中,必须确保 user_id 和 role_id 均存在于对应表中。
唯一索引的必要性
为避免重复关联,通常在中间表上建立复合唯一索引:
CREATE TABLE user_role (
  user_id BIGINT NOT NULL,
  role_id BIGINT NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id),
  FOREIGN KEY (role_id) REFERENCES roles(id),
  UNIQUE KEY unique_user_role (user_id, role_id)
);
该语句创建了外键约束,并通过 UNIQUE KEY 防止同一用户被重复赋予相同角色。若应用层未捕获唯一索引冲突(如重复插入),将导致 IntegrityError。
常见错误场景
  • 批量插入时未去重
  • 并发请求下同时添加相同关联
  • 外键引用不存在的主键值

2.4 会话上下文管理不当引起的脏数据与重复插入

在分布式系统中,若会话上下文未正确隔离或清理,可能导致多个请求共享同一上下文实例,从而引发脏数据写入或重复插入问题。
典型场景分析
当使用长生命周期的上下文对象(如Go中的*gin.Context)跨协程传递时,若未深拷贝或并发控制,易导致数据混淆。例如:

func handler(ctx *gin.Context) {
    go func() {
        // 错误:直接在goroutine中使用原始ctx
        userId := ctx.GetString("user_id")
        db.InsertLog(userId) // 可能读取到其他请求的user_id
    }()
}
上述代码中,ctx被多个协程共享,由于中间件可能动态修改其值,最终插入的日志可能属于错误用户。
解决方案
  • 避免在异步任务中直接使用原始上下文
  • 提取必要参数并传递副本
  • 使用context.WithValue创建只读子上下文

2.5 mappedBy属性误用导致的双向关系失效分析

在JPA中,mappedBy用于配置双向关联关系中的被控方。若使用不当,将导致数据持久化异常或级联操作失效。
常见误用场景
  • 在非拥有方错误地添加@JoinColumn
  • 双向一对多关系中,子实体错误声明mappedBy
正确用法示例

@Entity
public class Department {
    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
    private List<Employee> employees;
}

@Entity
public class Employee {
    @ManyToOne
    @JoinColumn(name = "dept_id")
    private Department department;
}
上述代码中,mappedBy = "department"指明Department通过Employee.department字段维护关系。数据库外键位于Employee表的dept_id列,确保关系一致性。若在Department侧同时定义@JoinColumn,将引发元数据冲突,导致双向同步失败。

第三章:实体设计与注解配置实践

3.1 正确使用@ManyToMany与cascade属性组合

在JPA中,@ManyToMany用于映射两个实体间的多对多关系,常配合cascade属性控制级联操作。合理配置可避免数据不一致。
级联策略选择
cascade常见取值包括PERSIST、MERGE、REMOVE等。若设置CascadeType.ALL,需谨慎,防止误删关联数据。
@Entity
public class Student {
    @Id private Long id;
    
    @ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id"))
    private Set courses = new HashSet<>();
}
上述代码仅级联持久化操作。当保存Student时,其关联的Course也会被保存,但删除或更新不会自动传播,提升了数据安全性。
双向关系管理
维护双向关联时,应在业务逻辑中同步双方集合,避免因未更新拥有方而导致外键为空。

3.2 owner方与inverse方的角色定义与责任划分

在双向关联关系中,owner方(拥有方)负责维护关系的持久化操作,而inverse方(反向方)仅用于数据读取和导航,不参与外键更新。
角色职责对比
  • Owner方:控制数据库外键值的变更,执行INSERT、UPDATE操作时同步关系状态
  • Inverse方:通过mappedBy声明依附于owner方,其修改不会影响数据库外键
典型代码示例

@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private List<Order> orders; // inverse方,由Order中的customer字段维护关系

@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer; // owner方
上述代码中,Order.customer 是owner方,负责将外键写入数据库;Customer.orders 是inverse方,仅提供查询路径。若仅在inverse方添加对象而不更新owner方,JPA将忽略该操作,导致数据不同步。

3.3 使用Set集合避免重复元素的最佳实现方式

在处理数据去重时,Set 集合是高效且直观的选择。其内部通过哈希机制确保元素唯一性,插入和查找时间复杂度接近 O(1)。
基于哈希的去重实现
func removeDuplicates(elements []int) []int {
    seen := make(map[int]struct{}) // 使用空结构体节省内存
    result := []int{}
    
    for _, v := range elements {
        if _, exists := seen[v]; !exists {
            seen[v] = struct{}{}
            result = append(result, v)
        }
    }
    return result
}
上述代码利用 map 模拟 Set 行为,struct{} 不占内存空间,适合仅作键存在的场景。遍历原切片时检查元素是否已存在,未存在则加入结果集。
性能对比
方法时间复杂度空间开销
map 模拟 SetO(n)低
排序后去重O(n log n)中

第四章:典型场景下的级联保存解决方案

4.1 新增主实体时同步保存关联对象列表

在持久化主实体的同时,常需同步保存其关联的子对象列表,以保证数据一致性。现代ORM框架如GORM提供了嵌套保存能力,简化了操作流程。
级联保存配置
通过启用级联操作,可在保存主实体时自动处理关联集合:

type Order struct {
  ID         uint
  OrderNum   string
  Items      []OrderItem `gorm:"foreignKey:OrderID;constraint:OnDelete:CASCADE"`
}

type OrderItem struct {
  ID       uint
  OrderID  uint
  Product  string
  Quantity int
}
上述结构体中,Items字段通过gorm标签声明外键和级联删除策略,插入Order时设置db.Create(&order)将自动保存所有子项。
事务性保障
该操作默认在单个事务中执行,任一子记录失败将回滚整个操作,确保数据完整性。开发者需确保关联对象的外键关系正确映射,并合理使用索引提升写入性能。

4.2 更新已有实体并维护多对多关系的完整性

在现代ORM框架中,更新已有实体的同时维护多对多关系的完整性是一项常见但易错的操作。必须确保关联数据在更新过程中不产生孤立记录或重复关联。
关联数据的同步策略
更新实体时,需明确是替换整个关系集合还是进行增量修改。多数ORM提供`save`、`sync`或`attach/detach`方法来控制行为。

// 示例:GORM 中同步用户与角色的多对多关系
func UpdateUserRoles(userID uint, roleIDs []uint) error {
    var user User
    if err := db.First(&user, userID).Error; err != nil {
        return err
    }
    // Sync 方法自动处理新增、保留和删除的关联
    return db.Model(&user).Association("Roles").Replace(roleIDs)
}
上述代码中,`Replace`会删除不再存在的关联,并插入新的关联,确保数据库一致性。参数`roleIDs`为目标角色ID列表。
事务保障数据一致性
此类操作应置于事务中执行,避免部分更新导致的数据不一致问题。

4.3 清除和重建关联关系的安全操作模式

在处理数据库或对象间的关联关系时,直接删除并重建可能引发数据不一致。为确保操作安全,应采用事务性流程控制。
操作步骤分解
  1. 开启事务,锁定相关资源
  2. 标记旧关联为待清除状态(可选软删除)
  3. 建立新关联,验证完整性
  4. 提交事务,触发异步清理任务
代码示例:Go 中的事务化处理
tx := db.Begin()
if err := tx.Model(&user).Association("Roles").Clear(); err != nil {
    tx.Rollback()
    return err
}
if err := tx.Model(&user).Association("Roles").Append(roles); err != nil {
    tx.Rollback()
    return err
}
tx.Commit()
上述代码通过 GORM 实现角色关联的清除与重建。Clear() 删除旧关联但不删除角色数据,Append() 加入新角色。整个过程在事务中执行,确保原子性。若任一步失败,回滚避免脏数据。

4.4 批量保存场景下的性能优化与事务控制

在处理大量数据的批量保存操作时,若逐条提交事务,会导致频繁的数据库交互,显著降低系统吞吐量。为提升性能,应采用批量提交与事务分块策略。
使用批次提交减少事务开销
通过将数据分批提交,可有效减少事务上下文切换和日志刷盘次数。例如,在 GORM 中结合原生 SQL 进行批量插入:

db.CreateInBatches(&users, 100) // 每100条记录提交一次
该方法将用户切片按批次提交至数据库,避免单条插入带来的连接往返延迟,显著提升写入效率。
事务粒度控制
过大的事务会增加锁竞争和回滚代价。建议将大批量操作拆分为多个小事务处理:
  • 每批次处理 500~1000 条记录
  • 捕获批次级异常并进行局部重试
  • 结合数据库特性启用批量插入语法(如 MySQL 的 INSERT INTO ... VALUES ..., ..., ...)

第五章:总结与最佳实践建议

实施持续监控与自动化告警
在生产环境中,系统稳定性依赖于实时可观测性。建议结合 Prometheus 与 Grafana 构建监控体系,并配置关键指标的自动告警规则。
  • 监控 CPU、内存、磁盘 I/O 及网络延迟
  • 设置基于百分位的响应时间阈值(如 P99 > 500ms 触发告警)
  • 使用 Alertmanager 实现分级通知(邮件、Slack、短信)
代码层面的性能优化示例
以下 Go 代码展示了如何通过连接池复用数据库连接,避免频繁建立开销:

db, err := sql.Open("mysql", dsn)
if err != nil {
    log.Fatal(err)
}
// 设置最大空闲连接数
db.SetMaxIdleConns(10)
// 限制最大打开连接数
db.SetMaxOpenConns(100)
// 设置连接生命周期
db.SetConnMaxLifetime(time.Hour)
微服务部署资源配置建议
合理分配资源可避免节点过载或资源浪费。参考以下 Kubernetes Pod 资源配置:
服务类型请求内存限制内存请求CPU限制CPU
API 网关256Mi512Mi200m500m
订单处理服务512Mi1Gi300m800m
安全加固关键措施

实施最小权限原则:所有服务账户应仅拥有必要权限。例如,在 AWS IAM 中,禁止使用 AdministratorAccess 策略,转而采用自定义策略限定 S3 存储桶访问范围。

从“Segmentation fault”到流畅运行:深入解析CARLA Engine crash与Signal 11报错排查指南 本文深入解析了CARLA仿真平台运行时遭遇的Engine crash与Signal 11(Segmentation fault)报错。文章指出,该错误的根本原因常与NVIDIA显卡驱动版本不兼容有关,并提供了从日志分析、常见方案试错到驱动安全降级的完整排查指南,帮助用户从崩溃走向流畅运行。 阅读详情

相关推荐

光电容积脉搏波PPG信号分析笔记

脉搏波信号PPG分析笔记

teresa_zp的专栏 6477

Spring JPA Ⅹ 联表查询 之 ManyToMany

我们还是以上面用户和房子为例(博主是多想要一套房子啊),毕竟一个用户可以拥有多套房子,而一套房子也可以写多个人的名字。实例运行之后,会在数据库中生成一个中间表(user_house),这个表就是用来维护用户和房子映射关系的。如果不添加的话,系统会再生成一个中间表(house_user),这样一来,这里的 @JsonIgone 的注解就是为了解决堆栈溢出的问题。多对多的情况下不能级联删除也能理解,毕竟不是一个人能说了算的。信息的时候会依赖中间表(house_user),导致。houseControl 类。

BASK2312的博客 677

手机Camera硬件电路设计:从电源管理到信号完整性的实战解析

本文深入解析了手机Camera硬件电路设计的核心挑战与实战经验,重点聚焦于电源管理与信号完整性两大基石。文章详细阐述了AVDD、DVDD、IOVDD和AFVDD四路电源的差异化设计要点与噪声控制策略,并剖析了MIPI等高速信号通道的完整性设计原则,为硬件工程师提供了从理论到PCB布局布线的完整实战指南。

weixin_28308325的博客 249

介绍JPA的Many-To-Many 关系

介绍JPA的Many-To-Many 关系 本文我们讨论JPA中多种方式处理多对多关系。 为了方便阐述,使用大家熟悉的场景,学生、课程以及两者之间不同的关系。同时示例代码也不用过多的属性,仅展示核心的配置。 1. 多对多基础 1.1. 数据库建模 关系是两个类型实体之间的连接。在多对多情况下,两边都能关联多个实例。 注意,实体类型可能与其自身存在关系。例如当建模家谱时,每个节点都是一个人实例,如果...

neweastsun的专栏 6580

避坑指南:Unity与Visual Studio开发环境配置中的5个常见问题及解决方案

本文针对Unity与Visual Studio开发环境配置中的5个常见问题,提供了详细的解决方案。重点解决了项目文件生成失败导致命名空间无法识别、调试器无法附加、包管理器与扩展安装混乱、脚本编译错误以及多版本环境冲突等核心痛点,帮助开发者构建稳定高效的开发调试环境。

weixin_27791839的博客 280

DeepSeek提示词实战:从零到百的AI角色扮演指南(附100+场景模板)

本文提供了一份详尽的DeepSeek提示词实战指南,重点讲解AI角色扮演的核心技巧。通过“角色扮演四要素法”和五大核心场景模板,帮助用户从零开始掌握如何设计高质量提示词,有效提升AI输出的深度与精度,并附赠100+实用场景模板供参考。

weixin_29305337的博客 579

JPA中的manytomany

概念说明 一个雇员(employee)可以有多个项目(project),一个项目也可以都有个雇员。这种关系就是多对多的关系,需要建立中间表(emp_proj)来维护两张表的关联关系。 EMPLOYEE (table) ID FIRSTNAME LASTNAME 1 Bob Way 2 Sarah Smith EMP_PROJ (t

程序员诚哥 7837

Django Cookie/Session

Cookie是一种小型的文本文件,通常由Web服务器发送到用户浏览器,并存储在用户的本地计算机上。当用户再次访问该网站时,浏览器会将Cookie发送回服务器,从而实现用户身份验证、个性化设置等功能。Session是一种在服务器端存储用户会话信息的方式。与Cookie不同,Session数据存储在服务器上,而不是客户端。Django框架通过在客户端存储一个Session ID来实现Session的跟踪。Django框架的Cookie/Session机制为开发者提供了方便的数据存储和会话管理功能。

froginwe11的博客 467

jpa级联操作详解1-级联保存(CascadeType.PERSIST)

不论是对于jpa或者是hibernate来说字段的数据库映射都不是难点,而是很多初学者都对jpa级联操作等一系列的东西不大明白,在这一系列的文章中我通过简单的java实体对象来与大家共同理解jpa(hibernate做实现产品)的级联操作等难点知识,希望能够共同提高。为了保证简单易懂,本系列文章避免光讲理论知识,而忽视实际动手,在下面的例子中都有简单易懂的例子,为了加深理解大家也可以在自己的机器上调

u013036792的专栏 1万+

人工智能数据治理——解读AI时代数据治理白皮书 2025【附全文阅读】

摘要:该白皮书面向企业数字化负责人及AI项目推进人员,探讨AI时代数据治理的战略升级。提出"好数据+好数据知识"双基石理念,强调数据需满足"三高"标准(高精度、一致性、时效性)并构建语义知识库。构建四层治理框架,包括数据采集处理、合规安全、知识库建设及质量改进,并介绍AI赋能治理的新范式,如智能ETL和治理Agent体系。同时分析"软件+AI+好数据"的应用模式,为企业实现智能数据治理提供实践指导。(149字)

cdfunlove的博客 633

从入门到精通:Cursor使用全攻略

Cursor是一款基于VSCode深度定制的AI编程工具,由Anysphere公司开发。它将AI技术与代码开发深度融合,能够理解自然语言指令并生成高质量代码,支持代码补全、跨文件上下文理解等功能。本文详细介绍了Cursor的安装设置、界面导航、基本操作和Composer模式等核心功能,并提供了高效提示词写作技巧和实际应用案例(如浏览器插件开发、复杂表单组件构建等)。文章还总结了使用注意事项和常见问题解决方案,展望了AI编程工具的发展前景。Cursor通过智能代码生成和项目理解能力,显著提升了开发效率,适合各

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 6457

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

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

LogicGap的博客 777

Python全栈入门到实战【基础篇 22】生成器与迭代器:底层逻辑与实战场景

Python迭代器与生成器:惰性求值的高效实践 摘要:本文深入解析Python中迭代器和生成器的核心机制与应用场景。迭代器通过实现__iter__()和__next__()方法实现惰性求值,适合处理大数据集和无限序列。生成器作为迭代器的简化实现,通过yield关键字自动实现迭代器协议,代码更简洁。文章详细对比了可迭代对象与迭代器的区别,演示了自定义迭代器和生成器函数的实现方式,并介绍了生成器表达式这一高效替代列表推导式的方案。通过斐波那契数列等实例,展示了惰性求值在内存优化方面的优势,以及生成器在流式数据处

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3261

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

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

StepLens的博客 849

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

DeepLens的博客 975

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JPA多对多关系处理秘籍:绕开外键约束、重复插入等8个高频问题

解决JPA多对多级联难题,深入解析@ManyToMany级联保存机制。涵盖双向映射、集合管理、外键冲突规避及重复插入预防等8大高频问题,适用于Spring Data JPA场景。掌握正确保存与更新策略,提升数据一致性与性能,值得收藏。

FastProceed的博客 881

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JPA注解实战指南:从实体声明到关联映射的避坑手册

在Java持久层开发中,ORM框架通过注解将数据库表与Java对象建立映射关系,其核心原理是基于反射与代理机制实现对象关系映射。正确使用JPA注解不仅能避免启动报错和查询异常,还能显著提升数据访问层的可维护性与性能。常见应用场景包括实体声明、字段映射、关联关系配置以及生命周期回调等。Spring Data JPA与Hibernate作为主流实现,对注解的解析策略和默认行为直接影响工程实践。深入理解@Entity、@Table、@Column及关联注解的配置逻辑与优先级,是构建稳定持久层的关键。

weixin_30399155的博客 601

Hibernate6.x详解

Hibernate 6.x 是基于 Jakarta EE 9+ 的新一代 ORM 框架,全面迁移至 jakarta.persistence.* 包名,引入统一的语义查询模型(SQM),实现 HQL 与 Criteria 的无缝融合。其核心优势在于类型安全 API、按列位置读取结果、原生支持 JSON/UUID/时区、以及对窗口函数和 CTE 的直接支持。通过一级缓存、二级缓存与优化的查询链路,在保持开发效率的同时显著提升性能。作为 JPA 的主流参考实现,它在复杂业务场景中仍具不可替代性。

幸运如你的博客 322

【简单易懂】JPA概念解析:CascadeType(各种级联操作)详解

https://www.jianshu.com/p/e8caafce5445 【在一切开始之前,我要先告诉大家:慎用级联关系,不要随便给all权限操作。应该根据业务需求选择所需的级联关系。否则可能酿成大祸。切记】 CascadeType.PERSIST 官方文档的说明:Cascade persist operation 看到网上很多博客对这一枚举值的解释是:级联持久化(保存)操作(持久保存拥...

weixin_33744854的博客 1780

(转)ManyToMany注解

@ManyToMany 注释:表示此类是多对多关系的一边,mappedBy 属性定义了此类为双向关系的维护端,注意:mappedBy 属性的值为此关系的另一端的属性名。 例如,在Student类中有如下方法: 被控方: @ManyToMany(fetch = FetchType.LAZY, mappedBy = "students") public Set<Teacher>...

u012102536的博客 1万+

JPA-CascadeType四个属性的讲解

CascadeType.PERSIST:级联新增(又称级联保存):对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法。 例子:只有A类新增时,会级联B对象新增。若B对象在数据库存在则抛异常 CascadeType.MERGE:级联合并(级联更新):若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityMana...

梁同学与Android 2549

JPA @ManytoMany注解使用

1. 两个实体类创建多对多的关系(如上图) 如果我们只需要维护中间表,也就是主键之间的关系,则不需要添加在属性中添加cascade = CascadeType.ALL.....(如果需要级联操作,也就是一个表的操作会影响到另一个表中的数据,而不仅仅是中间表中的数据,那就添加这个属性) 此时我们只需要任何一方保存时,里面创建对应的实体类的集合 2.里面的实体类中指定id即可,这样在数据库中就可以看到中间表中的数据 3.但是你添加的集合中实体类的id必须是存在的,也就是你添加了数据会自动生...

lym的博客 1650

JPA查询下@ManyToMany导致的N+1次query的问题

这里写自定义目录标题概述假设模型添加数据解决方案 概述 Spring Data Jpa底层默认使用Hibernate作为ORM框架, Hibernate有一个非常典型的N+1查询的问题。这个问题在有些场景下会非常影响系统稳定性。 下面是实际工作中遇到的问题,主要背景如下: 系统使用Hibernate对配置模型进行抽象建模,配置模型存储在MySQL数据库中; 系统每隔一段时间,会全量加载所有配置信息,刷新实例本地的内存配置,由于使用了@ManyToMany、@ManyToOne、@OneToMany等注解,

镜悬xhs 2645

Spring JPA 联表查询 之 注解属性

对于联表查询的四个注解@OneToOne@OneToMany@ManyToOne和,他们有几个用得比较多的属性需要了解一下。

Java技术攻略的博客 809

springboot jpa外键 (user role)双向多对多@ManyToMany(原创)

多个用户可能有多个角色,多个角色可能有多个用户。所以这种情况下就使用@ManyToMany进行关联 (jpa会自动生成中间表,java的entity代码中只需要User类和Role类,无需创建中间表user_role类(sql建表语句中可以手动创建该中间表,不手动创建jpa系统也会帮忙自动创建)) 注意: 不能用lombok的@EqualsAndHashCode和@ToString,否则死循环内存溢出 User表: package com.cmit.oag.backend.entity.comm

HD243608836的博客 1万+

JPA#ManyToMany

多对多,多个学生选了多个课程。 涉及到的注解(注解的使用看注释):ManyToManyJoinTableJsonIgnoreProperties @Entity @Table(name = "t_student") public class Student { @Id @GeneratedValue(strategy = Generatio...

weixin_30258901的博客 523
上一篇: 为什么你的文件读取慢10倍?可能是 BufferedInputStream 缓冲区用错了
下一篇: 【Java 10 var 的 lambda 参数使用指南】:掌握局部变量类型推断的隐藏技巧
普通网友
博客等级 码龄3年 606粉丝 2892原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值