0

プロジェクトで 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)

なぜこの問題が発生するのですか? スーパークラスのリストを作成することは許可されていないのでしょうか?

どうもありがとう、

4

1 に答える 1

0

http://www.datanucleus.org/products/accessplatform_3_1/jdo/fetchgroup.html#static 「フェッチの深さ」セクションに従って、すべてドキュメントに記載されています。

于 2012-10-18T13:56:23.043 に答える