2013-08-23 73 views
0

假设我有一个class A,它有一个属性class B休眠 - ManyToOne/OneToOne具有级联选项

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

不过,如果我知道有可能是class B多个(相同)的实例在数据库中,和我想要的任何class A s到使用此坚持,如果它存在的属性,我以为我会这样实体映射为ManyToOne和JPA/hibernate将负责检查数据是否已经存在于数据库中(加载然后使用相等)。看来情况并非如此。

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

我在这里错过了什么吗?

+0

我们确实需要确切地知道您是如何声明实体及其关系的。 –

+0

你能举一个真实的例子,以便我们能以更好的方式帮助你。 –

+0

当然。参考“地址”的“人物”。我已经在'Address'对象中实现了相等性,以及逐行相等,以及hashcode方法。其他一切如上... – user2482461

回答

0

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

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

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

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

我明白这很尴尬。但令人遗憾的是,据我所知,这不是JPA可以为你自动执行的事情。