2012-05-08 14 views
5

द्वारा पुनर्प्राप्त नहीं किया गया है, मैं ऐप इंजन के जेडीओ कार्यान्वयन के स्थानीय-विकास संस्करण का उपयोग कर रहा हूं। जब मैं किसी ऑब्जेक्ट से पूछताछ करता हूं जिसमें एम्बेडेड फ़ील्ड्स के रूप में अन्य ऑब्जेक्ट्स होते हैं, तो एम्बेडेड फ़ील्ड शून्य के रूप में वापस आते हैं।एम्बेडेड जेडीओ फील्ड क्वेरी

उदाहरण के लिए, मान लीजिए कि इस मुख्य उद्देश्य यह है कि मैं बने हूं:

@PersistenceCapable 
public class Branch { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String name; 

    @Persistent 
    private Address address; 

      ... 
} 

और यह मेरा एम्बेडेड वस्तु:

@PersistenceCapable(embeddedOnly="true") 
public class Address { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String street; 

    @Persistent 
    private String city; 

      ... 
} 

निम्नलिखित कोड एम्बेड किया गया ऑब्जेक्ट को पुनः प्राप्त नहीं करता है:

PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager(); 

    Branch branch = null; 
    try { 
     branch = pm.getObjectById(Branch.class, branchId); 
    } 
    catch (JDOObjectNotFoundException onfe) { 
     // not found 
    } 
    catch (Exception e) { 
     // failed 
    } 
    finally { 
     pm.close(); 
    } 

क्या किसी के पास इसका समाधान है? मैं अपने एम्बेडेड पता फ़ील्ड के साथ शाखा ऑब्जेक्ट को कैसे पुनर्प्राप्त कर सकता हूं?

उत्तर

8

मुझे एक ही समस्या थी और पाया कि एम्बेडेड फ़ील्ड डिफ़ॉल्ट fetch समूह में शामिल नहीं हैं। आवश्यक फ़ील्ड लोड करने के लिए आपको दृढ़ता प्रबंधक को बंद करने से पहले इसके लिए गेटर को कॉल करना होगा या fetch समूह को सभी फ़ील्ड लोड करने के लिए सेट करना होगा।

यह निम्नलिखित ...

branch = pm.getObjectById(Branch.class, branchId); 
pm.close(); 
branch.getAddress(); // this is null 

branch = pm.getObjectById(Branch.class, branchId); 
branch.getAddress(); // this is not null 
pm.close(); 
branch.getAddress(); // neither is this 

मतलब है तो, आप इस प्रकार अपने कोड को बदलने की जरूरत होगी:

Branch branch = null; 
try { 
    branch = pm.getObjectById(Branch.class, branchId); 
    branch.getAddress(); 
} 
catch (JDOObjectNotFoundException onfe) { 
    // not found 
} 
catch (Exception e) { 
    // failed 
} 
finally { 
    pm.close(); 
} 

वैकल्पिक रूप से, आप अपने समूह लाने के रूप में सभी क्षेत्रों को शामिल करने के लिए सेट कर सकते निम्नानुसार है ...

pm.getFetchPlan().setGroup(FetchGroup.ALL); 
branch = pm.getObjectById(Branch.class, branchId); 
pm.close(); 
branch.getAddress(); // this is not null 
+0

तत्काल उत्तर के लिए धन्यवाद! मैं इसका परीक्षण करूंगा और आपको बता दूंगा कि यह काम करता है या नहीं। – Chania

+0

यदि कोई फ़ील्ड सक्रिय fetch समूह में है तो यह स्पष्ट रूप से प्राप्त किया जाना चाहिए। यदि आप कहते हैं कि ऐसा नहीं है तो क्यों एक सरल टेस्टकेस प्रदान नहीं करें और http://code.google.com/p/datanucleus-appengine/issues/list पर इसकी रिपोर्ट न करें इसकी रिपोर्टिंग का अर्थ यह नहीं है कि परियोजना में शामिल कोई भी नहीं जानता इसके बारे में – DataNucleus

+0

मुझे यकीन नहीं है कि यह एक बग है या जेडीओ विनिर्देश का एक हिस्सा है। मुझे याद है कि एम्बेडेड फ़ील्ड की आलसी लोडिंग जेडीओ चश्मा में थी, लेकिन मुझे अब यह नहीं मिल रहा है। – Cengiz

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