JDO отсоединяет объект и затем получает массив этого объекта - PullRequest
1 голос
/ 15 декабря 2011

У меня есть 2 класса, которые сохраняются в хранилище данных Google. Класс продукта, который содержит массив productdetails. теперь мне тяжело вернуть мне архивиста. Продукт класса является отсоединяемым, и когда я пытаюсь получить доступ к массиву внутри объекта, я получаю сообщение об ошибке:

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 от хранилища данных Google?

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

Подробная информация о товаре

@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 для возврата объектов с таким массивом.

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 Ответ

2 голосов
/ 15 декабря 2011

Почему бы просто не следовать советам этого сообщения? Поместите поле в группу извлечения, если вы хотите отсоединить его. Документы для DataNucleus достаточно ясно рассказывают, как это сделать

...