2011-12-14 4 views
1

Googleのデータストアに保存される2つのクラスがあります。製品詳細のarraylistを含むクラスの製品です。今私はarraylistが私に戻って戻ってくるのは苦労している。 クラスの製品は、着脱可能であると私はオブジェクトの内部のArrayListをアクセスもしようとすると、私はエラーを取得:JDOオブジェクトをデタッチしてオブジェクトのarraylistを取得します

You have just attempted to access field "productDetailsArray" yet this field was not detached when you detached the object. Either dont access this field, or detach it when detaching the object. 

誰もが、私はまた、GoogleのデータストアからのArrayListを切り離すことができますどのように説明できますか?

2クラスが使用してIMは

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true") 
public class Product implements Serializable{ 
    private static final long serialVersionUID = 1L; 
    private static final Logger log = Logger.getLogger(Product.class.getName()); 
    @PrimaryKey 
    @Persistent 
    private String productNaam; 
    @Persistent 
    private String categorie; 
    @Persistent 
    private ArrayList<ProductDetails> productDetailsArray = new ArrayList<ProductDetails>(); 

    //getters and setter below. 

    // I use this methode to fix a error resulting the arraylist from being org.datanucleus.sco.backed.ArrayList 
    public void fix() { 
    log.info("Fix()"); 
    ArrayList<ProductDetails> a = new ArrayList<ProductDetails>(); 
    Iterator<ProductDetails> itr = productDetailsArray.iterator(); 
    while (itr.hasNext()) { 
     ProductDetails p = itr.next(); 
     log.info(p.getPlaats()); 
     a.add(p); 
    } 
    } 
} 

クラッセのproductdetails

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true") 
public class ProductDetails implements Serializable{ 
    private static final long serialVersionUID = 1L; 
    @PrimaryKey  
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
    private String encodedKey; 
    @Persistent 
    private String winkel, plaats; 
    @Persistent 
    private double prijs; 
    //getters and setters here. 
} 

ある私が使用しているMethodeのは、そこのArrayListにオブジェクトを返すために、デDAOの実装にされています。

public ArrayList<Product> productList() { 
    PersistenceManager pm = PmfSingleton.get().getPersistenceManager(); 
    ArrayList<Product> products = new ArrayList<Product>(); 
    try { 
     products.clear(); 
     pm.currentTransaction().begin(); 
     Extent<Product> ex = pm.getExtent(Product.class, true); 
     Iterator<Product> itr = ex.iterator(); 
     while(itr.hasNext()) { 
      Product tempProduct = itr.next(); 
      Product product = pm.detachCopy(tempProduct); 
      //ArrayList<ProductDetails> pd = new ArrayList<ProductDetails>(product.getProductDetails()); 
      product.fix(); 
      products.add(product); 
     } 
     pm.currentTransaction().commit(); 
     ex.closeAll(); 
    } catch (Exception e) { 
     pm.currentTransaction().rollback(); 
     throw new RuntimeException(e); 
    } finally { 
     pm.close(); 
    } 
    return products; 
} 

答えて

2

なぜそのメッセージのアドバイスに従わないのですか?フェッチ・グループにフィールドを置くと、フェッチ・グループをデタッチします。 DataNucleusのためのドキュメントは、それを行う方法を明確に教えてくれます。

+0

私はSpringのOpenEntityManagerInViewFilterを使用していますので、同じWebリクエストのためにオブジェクトを取得してアクセスする際にオブジェクトを取り外す必要はありません。熱心なグループやフェッチグループもオプションですが、私はなぜそれが必要なのか不思議です。私の推測では、これは別のエラーの設定を変更したときに導入されたものです。 –

+0

私は、たとえばManyToOneで注釈が付けられたフィールドを持っていませんでした。私のケースでは、GAEの単一の親の制限のための一時的で分離したキーフィールド –

+0

この人の質問とは関係がありません。あなたが問題を抱えている場合は、あなた自身の質問であなた自身の質問を提出してください。 – DataNucleus

関連する問題