【问题标题】:integrity constraint (...) violated - child record found, Java, Oracle, Hibernate违反完整性约束 (...) - 找到子记录、Java、Oracle、Hibernate
【发布时间】:2015-02-24 08:51:28
【问题描述】:

更新加密时不需要更新值,但删除加密时删除所有子值:

class Crypto {
...
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name="cryptoId", updatable=false)
    private Set<Values> values;
...
}


class Values {
...
    @ManyToOne
    @JoinColumn(name = "cryptoId")
    private Crypto crypto;
...
}

删除 Crypto 时的 SQL 调试:

休眠:从“加密”中删除“id”=?

错误:

java.sql.SQLIntegrityConstraintViolationException: ORA-02292: 违反完整性约束 (ARTIKUA.FK_8R5C0WLWJ3LIJTVJ559EV8NAT) - 找到子记录

数据库是甲骨文 为什么 Hibernate 在删除“Crypto”之前,不删除所有子“Values”值?

【问题讨论】:

  • 如何删除 Crypto 对象实例?通过 HQL?
  • 会话 = sf.openSession(); session.delete(); session.close();
  • 你能粘贴你的完整代码吗?奇怪的是 session.delete(crypto) 没有删除子实例。你在删除之前加载加密对象吗?
  • 加密哭= session.get(Crypto.class, 5); session.delete(cry);

标签: java oracle hibernate


【解决方案1】:

如果是通过hql删除Crypto对象,hibernate不能不级联删除操作。由于级联是休眠配置事项(即 hbm.xml 或注释),因此必须将数据返回给 Java 以处理级联。在 HQL 中执行 UPDATE/DELETE 行修改完全发生在数据库服务器上。

你可以做什么:

  1. 获取所有应删除的 Crypto 实例。对于他们每个人。
  2. 调用 entityManager.remove() 或 session.delete()。

【讨论】:

  • 我使用 session.delete(),但为什么我需要获取所有元素?在删除 Crypto 之前,只需要 Hibernate 进行类似“DELETE FROM Values WHERE cryptoId=" + Crypto.getId() 之类的操作
  • 那将是一个 HQL 查询。我没有完全按照。您使用的是 session.delete() 还是 hql 查询?在您的问题中发布您的完整代码
  • 加密哭= session.get(Crypto.class, 5); session.delete(cry);
猜你喜欢
  • 2012-06-18
  • 2015-11-26
  • 2019-12-31
  • 1970-01-01
  • 2017-05-17
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
相关资源
最近更新 更多