OpenJPA中,更新,错误“PK具有非默认值”

我不知道是否有人已经遇到这个错误并能解释发生了什么:OpenJPA中,更新,错误“PK具有非默认值”

<openjpa-2.1.1-SNAPSHOT-r422266:1087028 nonfatal user error> 

org.apache.openjpa.persistence.InvalidStateException:

Primary key field com.qbe.config.bean.QBEPropertyHistory.id of [email protected] has non-default value.

The instance life cycle is in PNewProvisionalState state and hence an

existing non-default value for the identity field is not permitted.

You either need to remove the @GeneratedValue annotation or modify the

code to remove the initializer processing.

我有两个对象,属性和PropertyHistory。酒店有PropertyHistory的一对多名单:

@OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.MERGE, orphanRemoval=false) 

@JoinColumn(name="PROPERTY_NAME")

@OrderBy("updatedTime DESC")

private List<QBEPropertyHistory> history = new ArrayList<QBEPropertyHistory>();

及性能对象加载和保存这样的:

public T find(Object id) { 

T t = null;

synchronized(this) {

EntityManager em = getEm();

t = em.find(type, id);

//em.close(); //If this is uncommented, fetch=LAZY doesn't work. And fetch=EAGER is too slow.

}

return t;

}

public T update(T t) {

synchronized(this) {

EntityManager em = getEm();

em.getTransaction().begin();

t = em.merge(t);

em.getTransaction().commit();

em.close();

return t;

}

}

在服务层我使用find(ID)方法加载属性,实例化一个新PropertyHistory ,将它添加到属性prop.getHistory()。add(propHist)然后调用update(prop)并获得上述错误。

如果我在find()中关闭EntityManager但是打破延迟加载并且prop.getHistory()始终返回null,则错误消失。如果我设置fetch = EAGER,那么它会变得无法接受,因为有1000个记录中有10个,我需要一次选择数千个属性对象,并且99.99%的时间不需要历史记录。

我无法删除@GeneratedValue,因为错误文本是建议的,因为它是生成的(DB2,autoincrement)。现在我想知道我将如何“修改代码以删除初始化器处理”?

谢谢!

回答:

问题是您试图在持久性上下文中共享实体(EntityManager)。您可以更改您的方法以获取EntityManager实例,并使用相同的EM查找和更新操作。

以上是 OpenJPA中,更新,错误“PK具有非默认值” 的全部内容, 来源链接: utcz.com/qa/261448.html

回到顶部