2

非常に簡単で古典的なセットアップがあるとしましょう: GAE(1.7.4) + GWT(2.5.0) アプリケーション、ローカルの Jetty (開発サーバー) で実行され、永続化のために JDO を使用します。

また、 @PersistenceCapable クラスが Person と Color の 2 つしかないとします。すべての人が好きな色を 1 つだけ持っていますが、この人がこの色を所有しているわけではありません。多くの異なる人が同じ好きな色を持つことができます。よく知られている色の数には限りがあり、誰も好んでいない色でも存在する場合があります。

これをモデル化するには、@Unowned 関係を使用する必要があります。間違っている場合は修正してください。

@PersistenceCapable
public class Color { // just the most regular Entity class

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    String rgb;

    // getter, setter, no constructor
}

@PersistenceCapable
public class Person {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    String surname;

    @Persistent
    @Unowned // here is the tricky part
    Color color;

    // getters, setters, no constructor
}

シンプルでよく知られている PersistentManager ベースのコードを使用して、Color クラスのインスタンスを正常に作成し、永続化することができます。GAE 開発コンソール -> Datastore Viewer で確認できます。適切に生成されたキーと ID/名前 (13)、および割り当てられた RGB があります。

非常によく似たコードを使用して、Person クラスのインスタンスを (別の要求で) 作成し、既存の Color を彼のお気に入りの色として割り当て (以前からあり、pm.getObjectById() で取得しました)、永続化できます。 . Datastore Viewer で、(15) の適切に生成されたキーと ID/名前、割り当てられた姓、(13) の color_key_OID を確認できます。これは非常に有望に見えます。

しかし、その後、DB から Person(15) を取得すると (単純な pm.getObjectById()、トランザクションなし)、割り当てられた姓は正しくありますが、Color(13) ではなく null です! 正しい - Datastore Viewer は正常に動作しますが、私のコードは正常に動作しません。

ああ、問題のあるコードですか?"Person p = pm.getObjectById(Person.class, key);".

(補足: @Unowned コレクションでも同じ問題が発生しています (Datastore Viewer の値のリストは適切ですが、コードの Collection フィールドは null です)。クラスパス上の JDO jar は「datanucleus-api-jdo-3.1.1. jar」と「jdo-api-3.0.1.jar」なので、@Unowned をサポートしていると仮定します。not-@Unowned フィールドに問題はありません。永続化またはフェッチ時に例外は発生せず、フィールド値として単純な null が返されます。)

4

4 に答える 4

3

色を「熱心に取得」するようにマークするか

@Persistent(defaultFetchGroup="true")
@Unowned
Color color

または、次のように独自の fetchgroup を定義します。

@FetchGroup(name="eager", members={@Persistent(name="color")})
@PersistenceCapable
public class Person {

必要に応じて、取得するグループを指定して使用します。

PersistenceManager pm = pmf.getPersistenceManager();
pm.getFetchPlan().addGroup("eager");
于 2013-04-24T21:55:19.793 に答える
0

この問題は、永続マネージャーではなくクエリにフェッチ グループを追加することで解決できました。

    PersistenceManager pm = PMF.get().getPersistenceManager();
    logger.info("EVENTS FETCH GROUPS : " + pm.getFetchPlan().getGroups());
    /*pm.getFetchPlan().addGroup("eventFetchGroup");
    pm.getFetchPlan().setMaxFetchDepth(2);*/
    Query q = pm.newQuery(Event.class);
    q.getFetchPlan().addGroup("eventFetchGroup");
    logger.info("EVENTS FETCH GROUPS : " +q.getFetchPlan().getGroups());
    q.setFilter("date >= fromDate && date <= toDate");
    q.declareParameters("java.util.Date fromDate, java.util.Date toDate");
于 2016-01-09T16:15:02.813 に答える
0

私はあなたが説明したのと同じ問題を抱えています。DataNucleus は、オブジェクトのライフサイクル全体を記述する必要があると述べています。私の場合、close() 関数で PersistenceManager を閉じる前に、人物オブジェクトから強制的に色を取得することで問題は解決しました。

JDO は遅延ロード手法を使用してオブジェクトを取得することを思い出してください。

于 2013-04-15T13:31:54.240 に答える
0

@Unowned リストの 1 つで同じ問題に直面していました。配列が完全にフェッチされる他の2つがありました。

この問題を解決したのは、プロパティの名前をより大きなものに変更することでした。あなたの場合、プロパティ名を「color」から「myfavoritecolor」などのより大きなものに変更するようなものです。

于 2013-11-26T13:14:40.870 に答える