尝试使用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);
}
}
我希望任何发送的实体都可以合并到db。
Hibernate通过将以下内容添加到persistence.xml
来确实为此提供了解决方案
我在jpa中可以做什么和hibernate一样。
请不要建议使用em.find()找到实体,然后手动更新,因为我需要两个实体都是持久化实体和新创建的实体。 我也使用spring form将整个专利实体持久化为db。
我很抱歉,如果我不够清楚,这是我的第一个问题而且我真的是初学者。
非常感谢任何帮助。
答案 0 :(得分:3)
今天我自己找到了一个问题的答案。你只需要
从不允许您保留分离实体的实体中删除CascadeType.MERGE。
如果你正在使用CascadeType.ALL,那么请提及CascadeType.MERGE以外的所有级联类型。
答案 1 :(得分:0)
现在从级联中删除 CascadeType.MERGE 是一种解决方案,但不是最佳解决方案,因为从级联中删除 MERGE 后,您将永远无法更新映射对象。
如果要将分离实体与 Hibernate 合并,请在合并实体之前清除实体管理器
entityManager.clear();
//perform modification on object
entityManager.merge(object);