ManyToMany关联映射

实战:利用 Agent Harness 自动化 PPT 制作 本文将带你从零开始,用轻量级Agent编排框架,结合主流大模型(GPT-4o、通义千问、文心一言等),搭建一套全自动化的PPT生成工作流:从用户输入自然语言需求,到需求解析、大纲生成、内容填充、数据匹配、排版美化、导出成品,全程不需要手动操作,最快10分钟就能产出符合要求的PPT。我们不会讲晦涩的Agent理论,所有步骤都有可直接运行的代码示例,哪怕你只有基础的Python语法基础,也能跟着一步步做出能用的自动PPT工具。 阅读详情
以下是两个实体类:用户类User和角色类Role,它们之间是多对多的关系。
//用户表
@Entity
@Table(name
="rong_user")
public class User{

    
//省略其它内容

    
private Set<Role> roles = new LinkedHashSet<Role>();    //角色集合
    
    @ManyToMany(cascade 
= {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name 
= "rong_user_role", joinColumns = { @JoinColumn(name ="user_id" )}, inverseJoinColumns = { @JoinColumn(name = "role_id") })
    @OrderBy(
"id")
    
public Set<Role> getRoles() {
        
return roles;
    }

    
public void setRoles(Set<Role> roles) {
        
this.roles = roles;
    }

}

//角色表
@Entity
@Table(name
="rong_role")
public class Role{
    
    
//省略其它内容

    
private Set<User> user = new LinkedHashSet<User>();        //用户集合

    @ManyToMany(cascade 
= {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "roles", fetch = FetchType.LAZY)
    
public Set<User> getUser() {
        
return user;
    }

    
public void setUser(Set<User> user) {
        
this.user = user;
    }

}


         这两个生成数据库中的三个表,分别是rong_user, rong_role和一个中间表rong_user_role。
         Hibernate和JPA控制关联关系的,只能是一方,不能双方控制的,上面的程序中,我通过在Role类中设置mappedBy="roles"来设置由User来控制关系,
         这样,问题就出现了:当我在要删除角色Role时,如果没有用户拥有这个角色的话,就能成功删除;如果有用户拥有这个角色的时候,就不能删除,会抛以下异常:

12:53:33,125  WARN JDBCExceptionReporter:100 - SQL Error: 1451, SQLState: 23000
12:53:33,125 ERROR JDBCExceptionReporter:101 - Cannot delete or update a parent row: a foreign key constraint fails (`newsms/rong_user_role`, CONSTRAINT `FKF1698421A337A5FA` FOREIGN KEY (`role_id`) REFERENCES `rong_role` (`id`))
12:53:33,171 ERROR AbstractFlushingEventListener:324 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
/****堆栈信息略****/
Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`newsms/rong_user_role`, CONSTRAINT `FKF1698421A337A5FA` FOREIGN KEY (`role_id`) REFERENCES `rong_role` (`id`))
/******堆栈信息略*****/

      当我设置成单向关系映射时,即把Role类中,Set<User>信息去掉,这样,也不能删,原因也是说有外键约束!怎么办?
      苦恼了好几天,最后,只能归于Hibernate(JPA)的多对多关联映射设计得有点不符实际!就像上面我说的例子,有人选了某角色,就不能删掉该角色。还有一种做法是,在Role类中:
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE,CascadeType.REMOVE}, mappedBy = "roles", fetch = FetchType.LAZY)
    
public Set<User> getUser() {
        
return user;
    }
        即加多一个“CascadeType.REMOVE”,这样能把角色Role给删掉了,但连拥有该角色的所有用户User也被级联删掉了。这样来看,某个用户拥有许多角色,就因为其中有这一个角色,就被级联删了整个自己,那不是很冤枉。这也不符合实际!

        个人认为,Hibernate(JPA)在设置多对多关联映射时,应该有做法能使得双方都能控制关联关系才好,才符合实际吧!但事实上,好像还没有发现有Hibernate(JPA)这种能力!

   上面问题的解决办法:

1.     在delete之前,打破这种关联关系,可以设定关系为null,用role.setUser(null);

2.     把cascade=CascadeType.ALL改为cascade={CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},即去掉REMOVE

3.     使用s.createQuery("delete from Role r where r.id=1");


YooAsset 学习 YooAssets使用教程 阅读详情

相关推荐

项目方案:社会视频资源整合接入汇聚系统解决方案(五)

视频监控接入和视频汇聚平台,形成整合平台,平台服务层包括编码设备、存储设备、解码设备等的接入服务,提供基础视频服务、传输服务、存储服务、控制服务及事件服务。两种不同的接入方式:监控设备接入,是指接入社会单位视频监控系统的DVR(数字硬盘录像机)、DVS和IPC、DVR/NVR、CVR等设备;平台对接,是指对接接入社会单位数字视频监控平台。AS-VAG视频监控接入网关支持onvif、国标等接入,也支持多种SDK接入方式,包括国产的主流品牌支持海康、大华、宇视、华为等SDK,国际品牌支持松下和axis等SDK。

weixin_70208651的博客 2464

