【问题标题】:Multiple representations of the same entity are being merged, Detached同一实体的多个表示正在合并、分离
【发布时间】:2016-03-14 18:48:36
【问题描述】:

我在尝试使用 jpa2.0 将包含持久实体和分离实体(新创建的实体)的实体列表更新到我的数据库中时遇到错误。 我的实体包含在合并数据时出现错误(在标题中提到)的内部实体:

Class superclass{
    private A a;
    private string name;

    //getter setters here...
}

Class A{
    private long id;
    @onetoone(cascade=CascadeType.All, fetch=FetchType.Eager)
     private B b;
    @onetoone(cascade=CascadeType.All, fetch=FetchType.Eager)
    private C c;

    //getter setters here...

}


Class Dao{

    daoInsert(superclass x){

    em.merge(x);

       }
}

我希望将任何发送的实体合并到数据库中。

Hibernate 确实为此提供了解决方案,方法是将以下内容添加到 persistence.xml

有什么我可以在 jpa 中和 hibernate 一样做的事情吗?

请不要建议使用 em.find() 查找实体然后手动更新,因为我也需要持久实体和新创建的实体这两个实体。 此外,我正在使用弹簧形式将整个专利实体保存到数据库中。

对不起,如果我不够清楚,这是我的第一个问题,我真的是一个初学者。

任何帮助将不胜感激。

【问题讨论】:

  • 我们需要更多信息,因为您没有描述究竟是什么导致了这个问题。不应该让我们猜测您是否调用 daoInsert 以及调用什么,以及导致问题的实体是否是 A、B 或 C 实例。您遇到异常的具体情况是什么,为什么您的模型或列表中有同一实体的多个分离实例?
  • @Chris 导致问题的实体是 b 和 c,只有当 C 中的属性值在 A 的下一个条目中重复时,我才会收到错误...我已经提到的这个链接hibernate 正是我在 jpa 中遇到的问题...HTTPS://hibernate.atlassian.net/browse/HHH-9106
  • 另外我正在调用 DaoInsert 来合并我的实体列表,即如果存在具有匹配 id 的实体,则应该更新它,如果没有找到匹配的 id,则必须在数据库中创建一个新条目.这么多信息有用吗?
  • 我有什么遗漏的吗...有人可以帮我吗?
  • 这仍然没有描述您如何解决 HHH-9106 中的问题。您的模型显示 A->B 和 A->C。 HHH-9106 需要 A1->B1->A1'。虽然 B 和 C 可能涉及您的问题,但您没有展示足够的模型或情况来推断您正在攻击 HHH-9106,并且您没有描述为什么您会获得同一实体的多个不同实例。您可能会更好地了解为什么您的一个实体有多个分离的实例,因为这似乎效率低下,并且不清楚哪些可能包含应该捕获的更改。

标签: jpa jpa-2.0


【解决方案1】:

今天自己找到了问题的答案。你只需要

从不允许您保留分离实体的实体中删除 CascadeType.MERGE。

如果您使用 CascadeType.ALL,请提及除 CascadeType.MERGE 之外的所有级联类型。

【讨论】:

  • 我喜欢这种深奥的东西。感谢您回答您的问题。 (是的,我对深奥的部分很讽刺)。
  • 你能举例说明你的意思吗?假设您正在使用 CascadeType.ALL。您如何“提及除 CascadeType.Merge 之外的所有级联类型”您的意思是专门列出除合并之外的所有其他类型吗?
  • @Jolley71717 是的,这正是我的意思。在一个数组中列出所有其他级联类型。
【解决方案2】:

现在从级联中删除 CascadeType.MERGE 是一种解决方案,但不是最佳解决方案,因为从级联中删除 MERGE 后,您将永远无法更新映射的对象。

如果您想将 Detached 实体与 Hibernate 合并,请在合并实体之前清除实体管理器

entityManager.clear();
//perform modification on object
entityManager.merge(object);

【讨论】:

  • +1,我们以一种不需要更新对象的方式设置了映射。但是对于遇到这个问题的任何人来说,这确实是删除合并的一个问题,实体不会像上面提到的那样更新。
猜你喜欢
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 2020-04-11
  • 2012-05-17
  • 2021-11-01
相关资源
最近更新 更多