jpa 正在合并同一实体的多个制图表达,已分离

tct7dpnv  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(117)

我在尝试使用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中我能做什么和冬眠一样的事情吗。
请不要建议使用em.find()来查找实体,然后手动更新,因为我需要两个实体,持久化实体和新创建的实体。此外,我正在使用spring form将整个专利实体持久化到数据库中。
很抱歉,如果我不够清楚,这是我的第一个问题,我真的是一个初学者。
任何帮助都将不胜感激。

2wnc66cl

2wnc66cl1#

今天我自己找到了答案。你只需要
请从不允许持久化分离实体的实体中删除CascadeType.MERGE。
如果您使用的是CascadeType.ALL,那么请提及除CascadeType.MERGE之外的所有级联类型。

b4qexyjb

b4qexyjb2#

现在,从cascade中删除CascadeType.MERGE是一个解决方案,但不是最好的解决方案,因为从Cascade中删除MERGE后,您将无法更新Map的对象。
如果要将分离实体与Hibernate合并,请在合并实体之前清除实体管理器

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

kokeuurv3#

要解决这个问题,请确保指定对象的标识符是自动生成的,方法是在identiflaf(如id)上添加@GeneratedValue(strategy = GenerationType.IDENTITY)
这样,当执行合并时,与数据库中已记录的其他对象相比,要合并的元素的标识符将自动递增,以避免主键冲突

相关问题