ここにあるようにバグにより
親のオブジェクト、子のオブジェクトのキーは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 件のコメント:
コメントを投稿