2009-10-20 1156 views
0

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

如果我可以通过删除客户级联到引用它的服务的方式来定义关联,那就太好了。但是,也许我误解了某些内容,因为关联是使用@ManyToOne in Service定义的,所以操作会从服务级联到客户,而不是其他方式?

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

在从客户中删除之前,是否真的需要尝试提交从服务中删除?我宁愿不是因为我的交易是集装箱管理的,而且让它做出承诺会是一件痛苦的事情。

感谢, 安迪

回答

1

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

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

+0

我同意如果方向颠倒,对象模型会更好。不幸的是,我从其他人那里继承了对象模型,并且因为向后兼容性的原因无法证明对其进行修改。 – Andy 2009-10-20 21:10:33

0

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

+1

此评论无效。我正在寻找技术解决方案,而不是关于如何在我的域中操作的建议。 – Andy 2009-10-20 21:11:19

+0

当我看到一个糟糕的设计时,我觉得我有义务指出。我花了太多时间试图修复那些不考虑他们想要的效果的人的垃圾数据。 – HLGEM 2009-10-20 21:31:02

+0

HLGEM是对的。只有糟糕的设计才允许从持久性存储中删除数据。 – 2014-12-05 05:28:12

0

我错了订单。它们以正确的顺序执行,但问题证明是另一个以前未知的外键约束,导致事务失败。似乎原来的方法应该工作正常,只要代码解决了所有约束。