说我有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关系)。
我在这里错过了什么吗?
答案 0 :(得分:0)
不幸的是,没有简单的方法来获得你想要的东西。
级联删除非常简单:如果删除了级联端的实体,则也会删除引用端的实体。即使它被其他实体引用。好吧,希望数据库中的外键约束可以防止删除底层行,并抛出异常,但重点是JPA提供程序将尝试删除该实体。听起来这不是你想要的行为,所以级联删除不适合你。
JPA还有一个名为orphan removal的功能,但这有一个类似的限制 - 它不能用于管理共享对象。您甚至无法在@ManyToOne
关系中声明它。
相反,我认为您需要手动处理此删除。不是使用EntityManager
直接删除拥有对象,而是将删除封装在删除对象的服务对象(有时称为数据访问对象或存储库)中,然后检查其引用的对象是否也应该是删除。
我很欣赏这很尴尬。但遗憾的是,据我所知,这不是JPA可以为您自动化的事情。