2010-07-13 29 views
5

GAE'yi öğreniyorum ve biraz takılıyorum.Kalıcılık yöneticisini kapattıktan sonra sorgu sonuçlarını nasıl hazırlıyorsunuz?

Object Manager has been closed 
org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed 
    at org.datanucleus.ObjectManagerImpl.assertIsOpen(ObjectManagerImpl.java:3876) 
    at org.datanucleus.ObjectManagerImpl.getFetchPlan(ObjectManagerImpl.java:376) 
    at org.datanucleus.store.query.Query.getFetchPlan(Query.java:497) 
:

public class Notes { 
    public List<Note> getAll() { 
    PersistenceManager pm = PMF.instance().getPersistenceManager(); 

    try { 
     Query query = pm.newQuery("select from com.uptecs.google1.model.Note order by subject"); 
     return (List<Note>) query.execute(); 
    } finally { 
     pm.close(); 
    } 
    } 
} 

alıyorum istisna şudur: Ben kalıcılık yöneticisi kapalı olduğundan emin olmak için bir son olarak bulunan aşağıdakiler kullanırsanız aslında Not nesneleri okumaya çalışırken, bir istisna olsun

cevap

9

detachable="true" ile grafikten nesneyi ayrılması deneyin:

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true") 
public class Note { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long key; 
... 
} 

Not: tamamen nee anlıyorum Bunun için bazen bir denetleyicideki nesneleri ve listeleri almanız, denetleyicideki PM'yi kapatmanız ve sonra modelleri görüntülemeye geçirmeniz gerekir. Bana daha iyi çözümler tanınana kadar, şu ana kadar hiç sorun yaşamadan JDO/GAE'de bunu yapıyorum.

listesi:

Size PM kapandıktan sonra onlara kullanabilmek için isterseniz listedeki tüm öğeleri ayırmak zorunda kalacak geliyor bana. Belirli öğeler listesini almak için bunu kullanırdım. Tam bir getAll() boyutu çok büyük olabilir. Anahtar By

public List<Note> getList(){ 
    List<Note> detachedList=null, list=null; 
    try { 
     String query = "select from " + Note.class.getName(); 
     pm = PMF.get().getPersistenceManager(); 
     list = (List<Note>)pm.newQuery(query).execute();    
     detachedList = new ArrayList<Note>(); 
     for(Note obj : list){ 
      detachedList.add(pm.detachCopy(obj)); 
     } 

    } finally { 
     pm.close(); 
    } 
    return detachedList; 

} 

: yakın Afer

public Note findByKey(Long key) { 
    Note detachedCopy=null, object=null; 
    try{ 
     pm= PMF.get().getPersistenceManager(); 
     object = pm.getObjectById(Note.class,key); 
     detachedCopy = pm.detachCopy(object); 
    }catch (JDOObjectNotFoundException e) { 
     return null; // or whatever 
    } 
    finally { 
     pm.close(); // close here 
    } 
    return detachedCopy; 

} 

, çalışırken hangi bir müstakil kopyası var.

Referans: sonuç listesinde döndürülür http://www.datanucleus.org/products/accessplatform_1_1/jdo/attach_detach.html

+0

Anladığım kadarıyla bu bölümü anlıyorum, bu bir liste. Bütün liste boyunca yinelemeli ve her bir maddeyi ayırmam mı gerekiyor? – Jacob

+2

Evet, işte böyle gittim. Ben bir liste ayırmak için alamadım, ben yapmaya çalıştığımda bir 'org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException ': sınıf" sınıf "org.datanucleus.store.appengine.query.StreamingQueryResult" persistable değil.Örneğin ayrı öğelerin ayrıldığını ve PM'yi kapatmasını istiyorsanız, yapılması gereken bu gibi görünüyor. – bakkal

+0

Yorum yapmak zorundayım. Çok teşekkür ederim! Çıldırıyordum! –

1

- nesneleri (onlara sormak yalnızca) lazily alınır. Kalıcı yöneticiniz kapalı olduğu için bir istisna alırsınız. Nesneleri “koparmak” ile etkili bir şekilde inatçı yöneticiye hevesle ulaşmalarını söylüyorsunuz.

0

Bakkal'ın cevabına ek olarak, detachable="true" ek açıklama parametresine kesinlikle ihtiyacınız olduğunu söyleyebilirim, aksi halde asla işe yaramayacaksınız. Nesnelerin bir listesini ayırmak için, pm.detachCopyAll(your_query_result_list)'u da kullanabilirsiniz; bu, ayırmak için yinelemenin uygulanmasından biraz daha hızlı olacaktır ve birkaç satırlık kod yazmanıza izin verecektir. Teşekkürler JDO! ;-) Ancak, bu yöntemin, sonuçlarının açık bir dökümünü gerektirdiğini unutmayın.

İşte şu anda benim son App kullanmak çalışan bir örnektir (sorguda kullanılan anahtar bir kodlanmış dize olan):

pm = PMF.get().getPersistenceManager(); 

Query query = pm.newQuery(TandemSubscription.class); 
query.setFilter("groupSubscriptionKey==groupSubscriptionKeyParam"); 
query.setOrdering("dateRDV desc"); 
query.declareParameters("String groupSubscriptionKeyParam"); 

// Get Data 
@SuppressWarnings("unchecked")   
List<TandemSubscription> savedSubscriptions = 
    (List<TandemSubscription>) query.execute(Key); 

// Detach all objects in the list 
savedSubscriptions = 
    (List<TandemSubscription>) pm.detachCopyAll(savedSubscriptions); 

pm.close(); 

// Now you can use the list and its content. 

bu biraz yardımcı olur umarım.

İlgili konular