Hibernate基础之十:一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))

一:Group和Users两个类 假定一个组里有n多用户,但是一个用户只对应一个用户组。 1.所以Group对于Users是“一对多”的关联关系@OneToMany Users对于Group是“多对一”@ManyToOne 2.CRUD时候,希望是能从具体用户Users查到其对应的Group,反过来也能通过Group查到具体Users,所以是双向关联 (所以要用mappedBy去...

thewebcode 516

CH455G数码管驱动与键盘扫描:I2C通信协议深度解析与实战代码

本文深度解析CH455G芯片的I2C通信协议,涵盖数码管驱动与键盘扫描功能的实战应用。通过详细讲解起始/停止信号、数据帧结构、应答机制及单片机代码实现,帮助开发者高效利用该芯片减少IO占用,提升嵌入式系统设计效率。

tea88的博客 1085

hibernate 配置@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY) 主导方问题删除问题。

hibernate 配置@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)  ?? 多对一的关系 ,关系有一个主导方。主导方应该是one的一方。right?   我突然想到 实体关联是有一个   主导方的对不对。然后 CascadeType.ALL 的设置是相对于主导方而言的,是不是 必然 删除功能,如果主导方删除了,那

dingxingmei的专栏 9464

电路课设-音响分频器电路设计

(一)题目简介 1.一阶分频器电路设计 假定高音和低音扬声器均等效为 16 欧姆电阻,设计如图 2 的简单分频器电 路,要求高低频分界(两个滤波器的截止频率)为 5kHz。 1) 写出高音扬声器和低音扬声器电压对于 vs 的传递函数,确定电路中电 容 C 和电感 L 的元件值;2)利用 AC 频率扫描分析求出两个扬声器电压的频率响应曲线,验证计算 结果。用包含高低频成分的电压 vs 激励进行测量验证。 3)计算并利用 EWB 仿真证明从 vs 看进去的阻抗为一常数 16 欧姆。

weixin_53507617的博客 1万+

【GameFramework框架】二、GameFramework框架介绍

Game Framework框架是由E大(Ellan Jiang)开源的一款基于Unity的通用游戏框架。Game Framework框架提供了游戏开发中常用的框架基础模块,将基础模型进行了封装,在资源管理和资源更新方面比较完善,可以大大加大开发进程,加快开发速度,并且还在在此此处上保证产品质量。实在是代码开发、框架学习、编程进阶、居家旅行哦不对,是提升自己的最佳实践。Game Framework框架。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5849

JPA中常用注解解释

在该四个注解中,都含有属性可设置,以下举例两个属性。 fetch=FetchType.LAZY为默认的数据延迟加载,fetch=FetchType.EAGER为急加载。 cascade={CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REFRESH,CascadeType.REMOVE}. 其中: CascadeType.PERSIS...

lixuanfeng blog 2624

【华为OD机试真题E卷】300、 出租车计费 、靠谱的车 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

题目描述 >程序员小明打了一辆出租车去上班,出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大,出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常 >  比如: 1、23再多一块钱就变为25; 2、39再多一块钱变为50; 3、399再多一块钱变为500; >  小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋,给出计费表的表面读数,返回实际产生的费用

KJ.JK 4万+

cascade中CascadeType枚举

@ManyToOne( cascade=CascadeType.ALL,fetch = FetchType.EAGER) @JoinColumn(name = "orderId" ) private OrderDetail orderDetail; 注意:慎用All 因为会级联删除 一般情况下设为MERGE 即可 cascade的作用 给当前设置的实体操作另一个实体的权限 packa...

fwk19840301的博客 1357

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

Robot_PLC_HMI_Automation 1万+

Python实战项目2:b站评论采集

本文不对数据采集的过程做探讨,直接上代码。

lyccomcn的博客 3199

manyToMany,设置了“CascadeType.PERSIST”,无法级联存储

