2009年4月29日水曜日

JDOの1対多

結構はまりました。
ここにあるようにバグにより
親のオブジェクト、子のオブジェクトのキーはKeyにする必要があるようです。
※子は仕様にも記述してありますけどね。

まず親側のクラスを


class Shop {

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

@Persistent(mappedBy = "shop")
private List<Image> imageList;

・・・getter,setterは未記述

}


と記述します。
Keyは通常のIDENTITY(Longで自動設定した場合)と同一で、特に登録などの際に
設定する必要はありません。

そして子のクラスを


class Image {

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

@Persistent
private Shop shop;
・・・getter,setterは未記述
}


というように記述します。

で登録は以下のようにします。


PersistenceManager pm = SessionManager.get().getPersistenceManager();
Transaction tx = null;
try {
String id = mogForm.getId();
Long lngId = Long.valueOf(id);

tx = pm.currentTransaction();
tx.begin();

log.warning(id);
Shop oldShop = pm.getObjectById(Shop.class, lngId);

List<Image> imageList = oldShop.getImageList();
if ( imageList == null ) {
imageList = new ArrayList<Image>();
}

imageList.add(image);
image.setShop(oldShop);

tx.commit();
} finally {
if ( tx != null && tx.isActive() ) {
tx.rollback();
}
pm.close();
}


Shopを検索してImageListを取得して
そこに追加を行ってコミットをかけています。
トランザクションをかけてあげないとエラーになります。
このクラスを登録するというより、親に追加して更新しているイメージです。
※子の追加でも可能かは検証してません。

扱っているShopクラスのidの値は
KeyクラスのgetId()により取得したLong値(Stringで使ってる)になります。
そのまま使用すると"Shop(4)"みたいな値になって検索の際にエラーになります。


・・・あぁ。。。やっとこさ関連が実装できた!

0 件のコメント: