プロジェクトで mongodb-datanucleus を使用しています。jdoconfig.xml を次のように構成します。
<persistence-manager-factory name="mongodb-factory">
<property name="javax.jdo.PersistenceManagerFactoryClass" value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" />
<property name="javax.jdo.option.ConnectionURL" value="mongodb:localhost/test" />
<property name="javax.jdo.option.Mapping" value="mongodb" />
<property name="javax.jdo.option.ConnectionUserName" value="username" />
<property name="javax.jdo.option.ConnectionPassword" value="psw" />
<property name="javax.jdo.option.Optimistic" value="false" />
<property name="datanucleus.autoCreateSchema" value="true" />
<property name="datanucleus.DetachAllOnCommit" value="true" />
<property name="datanucleus.DetachOnClose" value="true" />
</persistence-manager-factory>
スーパークラスを作成します:
@PersistenceCapable(detachable="true")
public class Definition implements Serializable {
private String label;
}
サブクラスを作成します:
@PersistenceCapable(detachable="true")
public class SubDefinition extends Definition implements Serializable {
private String label;
}
次に、 Definition の配列リストを格納するクラスを作成します。
@PersistenceCapable(detachable="true")
public class Master implements Serializable {
@Persistent(defaultFetchGroup="true")
@Element(dependent = "true")
private List<Definition> subDef;
}
My List of Definition には、タイプ Definition または SubDefinition のオブジェクトを含めることができます。Master オブジェクトを作成して永続化します。
データベースからオブジェクトを取得すると、問題が発生します。
Transaction tx = pm.currentTransaction();
tx.begin();
Query query = pm.newQuery();
query.setClass(Master.class);
Collection<Master> masterList = (Collection<Master>)query.execute();
tx.commit();
サーバーを再起動しない場合、コードは正しいオブジェクトを取得し、「subDef」リストは正しくロードされます。ただし、サーバー データベースを再起動すると、このオブジェクトが正しく読み込まれません。変数「subDef」に空の配列が含まれています。2 つのサブ要素が含まれている必要があります。
この問題は、サーバーを再起動するたびに発生します。その後、いくつかのコードを再起動して配列を空にします。それは私のコードの1つではありません。
データベースにチェックインすると、両方のサブ要素が存在しますが、親とはリンクされていません。オブジェクトを永続化した直後に、リレーションが DB に正しく存在します。
格納されたオブジェクトのグラフィカル表現:
Master
->subDef
->Definition (children 1)
->Definition (children 2)
なぜこの問題が発生するのですか? スーパークラスのリストを作成することは許可されていないのでしょうか?
どうもありがとう、