学生、课程,多对多的关系,学生是关系维护端。 我在学生类里的课程集合上设置了CascadeType.PERSIST,但存储学生对象时无法自动存储级联的课程对象, 除非将CascadeType.PERSIST改成CascadeType.ALL,但ALL里面包含了REMOVE操作,我又不想要这个REMOVE操作。 (我舍去注解的形式采用hbm配置文件重新配置了一遍,在Student.hbm.

cx136295988的博客 6075

PCL 最小生成树用于法向量定向【2025最新版】

PCL 最小代价生成树用于点云法向量的定向。博客长期更新,本文最近更新时间为:2025年9月15日。

点云侠的博客 2068

SpringBoot整合SpringDataJPA技术,关联映射的操作,一对多,多对多关联映射,OneToMany,ManyToMany

一对多的关联关系 角色与用户的一对多的关系 角色:一方 用户:多方 创建实体类 package com.ljw.pojo; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Genera...

黑科技的专栏 560

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Hibernate4关联映射基础-生成的表结构

Hibernate关联映射是Hibernate中比较难用好知识点, 一方面两个实体之间的关系类型比较多, 有单向映射、双向映射; 还有ManyToOne, OneToOne, OneToMany, ManyToMany, 这样算下来会有2*4=8种, 通过不同逻辑映射产生的物理表也比较多, 当然其中一部分是类似的; 复杂的另一方面体现在对关联实体的操作可能对被关联实体产生的影响上面, 包括级联属性...

Think and Sun 210

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Jpa中ManyToMany和OneToMany的双向控制

Jpa中ManyToMany和OneToMany的双向控制 下面我们使用权限管理中Role&lt;-&gt;Account(用户ManyToMany账号)、Role&lt;-&gt;Domain(用户OneToMany权限域)的关系来举例。    1、ManyToMany Account表 在两个表的对应属性上添加JoinColumns和inverseJoinColumns...

zxiang248的专栏 750

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Hibernate多表关联及Hql查询

•ManyToOne 多对一关联(单向或双向) •OneToOne 一对一关联(单向或双向) •OneToMany 一对多关联(单向或双向) •ManyToMany 多对多关联(单向或双向) @ManyToOne(fetch=FetchType,cascade=CascadeType ) 可选 •@ManyToOne 表示一个多对一的映射 , 该注解标注的属性通常...

marvin 1918

多对多的一种写法(@ManyToMany)

[b]主控方[/b] [code="java"] @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER) @JoinTable(name="user_role", joinColumns={@JoinColumn(name="user_id")...

kerry-to-java 259

SpringData JPA多表关联操作

目录1 关联映射操作1.1 多表之间的关系和操作多表的操作步骤1.1.1 @OneToMany:1.1.2 @ManyToOne1.1.3 @JoinColumn1.2 一对多的关联关系1.3 多对多的关联关系1.3.1 @ManyToMany1.3.2 @JoinTable1.3.3 @JoinColumn2 对象导航查询3 Specification的多表联合查询 1 关联映射操作 1.1 多表之间的关系和操作多表的操作步骤 1.1.1 @OneToMany: 作用:建立一对多的关系映射 属性: t

赵广陆 5706

SpringBoot——》关联映射

以员工、地址、部门、角色四者之间的关联关系为例:在员工表中会有一个指向地址表主键的字段address_id 实现二:@PrimaryKeyJoinColumn 如果员工表和地址表是以主键关联的: 实现三:不使用@JoinColumn和@PrimaryKeyJoinColumn Hibernate会自动在员工表生成关联字段,字段默认的命名规则:被控方类名_被控方主键,如:address_id 2、@OneToMany(一对多) 实现一:@JoinColumn 实现二:@JoinTable 实现三:不使用

小仙~ 1375

类图和ORM关系(三)

3         关联映射3.1    单向ManyToOne关联这是实体间最基本、最重要的关联,在数据库表间建立外键关系。理论上可以只使用ManyToOne关联而不用其他关联来实现整个应用;另一方向的关联可以通过查询(query)实现。Employee类和Company类是ManyToOne的关系,例子如下:@Entitypublic class Company1 ..

1489

hibernate之关于关联映射的综合应用

1、关联映射如何处理业务逻辑 2、如何指定中间表 3、如何进行级联操作 4、如何解决Hibenrate建表过程中主键错乱问题 现在有三张表 Student(学生表),Course(课程表),Score(学生,课程,分数,表) 那么我们分析业务逻辑可知,学生和课程是多对多的关系,学生和分数表是一对多的关系,课程和分数也是一对多的关系。 直接看A...

weixin_33768481的博客 60

Hibernate Annotation 笔记

Hibernation 默认值 字段(没有尝试过) @Column(columnDefinition = "tinyint default 0") 在 类 上加 @org.hibernate.annotations.Entity(dynamicUpdate=true,dynamicInsert=true) 会自动判断哪些值为空不再插入,更新语句中 Hibernate 关联映...

stars60的专栏 97

Hibernate -- 注解(Annotation)关系映射

Hibernate Annotation关系映射有下面几种类型: 1)一对一外键关联映射(单向) @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="userid",unique=true)     一对一外键关联,使用@OneToOne,并设置了级联操作。@JoinColum设置了外键的名称为userid(数据库字段名),如果不设

liuyan_happy的专栏 426

Mybatis使用

Mybatis 1、框架介绍 mybatis是一款半自动的ORM持久层框架,具有较高的SQl灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性。 什么是ORM: Object Relation Mapping,对象关系映射。对象指的是java对象,关系指的是数据库的关系模型,对象关系映射指的是在java对象和数据库的关系模型之间建立一种对立关系,比如用一个java的Student类,去对应数据库中的一张student表,类中的属性和表中的列一一对应。Student类就对应stude

九离的博客 873

3 OneToMany ManyToMany MappedBy Cascade

1 双向1-N关联 对于1-N关联,Hibernate推荐使用双向关联,而且不要让1的一方控制关联关系,而使用多的一方控制关联关系。 a. 一的一方 表示班级 @Entity @Table(name="team_1") public class Team { @Id @Gen...

chunhuo3827的博客 134
上一篇: Hibernate的3种继承关系
下一篇: Hibernate常见错误合集
randomnet
博客等级 码龄19年 59粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值