Google App Engine で永続化するために、Java ランタイムと JDO/Datastore を使用してアプリケーションを開発しています。次のように、「完全なテーブル」戦略を使用してモデル クラスの階層を作成しました。
@PersistenceCapable
@Inheritance(customStrategy = "complete-table")
@Discriminator(strategy=DiscriminatorStrategy.CLASS_NAME)
public abstract class A {
...
}
@PersistenceCapable
public class B extends A {
...
}
@PersistenceCapable
public class C extends A {
...
}
JDO は、識別子の値を使用して、クラス B および C のエンティティを単一のテーブルに正しく永続化します。ただし、これを実行しようとすると:
PersistenceManager pm = PMF.getPersistenceManager();
B result = pm.getObjectById(B.class, aKeyOfAnObjectOfClassC);
ここaKeyOfAnObjectOfClassC
で、 はタイプ C のオブジェクトを参照する Key です (誰が考えたでしょうか)。JDO は、まつげを打つことなくクラス B のオブジェクトを返します (つまり、ログに奇妙なものは何も表示されません)。A からのメンバーは null とは異なりますが、他のメンバーは null です。私はこの行動に非常に困惑しています。識別子の値は、このようなクエリを実行するときにインスタンスを区別するために使用するためのものではありませんか?
皆さん、ありがとうございました :)