休眠-ManyToOne/OneToOne与级联选项



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

我知道每个class A只有一个class B,所以我用OneToOne来映射它。如果我错误地将相同的class B添加到第二个class A,则两个class A都引用相同的class B(因此,在设置了CascadeType.ALL的情况下,删除其中一个对象将删除另一个对象引用的地址)。这一切都是有道理的。

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

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

我是不是遗漏了什么?

不幸的是,没有简单的方法可以获得您想要的东西。

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

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

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

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

最新更新