非常に簡単で古典的なセットアップがあるとしましょう: 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 が返されます。)