0

假设我有一个class A,它的属性为class B

class B我知道每个人都只会有一个class A,所以我用OneToOne. 如果我错误地将其添加class B到第二个class A,两个class As 引用相同class B(因此,使用CascadeType.ALLset,删除这些对象之一将删除另一个引用的地址)。这一切都说得通。

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

ManyToOne关系的工作方式与上述完全相同OneToOne- 即,一旦我删除了一个class A引用对象的class B对象,“B 类”对象也会被删除(即使在其他地方引用)。我希望 JPA / hibernate在删除之前检查该class B对象是否未被任何其他对象引用(即使使用set - 因为它被标记为关系)。class ACascadeType.ALLManyToOne

我在这里错过了什么吗?

4

1 回答 1

0

不幸的是,没有简单的方法可以得到你想要的。

级联删除非常简单:如果级联侧的实体被删除,被引用侧的实体也被删除。即使它被其他实体引用。好吧,希望数据库中的外键约束能够防止底层行被删除,并且会抛出异常,但关键是 JPA 提供者将尝试删除实体。听起来这不是您想要的行为,因此级联删除不适合您。

JPA 还有一个称为孤儿删除的功能,但它有一个类似的限制——它不能用于管理共享对象。你甚至不能在一段@ManyToOne关系中声明它。

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

我很感激这很尴尬。但遗憾的是,据我所知,这不是 JPA 可以为您自动化的东西。

于 2013-08-23T09:03:28.203 回答