Hibernate - 带有Cascade选项的ManyToOne / OneToOne

时间:2013-08-23 08:35:50

标签: java hibernate jpa

说我有class A,其属性为class B

我知道每class B只会有一个class A,因此我将其与OneToOne进行映射。如果我错误地将相同的class B添加到第二个class A,则class A两个class B引用相同的CascadeType.ALL(因此,设置class B时,会删除其中一个对象将删除另一个引用的地址。这一切都有道理。

但是,如果我知道数据库中可能有多个(相同的)class A实例,并且我希望任何ManyToOne s使用此持久属性(如果存在),我想我可以将此实体映射为ManyToOne,JPA / hibernate将负责任何必要的检查以查看数据是否已存在于数据库中(加载然后使用相等)。似乎情况并非如此。

OneToOne关系的工作方式与上面的class A完全相同 - 即只要删除引用class B对象的class B个对象之一, “B类”对象也会被删除(即使在别处引用)。我希望JPA / hibernate检查这个class A对象在删除之前没有被任何其他CascadeType.ALL对象引用(即使设置了ManyToOne - 因为它被标记为{{1关系)。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:0)

不幸的是,没有简单的方法来获得你想要的东西。

级联删除非常简单:如果删除了级联端的实体,则也会删除引用端的实体。即使它被其他实体引用。好吧,希望数据库中的外键约束可以防止删除底层行,并抛出异常,但重点是JPA提供程序将尝试删除该实体。听起来这不是你想要的行为,所以级联删除不适合你。

JPA还有一个名为orphan removal的功能,但这有一个类似的限制 - 它不能用于管理共享对象。您甚至无法在@ManyToOne关系中声明它。

相反,我认为您需要手动处理此删除。不是使用EntityManager直接删除拥有对象,而是将删除封装在删除对象的服务对象(有时称为数据访问对象或存储库)中,然后检查其引用的对象是否也应该是删除。

我很欣赏这很尴尬。但遗憾的是,据我所知,这不是JPA可以为您自动化的事情。