2009年4月29日水曜日

JDOの1対多

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

まず親側のクラスを

  1. class Shop {  
  2.   
  3.     @PrimaryKey  
  4.     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
  5.     private Key key;  
  6.   
  7.     @Persistent(mappedBy = "shop")  
  8.     private List<Image> imageList;  
  9.   
  10. ・・・getter,setterは未記述  
  11.   
  12. }  


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

そして子のクラスを

  1. class Image {  
  2.   
  3.     @PrimaryKey  
  4.     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
  5.     private Key key;  
  6.   
  7.     @Persistent  
  8.     private Shop shop;  
  9. ・・・getter,setterは未記述  
  10. }  

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

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

  1. PersistenceManager pm = SessionManager.get().getPersistenceManager();  
  2. Transaction tx = null;  
  3. try {  
  4.  String id = mogForm.getId();  
  5.  Long lngId = Long.valueOf(id);  
  6.   
  7.  tx = pm.currentTransaction();  
  8.  tx.begin();  
  9.   
  10.  log.warning(id);  
  11.  Shop oldShop = pm.getObjectById(Shop.class, lngId);  
  12.    
  13.  List<Image> imageList = oldShop.getImageList();  
  14.  if ( imageList == null ) {  
  15.   imageList = new ArrayList<Image>();  
  16.  }  
  17.    
  18.  imageList.add(image);  
  19.  image.setShop(oldShop);  
  20.    
  21.  tx.commit();  
  22. finally {  
  23.  if ( tx != null && tx.isActive() ) {  
  24.   tx.rollback();  
  25.  }  
  26.  pm.close();  
  27. }  


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

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


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

0 件のコメント: