JDO分离对象,然后获取该对象的arraylist

时间:2011-12-14 22:14:55

标签: java gwt jdo gwt-rpc datanucleus

我有两个类保存在Google数据存储区中。包含产品详情的arraylist的类产品。现在我很难让arraylist回到我身边。 类产品是可拆卸的,当我尝试访问对象内的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个类是

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

我正在使用的方法是在de 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;
}

1 个答案:

答案 0 :(得分:2)

为什么不按照该消息的建议?如果要将其分离,请将该字段放在提取组中。 DataNucleus的文档清楚地说明了如何做到这一点