我想知道是否有人遇到过这个错误并可以解释发生了什么:
<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 com.qbe.config.bean.QBEPropertyHistory@1c710ab 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.
我有两个对象,Property 和 PropertyHistory。属性具有 PropertyHistory 的 OneToMany 列表:
@OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.MERGE, orphanRemoval=false)
@JoinColumn(name="PROPERTY_NAME")
@OrderBy("updatedTime DESC")
private List<QBEPropertyHistory> history = new ArrayList<QBEPropertyHistory>();
并且 Property 对象像这样加载和保存:
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,自动增量)。现在我想知道我将如何“修改代码以删除初始化程序处理”?
谢谢!