openjpa,更新,错误'PK有非默认值'

时间:2012-10-18 01:04:25

标签: java jpa db2 websphere openjpa

我想知道是否有人遇到过这个错误并且可以解释发生了什么:

<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。物业有OneToMany PropertyHistory列表:

@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)并得到上述错误。 / p>

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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