【问题标题】:JPA OneToOne and OneToMany : updates and deletionsJPA OneToOne 和 OneToMany:更新和删除
【发布时间】:2013-03-03 23:45:53
【问题描述】:

我希望一个模型对象包含另一个具有 OneToOne 关系的对象,但我希望在保存第一个对象时自动更新第二个对象 (object.save()),并在删除第一个对象时自动删除。

我对包含其他对象列表的对象有相同的需求,对保存/更新和删除有相同的要求。对于特殊情况:保存第一个对象时,我希望根据第一个对象中的新列表更新、创建或删除第二个对象。

一个类似的例子是带有可以添加、编辑或删除的 cmets 的博客文章。

我已经做了很多尝试,使用“cascade = CascadeType.ALL”和其他“mappedBy”,这些尝试是在使用 HSQLDB 的单元测试中完成的,但我无法取得任何成功...... :-(

你能帮帮我吗?

谢谢,

泽维尔

【问题讨论】:

  • 使用级联通常是要走的路。你有任何错误吗?你如何检查成功?可以发一下代码吗?
  • 当我保存第一个对象时,级联正在工作,但是对于每次保存,都会在数据库中创建一个新的第二个对象,并且不会从表中删除前一行...我希望数据库已正确更新:更新第二个对象或删除以前的数据以创建一个新对象
  • 不看代码就很难判断问题出在哪里。请发布实体及其映射、equals 和 hashCode(没有 setter getter)以及至少一个失败的测试
  • github.com/xnopre/test-play-jpa。这不是我的产品代码,而是示例代码。在这段代码中,OneToMany 似乎没问题,但在 JpaTests:83 测试失败:DB 中有 2 个 PostDetails 而不是 1 个,之前和未使用的 PostDetails 不会被删除
  • 给未来的读者:链接到原始代码:github.com/xnopre/test-play-jpa/tree/…

标签: jpa


【解决方案1】:

我想我找到了问题 - 声明的 orphanRemoval=true 无法正常工作 - 在 Post 不再引用 PostDetails 实体后,应将其删除。

这似乎是 Hibernate 的一个问题 - 孤儿删除不像预期的那样起作用。请参阅 this post 解释如何在 Play 中解决它。

thisthis 似乎是 Hibernate 的相关错误票证。

【讨论】:

  • 谢谢,但这不是同一个问题,我的问题是 OneToOne。我在网上找到了一个解决方案,将 OneToOne 替换为 List 上的 OneToMany,确保始终只有一个实例。有用。 OneToOne 上似乎没有很好地管理“orphanRemoval=true”。新代码:github.com/xnopre/test-play-jpa/tree/…
  • @xnopre - 很酷,很高兴你明白了。您可以将您的解决方案发布为答案并接受它 - 供未来的读者使用。我会在这里留下我的错误答案以供参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2012-01-16
相关资源
最近更新 更多