気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
今回は非所有関係にある複数のエンティティのデータクラスを作成します。

非所有関係にあるエンティティの作成

まず、物品管理システムのエンティティ間の関係をおさらいします。



エンティティ間のリレーションの中で非所有の関係になっているのは、
「物品」と「物品種別」、「物品」と「管理場所」の関係です。
それぞれ、「物品」エンティティがその他のエンティティを参照する関係です。

非所有関係の場合、参照される側のクラスに特別な属性の定義は必要ありません。
参照する側に参照先のエンティティのキーを属性として定義します。

以下は、「物品」を表す「Goods」クラスのコードの一部です。

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Goods {

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

   @Persistent
   private Key goodsKind;

   @Persistent
   private Key location;

// ...
}

これで完了ですが、一点注意しないといけない点があります。Key型のフィールドにセットされるインスタンスが、
意図するエンティティのキー(この場合、物品種別のキー)であるかどうかをチェックしてくれる仕組みはGAEからは
提供されていません。

従って、それを保障するのは、アプリケーションコードの責任になります。

ドキュメントによると、「GAEはJDOの[unowned relationships(非所有関係)]を実装していないので、
その代わりにこの方法を使いなさい」と書かれています。

実装されるとどう変わるのか分かりませんが、今のところこれが唯一の方法のようです。

1つ気ががりな点があります。所有関係と異なり、非所有関係の場合、参照する側のクラスに
参照されるクラスが直接定義されていません。しかも、JDOのクエリでは「結合」を使用できません。

そうなると例えば、物品種別の名称を項目の1つとする物品の一覧を表示したいとなると、
物品と物品種別を別々に取得して、それを結合する必要が有ります。

今のところ、別々に取得して、Mapとかを使って自分で結合するしかないのかなと思っていますが、
それは、次回以降で。

データクラスのソース

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/54-528d9cbc

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。