3

誰かがこのエラーに遭遇し、何が起こっているのかを説明できるのだろうか。

<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の2つのオブジェクトがあります。プロパティには、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を設定すると、数千のレコードが数十あり、一度に数千のプロパティオブジェクトを選択する必要があり、99.99%の時間は履歴が必要ないため、許容できないほど遅くなります。

@GeneratedValueは生成されているため(DB2、自動インクリメント)、エラーテキストが示すように削除できません。ここで、「初期化処理を削除するようにコードを変更する」にはどうすればよいでしょうか。

ありがとう!

4

1 に答える 1

2

問題は、永続コンテキスト間でエンティティを共有しようとしていることです(EntityManager)。メソッドを変更してEntityManagerインスタンスを取得し、検索と更新の操作に同じEMを使用することができます。

于 2012-10-18T13:29:02.120 に答える