使用带有外键约束的 JPA 删除对象

Posted

技术标签:

【中文标题】使用带有外键约束的 JPA 删除对象【英文标题】:Deleting Objects with JPA with Foreign Key Constraints 【发布时间】:2009-10-20 20:01:23 【问题描述】:

我有两个类,Service 和 Customer,具有从 Service 到 Customer 的多对一关联。我想删除一个客户和任何引用它的服务。我使用 JPA 作为连接到 PostgreSQL 数据库的 ORM(下面带有 Hibernate)。

如果我能以这样一种方式定义关联,即删除客户会级联到引用它的服务,那就太好了。但是,也许我误解了一些东西,因为关联是使用 @ManyToOne in Service 定义的,所以操作会从 Service 级联到 Customer,而不是反过来?

因此,在没有级联删除的情况下,我着手简单地删除所有引用客户的服务。看起来很容易,除了 JPA/Hibernate 想要批量删除并以错误的顺序执行它们!我的代码基本上查询引用客户的服务,在每个服务上调用 entityManager.remove(),然后在客户上调用 entityManager.remove()。但是当我刷新它时,我得到一个异常,即由于外键约束,从 Customer 中删除失败。

我真的需要在从客户删除之前尝试从服务中提交删除吗?我宁愿不这样做,因为我的事务是容器管理的,提交它会让人头疼。

谢谢, 安迪

【问题讨论】:

【参考方案1】:

手动管理受约束的关系可能不是一个好主意,特别是考虑到它是一种非常简单和标准的关联类型。

你为什么不在Customer 中定义一个one-to-many association 并指定级联? (在链接中,您的 Service 类将替换示例中的 Order。)

【讨论】:

我同意如果方向颠倒对象模型会更好。不幸的是,我从其他人那里继承了对象模型,并且出于向后兼容性的原因无法证明对其进行修改。【参考方案2】:

就个人而言,我会重新考虑您的流程。我不认为应该删除客户数据。它们应标记为不活动,但删除它们和相关记录通常会导致您丢失历史报告或会计目的所需的信息。

【讨论】:

这条评论没有帮助。我正在寻找技术解决方案,而不是关于如何在我的域中操作的建议。 当我看到一个糟糕的设计时,我觉得我有义务指出它。我花了太多时间试图修复那些不考虑他们想做的事情的影响的人的垃圾数据。 HLGEM 是对的。只有糟糕的设计才允许从持久存储中删除数据。【参考方案3】:

我对订单有误。它们以正确的顺序执行,但问题原来是另一个以前未知的外键约束并导致事务失败。只要代码考虑到所有约束,原始方法似乎应该可以正常工作。

【讨论】:

以上是关于使用带有外键约束的 JPA 删除对象的主要内容,如果未能解决你的问题,请参考以下文章

如何避免使用 JPA 在实体关系中违反外键约束

带有没有外键的数据库的 Spring JPA

删除对象但将子项保留为孤儿而没有“外键约束失败”错误?

HSQLDB 无法删除未找到的外键约束对象

如何解决无法添加或更新子行:Spring JPA 中的外键约束失败错误?

sql server怎样删除外键约束?