誰かがこのエラーに遭遇し、何が起こっているのかを説明できるのだろうか。
<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、自動インクリメント)、エラーテキストが示すように削除できません。ここで、「初期化処理を削除するようにコードを変更する」にはどうすればよいでしょうか。
ありがとう!