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

时间:2009-10-20 20:01:23

标签: java database hibernate orm jpa

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

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

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

在从客户删除之前,我是否真的需要尝试从服务中提交删除?我宁愿不这样做,因为我的交易是容器管理的,让它提交是一件痛苦的事。

谢谢, 安迪

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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