2010-07-13 14 views
5

बंद करने के बाद आप क्वेरी परिणाम कैसे उपलब्ध कराते हैं मैं GAE सीख रहा हूं और थोड़ा फंस रहा हूं।दृढ़ता प्रबंधक

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

अपवाद मैं यह है: अगर मैं निम्नलिखित का उपयोग करें, एक अंत में साथ यकीन है कि हठ प्रबंधक बंद कर दिया है बनाने के लिए, मैं एक अपवाद है जब वास्तव में नोट वस्तुओं को पढ़ने की कोशिश करते हुए

उत्तर

9

detachable="true" साथ ग्राफ से वस्तु अलग करने का प्रयास करें:

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

नोट: मैं पूरी तरह समझ में nee इसके लिए, कभी-कभी आपको नियंत्रक में ऑब्जेक्ट्स और सूचियों को पुनर्प्राप्त करने की आवश्यकता होती है, पीएम को नियंत्रक में बंद करें, फिर मॉडल को दृश्यों में पास करें। जब तक बेहतर समाधान मुझे ज्ञात नहीं होते हैं, वही है जो मैं जेडीओ/जीएई पर ऐसा कर रहा हूं, अब तक कोई समस्या नहीं है।

सूची:

मुझे ऐसा लगता है कि आप सूची में सभी आइटम अलग करने अगर तुम उन्हें का उपयोग करने के बाद प्रधानमंत्री बंद कर दिया है सक्षम होना चाहते हैं होगा। मैं वस्तुओं की विशिष्ट सूचियों को पाने के लिए इसका उपयोग करता हूं। एक पूर्ण getAll() आकार में बहुत बड़ा हो सकता है।

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; 

} 

कुंजी द्वारा:

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; 

} 

पास Afer आपके पास अलग प्रतिलिपि, जिसके साथ आप काम कर सकते हैं।

संदर्भ: http://www.datanucleus.org/products/accessplatform_1_1/jdo/attach_detach.html

+0

मैं इस भाग को समझता हूं, थोड़ा सा मैं समझ नहीं पा रहा हूं कि यह एक सूची है। क्या मुझे पूरी सूची के माध्यम से पुन: प्रयास करना चाहिए और प्रत्येक आइटम को अलग करना है? – Jacob

+2

हां, इस तरह मैं इसके बारे में गया। मैं इसे एक सूची को अलग करने के लिए नहीं मिला, जब मैं ऐसा करने की कोशिश करता हूं तो मुझे 'org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException' मिलता है: वर्ग "कक्षा" org.datanucleus.store.appengine.query.StreamingQueryResult " यह दृढ़ता से नहीं है। ऐसा लगता है कि यदि आप अलग-अलग वस्तुओं को अलग करना चाहते हैं और पीएम को बंद करना चाहते हैं तो ऐसा करने की ज़रूरत है। – bakkal

+0

मुझे टिप्पणी करनी है। बहुत बहुत धन्यवाद! मैं बाहर निकल रहा था !!! –

1

जब परिणाम सूची में दिया जाता है - वस्तुओं lazily प्राप्त किए गए हैं (केवल जब तुम उनके लिए पूछना)। चूंकि आपका दृढ़ता प्रबंधक बंद है, इसलिए आपको अपवाद मिलता है। ऑब्जेक्ट्स को "अलग करना" से आप दृढ़ता से दृढ़ता से उन्हें पुनर्प्राप्त करने के लिए दृढ़ता प्रबंधक को बता रहे हैं।

0

बाक्कल के उत्तर के अलावा, मैं कहूंगा कि आपको detachable="true" एनोटेशन पैरामीटर की बिल्कुल आवश्यकता है, अन्यथा आप इसे कभी भी काम नहीं करेंगे। ऑब्जेक्ट्स की सूची को अलग करने के लिए, आप pm.detachCopyAll(your_query_result_list) का भी उपयोग कर सकते हैं, जो अलग करने के लिए पुनरावृत्ति के कार्यान्वयन से थोड़ा तेज़ होगा, और आपको कोड की कुछ पंक्तियां छोड़ने देगा। धन्यवाद जेडीओ! ;-) लेकिन जागरूक रहें, इस विधि के परिणामों के स्पष्ट कलाकारों की आवश्यकता है।

यहाँ एक काम कर उदाहरण मैं वर्तमान में मेरा आखिरी App में उपयोग करें (क्वेरी में उपयोग कुंजी एक एन्कोड स्ट्रिंग है):

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. 

मैं उम्मीद है कि यह एक बिट में मदद करता है।

संबंधित मुद्दे