代码之家  ›  专栏  ›  技术社区  ›  user2482461

休眠-带级联选项的ManyToOne/OneToOne

  •  0
  • user2482461  · 技术社区  · 12 年前

    说我有 class A ,具有属性 class B .

    我知道永远只有一个 B类 A类 ,所以我用 OneToOne 。如果我错误地添加了相同的 B类 到一秒钟 A类 二者都 A类 s参考相同 B类 (因此,与 CascadeType.ALL 设置,对其中一个对象的删除将删除另一个对象引用的地址)。这一切都是有道理的。

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

    这个 多对一 关系的运作方式与 一对一 以上-即当我删除其中一个 A类 引用的对象 B类 对象,“class B”对象也会被删除(即使在其他地方被引用)。我希望JPA/hibernate检查一下 B类 对象未被任何其他对象引用 A类 删除前的对象(即使使用 级联类型.ALL 设置-因为它被标记为 多对一 关系)。

    我是不是错过了什么?

    1 回复  |  直到 12 年前
        1
  •  0
  •   Tom Anderson    12 年前

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

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

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

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

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