2009-09-10 11 views
12

मैं जावा के साथ Google AppEngine का उपयोग कर रहा हूं।ऐपइंजिन डेटास्टोर: "आईडी के साथ ऑब्जेक्ट ... एक अलग ऑब्जेक्ट मैनेजर द्वारा प्रबंधित किया जाता है"

Object with id "[email protected]" is managed by a different Object Manager 

मैं नहीं जानता कि इसका क्या मतलब है या कैसे या जहाँ इस त्रुटि पर प्रलेखन देखने के लिए इसे ठीक करने के: जब मैं कुछ डेटासंग्रह सुविधाओं का उपयोग, मैं एक त्रुटि संदेश हो रही है। क्या कोई मेरी मदद कर सकता है? कोड मैं का उपयोग कर रहा है:

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class School { 
@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private String shortname; 

@Persistent 
private String fullname; 

@Persistent 
@Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="code asc")) 
private List<Teacher> Teachers; 

... 

public Teacher FindOrCreateTeacher(String code) 
{ 
    // Can we find the teacher without any database code? 
    Teacher newTeacher = FindTeacher(code); 
    if (newTeacher != null) 
     return newTeacher; 

    // Create the teacher: 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    Transaction tx = pm.currentTransaction(); 
    try { 
     tx.begin(); 
     for (Teacher teacher : Teachers) { 
      if (teacher.getCode() == code) { 
       tx.rollback(); 
       return teacher; 
      } 
     } 
     newTeacher = new Teacher(code); 
     Teachers.add(newTeacher); 
     pm.makePersistent(newTeacher); 
     pm.makePersistent(Teachers); 
     tx.commit(); 
    } finally { 
     tx.commit(); 
    } 
    return newTeacher; 
} 

मुझे विश्वास है कि "private List<Teacher> Teachers;" को संदर्भित करता है एक "स्वामित्व, कई लोगों के लिए एक" संबंध।

उत्तर

9

एक सतत वस्तु केवल एक persistenceManager द्वारा "प्रबंधित" हो सकती है। डेटा न्यूक्लियस में इसे "ऑब्जेक्टमेनगर" द्वारा आंतरिक रूप से समर्थित किया जाता है। संदेश कहता है कि आप एक पीएम द्वारा एक अलग पीएम के साथ प्रबंधित एक वस्तु को जोड़ने की कोशिश कर रहे हैं। आप आसानी से डीबग कर सकते हैं कि

JDOHelper.getPersistenceManager(obj); 

प्रत्येक (लगातार) वस्तु के लिए प्रधानमंत्री को प्रिंट से जब से तुम परिभाषित नहीं करते जहां संदेश, से भी बहुत कुछ कहा जा सकता है नहीं आता है। डेटा न्यूक्लियस लॉग प्रविष्टियां आपको उससे अधिक तरीके से बताएंगी।

समापन PM हमेशा के लिए (जब तक आप संसाधन लीक चाहते हैं)

+0

दिलचस्प स्पष्टीकरण। +1 – VonC

+0

क्या आप मुझे बता सकते हैं कि प्रधान मंत्री के उदाहरण के लिए उपयुक्त जीवनकाल क्या है? मान लीजिए कि मैं एक वेब ऐप लिख रहा हूं। क्या मुझे इसे प्रत्येक पृष्ठ अनुरोध पर खोलना और बंद करना चाहिए? या प्रक्रिया के जीवनकाल के लिए एक उदाहरण खुला रहता है? (यदि मैं लेनदेन करता हूं लेकिन प्रधान मंत्री को बंद नहीं करता, तो क्या इसका मतलब यह है कि सबसे खराब होता है स्मृति मेमोरी है? मेरा मतलब है, मेरा डेटा सुरक्षित है?) –

+1

प्रक्रिया कितनी लंबी है? एक सामान्य वेब सिस्टम प्रति अनुरोध पीएम का उपयोग करेगा। पीएम बनाना महंगा नहीं है (पीएमएफ * बनाना * महंगा है)। यदि टीएक्सएन का उपयोग करते हैं तो आप सुरक्षित रूप से पीएम ओपन छोड़ सकते हैं ... जब तक आप उस पीएम के साथ गैर-लेनदेन अद्यतन नहीं कर रहे हैं। – DataNucleus

3

जैसा कि this ticket में दिखाया गया है, क्या आपको अपराह्न (PersistenceManager) बंद नहीं करना चाहिए?

} finally { 
    tx.commit(); 
    pm.close(); 
} 
+0

मैंने मूल रूप से सोचा था कि इससे मेरी समस्या हल हो गई है, लेकिन ऐसा नहीं है। शुरुआत के लिए, मुझे अभी भी पता नहीं है कि क्या हो रहा है और दृढ़ता प्रबंधक का समापन क्यों जरूरी है, या जब इसे किया जाना चाहिए। दूसरा, एपइंजिन दस्तावेज पर्सिस्टेंस मैनेजर के साथ सिंगलटन पैटर्न के उपयोग को प्रोत्साहित करता है, और pm.close() का मतलब यह होगा कि आप शेष प्रक्रिया के लिए Google डेटास्टोर के साथ और कुछ नहीं कर सकते हैं। पीएमएफ के साथ –

+0

सिंगलटन पैटर्न, प्रधान मंत्री नहीं। pm.close() * नहीं * pmf.close() – DataNucleus

2

DataNucleus एक आवश्यक बात है,

pm.close(); टिप के लिए धन्यवाद। मैं एक उन्हें

em = EMF.get().createEntityManager();

साथ एक प्रश्न बना रहा था और पहले एक बंद किए बिना एक दूसरे से साथ प्रतिबद्ध बना रही है।

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