2011-12-14 28 views
1

的数组列表我有2个班,其得到保存在谷歌的数据存储。该产品包含产品细节的阵列列表。现在我很难让ArrayList返回给我。 类产品是可拆卸的,当我尝试存取权限对象内部ArrayList中我得到的错误:JDO分离对象,然后获取该对象

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. 

任何人都可以解释如何我还可以分离从谷歌的数据存储ArrayList中?

2类即时通讯使用的是

@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); 
    } 
    } 
} 

CLASSE产品详细

@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. 
} 

我使用的梅索德是德DAO实现返回的对象与有ArrayList的是。

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所以我不期待检索和访问在同一个网页请求时要分离的对象。渴望和获取组是一种选择,但我很好奇为什么我需要。我的猜测是当我改变另一个错误的配置设置时引入的。 – 2012-05-31 15:54:26