【问题标题】:ORA-02292: integrity constraint (xxx) violated - child record foundORA-02292: 违反完整性约束 (xxx) - 找到子记录
【发布时间】:2019-03-16 13:55:24
【问题描述】:

如何使用 hibernate deleteAll() 删除所有条目?

我有一个具有多个 @oneToMany 关系的类(具有 +5000 个子实体),当我尝试执行 deleteAll 时,我得到标题错误

oracle.jdbc.OracleDatabaseException: ORA-02292: integrity constraint (xxx) violated - child record found

我试过添加

cascade = {CascadeType.ALL}

orphanRemoval=true

到@OneToMany 关系类,但没有帮助。

跟下面的类是双向关系

@OneToMany(targetEntity = XXX.class, fetch = FetchType.LAZY, cascade = {CascadeType.ALL}, orphanRemoval=true, mappedBy = "zzz")
    @Fetch(FetchMode.SELECT)
    @JsonManagedReference
    private List<XXX> xxx;

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(targetEntity = YYY.class, fetch = FetchType.LAZY, orphanRemoval=true, cascade = {CascadeType.ALL}, mappedBy = "zzz")
@Fetch(FetchMode.SELECT)
@JsonManagedReference
private List<YYY> yyy;

与子元素类似

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinColumn(name = "XXX", nullable=false)
@JsonBackReference
private XXX zzz;

我也尝试过 HQL DELETE 查询,但这也不能让我去任何地方。

我到底如何一致地删除所有这些实体? 到目前为止,自从这个问题开始以来,我已经手动删除了表(几天前所有实体都被删除了),但这开始让我很恼火,但我不知道该怎么做。

谢谢!

【问题讨论】:

    标签: java hibernate spring-boot oracle10g


    【解决方案1】:

    您已经在父实体上设置了CascadeType.ALL,最好的删除方式应该是在父实体上调用一次删除

    如果您尝试删除一个孩子,它可以是休眠将删除传播到仍然有孩子仍未删除的父母。

    这个问题之王的最后手段是:

    1. 启用logs on Spring Boot Application
    2. 运行 SQL server 中生成的 sql 查询
    3. 在评估当前数据库条件时查找错误发生的位置
    4. 必要时更改 JPA

    【讨论】:

    • 我试图删除父级,但这就是错误的原因。我尝试将 CascadeType 更改为所有可能的值,但没有帮助。
    • 您是否尝试过删除@ManyToOne 关系中的CascadeType.ALL,如果仍然无效,请尝试删除@OneToMany 关系中的fetch = FetchType.EAGER
    • 好吧,经过多天的困惑,我认为我可以接受启用日志的部分。最后我不得不手动删除表,但问题似乎已解决
    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2012-07-02
    • 2020-04-08
    • 2016-04-13
    • 2019-08-06
    • 2019-12-31
    相关资源
    最近更新 更多