Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Hibernate不能移除子级(MySQLIntegrityConstraintViolationException)

Hibernate不能移除子级(MySQLIntegrityConstraintViolationException)
EN

Stack Overflow用户
提问于 2016-02-10 04:37:19
回答 1查看 670关注 0票数 0

我有3个Java Hibernate实体。User具有与Filter实体的单向oneToMany表示。Filter实体与Model实体具有单向manyToOne关系。我只想删除Filter实体,但获取MySQLIntegrityConstraintViolationException

无法删除或更新父行:外键约束失败(gecars.users_filters、约束FK_oymjo03tkarckpfjfmaak99lj外键(filters_id)引用filters (id))

用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@Table(name="users")
public class User {
    ...
    //@OneToMany(fetch = FetchType.LAZY) // old
    @OneToMany(fetch = FetchType.LAZY,cascade=CascadeType.ALL) //edited but exception still occurs
    private Set<Filter> filters = new HashSet<Filter>(0);

过滤器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@Table(name="filters")
public class Filter {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_model") 
private Model model;
...

DAO类中的删除方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void deleteFilter(int filterId){
    String hql = "delete from Filter where id= :filterId";
    session.createQuery(hql).setInteger("filterId", filterId).executeUpdate();
}

session.delete

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void deleteFilter(int filterId){
    try {
        session.beginTransaction();
        session.delete(getFilter(filterId));
        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-10 05:36:12

您正在为一对多的关联使用联接表。我假设您已经从映射自动生成了模式,因此您可能不知道这一点。这样,当您通过大容量Hibernate DML语句删除Filter时,联接表中的记录将保持不变,并导致外键约束冲突。

最好的方法是在多个方面定义一个联接列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@Table(name="filters")
public class Filter {
  @ManyToOne
  @JoinColumn(name = "user") 
  private User user;
}

@Entity
@Table(name="users")
public class User {
  @OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.All, mappedBy="user")
  private Set<Filter> filters = new HashSet<Filter>(0);
}

如果不想使用双向关联,可以在User实体中定义联接列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@Table(name="users")
public class User {
  @OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.All)
  @JoinColumn(name = "user")       
  private Set<Filter> filters = new HashSet<Filter>(0);
}

这样,联接列仍然在filters表中,因此删除Filter不会导致外键冲突。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35315524

复制
相关文章
hibernate一级缓存
Hibernate 一级缓存默认是打开,不需要任何的配置。实际上,你无法强制禁止它的使用。 如果你理解了一级缓存实际上和会话是关联的,就很容易理解一级缓存。总所周知,会话是当我们需要时从会话工厂创建并且一旦会话关闭,缓存就会丢失。相似的,一级缓存与会话对象相关联,在会话存活期间是可用的。相同应用中的不同会话是无法相互访问的。
用户3148308
2018/09/13
9460
iOS开发小点·移除所有子视图
需求: 移除所有子视图 思路1 - OC的API [view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 思路2 - 循环 for(UIView *view in [self.view subviews]){ [view removefromsuperview] } 思路3 - 枚举 [[self.view subviews] enumerateObjectsUsingBlock:^(id _Nonn
陈满iOS
2018/10/26
1.5K0
Hibernate 一级缓存
Hibernate的一级缓存是指在同一个Session中,对于相同的查询操作,只执行一次数据库查询,并将结果缓存到内存中。在后续的相同查询操作中,直接从缓存中获取结果,而不再去执行数据库查询。
堕落飞鸟
2023/05/15
3930
Hibernate二级缓存
因为项目中经常出现,由于使用了hibernate生成的方法,会从二级缓存中拿取数据,导致数据不一致的问题,甚至导致出现脏数据的问题,所以总结以下hibernate的缓存机制。
全栈程序员站长
2022/08/31
5050
Hibernate二级缓存
Hibernate之一级缓存
文章目录 1. Hibernate之一级缓存 1.1. 什么是一级缓存 1.2. 为什么使用一级缓存 1.3. 如何使用一级缓存 1.4. 一级缓存的规则 1.5. 一级缓存管理 1.6. 总结 Hibernate之一级缓存 什么是一级缓存 Hibernate创建每个Session对象时,都会给Session分配一块独立的缓存区,用于存放Session查询出来的对象,这个分配给Session的缓存区称之为一级缓存,也叫Session级缓存 为什么使用一级缓存 Session读取数据时,会优先向缓存区取数
爱撒谎的男孩
2019/12/31
5290
hibernate二级缓存
1、hibernate的session提供一级缓存,一个session代表一次会话过程,一个session关联一个数据库连接,所以session最好不要长时间保持打开,通常仅用于一个事务中,在事务结束时就应关闭。
week
2018/08/27
4140
Hibernate 4 升级到 Hibernate 5 的时候 SessionFactory 不能使用
在 Hibernate 4 升级到 5 的时候老的 sessionFactory 出现错误。
HoneyMoose
2019/10/15
6900
Hibernate 4 升级到 Hibernate 5 的时候 SessionFactory 不能使用
Hibernate 的一级缓存
什么是一级缓存: Hibernate创建每个Session对象时,都会给该Session分配一块独立的缓存区,用于存放该Session查询出来的对象,这个分配给Session的缓存区称之为一级缓存。也叫作Session级缓存。 ---- 为什么要使用一级缓存: Session取数据时,会优先向缓存区取数据,如果存在数据则直接返回,不存在才会去数据库查询,从而降低了数据库访问次数,提升了代码运行效率。 ---- 如何使用一级缓存: 一级缓存是默认开启的,在使用Hibernate的API进行查询时会自动使用。
qubianzhong
2018/08/10
5790
Hibernate 的一级缓存
Hibernate 4 升级到 Hibernate 5 的时候 SessionFactory 不能使用
在 Hibernate 4 升级到 5 的时候老的 sessionFactory 出现错误。
HoneyMoose
2019/10/16
6920
Hibernate 4 升级到 Hibernate 5 的时候 SessionFactory 不能使用
子线程 真的不能更新UI ?
一般情况,我们在子线程直接操作UI,没有用handler切到主线程,就会报这个错。
胡飞洋
2020/07/23
1.3K0
子线程 真的不能更新UI ?
hibernate二级缓存注解-mybatis的二级缓存和hibernate的三级缓存
  1.一级缓存: 基于 的 本地缓存,其存储作用域为,当 flush 或 close之后,该中的所有 Cache 就将清空。
宜轩
2022/12/29
4140
Hibernate的二级缓存
/**  *  * @author XHW  *  * @date 2011-7-15  *  */ public class HibernateTest {
Hongten
2018/09/18
4770
Hibernate二级缓存(二)
Hibernate提供了多种缓存策略可用于控制二级缓存的行为和缓存数据的更新。以下是一些常用的缓存策略:
堕落飞鸟
2023/05/16
2620
Hibernate二级缓存(一)
Hibernate的二级缓存是一种用于缓存持久化对象的高级缓存机制。它位于Hibernate的会话工厂层面,用于缓存经常访问的数据,以提高应用程序的性能和响应速度。在多个会话之间共享数据,并减少与数据库的交互次数,从而降低系统的负载。
堕落飞鸟
2023/05/16
3320
Hibernate中的一级缓存
在一个会话的生命期里面,他所用到的数据会使用缓冲的,第一次读的是编号为2的数据记录
Hongten
2018/09/18
4560
Hibernate二级缓存问题[通俗易懂]
把一些不常修改,但是又经常用的数据存放到内存中,这样能减少与数据库的交互,提升程序的性能
全栈程序员站长
2022/08/31
6920
hibernate二级缓存策略
很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了。 我的经验主要来自hibernate2.1版本,基本原理和3.0、3.1是一样的,请原谅我的顽固不化。
全栈程序员站长
2022/08/31
4470
Hibernate二级缓存配置
  Cache就是缓存,它往往是提高系统性能的最重要手段,对数据起到一个蓄水池和缓冲的作用。Cache对于大量依赖数据读取操作的系统而言尤其重要。在大并发量的情况下,如果每次程序都需要向数据库直接做查询操作,它们所带来的性能开销是显而易见的,频繁的网络舆,数据库磁盘的读写操作都会大大降低系统的性能。此时如果能让数据库在本地内存中保留一个镜像,下次访问的时候只需要从内存中直接获取,那么显然可以带来不小的性能提升。引入Cache机制的难点是如何保证内存中数据的有效性,否则脏数据的出现将会给系统带来难以预知的严重后果。虽然一个设计得很好的应用程序不用Cache也可以表现出让人接受的性能,但毫无疑问,一些对读取操作要求比较高的应用程序可以通过Cache获得更高的性能。对于应用程序,Cache通过内存或磁盘保存了数据库中的当前有关数据状态,它是一个存储在本地的数据备份。Cache位于数据库和应用程序之间,从数据库更新数据,并给程序提供数据。
全栈程序员站长
2022/09/07
3420
hibernate二级缓存配置[通俗易懂]
1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下:
全栈程序员站长
2022/08/25
4320
xcode自动签名_配置实用工具也不能移除
不过因为当时手贱,把默认的 “iPhone Developer” 签名 改成了自己的名字
全栈程序员站长
2022/11/10
4240

相似问题

移除父级时如何移除子级?

11

Hibernate:不能级联删除子级的单向父级

12

Hibernate OneToMany MySQLIntegrityConstraintViolationException:重复条目

25

Hibernate @OneToMany在从基础集合中移除时不会删除子级

13

Javascript从父级移除特定的子级

48
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文