سؤال

أحاول تحميل الرسم البياني الكائن الكامل للمستخدم، والذي يحتوي على مجموعة من الطوابق، والتي تحتوي بعد ذلك على مجموعة من البطاقات، على هذا النحو: المستخدم:

@PersistenceCapable(detachable = "true") 
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE) 
@FetchGroup(name = "decks", members = { @Persistent(name = 
"_Decks") }) 
public abstract class User { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    protected Key _ID; 
    @Persistent 
    protected String _UniqueIdentifier; 
    @Persistent(mappedBy = "_Owner") 
    @Element(dependent = "true") 
    protected Set<Deck> _Decks; 
        protected User() 
    { 
    } 
} 

كل سطح يحتوي على مجموعة من البطاقات، على هذا النحو:

@PersistenceCapable(detachable = "true") 
@FetchGroup(name = "cards", members = { @Persistent(name = 
"_Cards") }) 
public class Deck { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key _ID; 
    @Persistent 
    String _Name; 
    @Persistent(mappedBy = "_Parent") 
    @Element(dependent = "true") 
        private Set<Card> _Cards =  new HashSet<Card>(); 
    @Persistent 
        private Set<String> _Tags = new HashSet<String>(); 
    @Persistent 
    private User _Owner; 
} 

وأخيرا، كل بطاقة:

@PersistenceCapable 
public class Card { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key _ID; 
   @Persistent 
    private Text _Question; 
    @Persistent 
    private Text _Answer; 
    @Persistent 
    private Deck _Parent; 
} 

أحاول استرداد الرسم البياني للكائن بالكامل ثم افصله. أستطيع أن أرى في مصحح الأخطاء التي يتم تحميلها بشكل جيد، ولكن بعد ذلك عندما أحصل على الانفصال، لا يمكنني جعل أي شيء يتجاوز تحميل كائن المستخدم. (لا الطوابق، لا بطاقات). في البداية، حاولت بدون معاملة "لمسة" بمساء الحقول الموجودة على الكائن المرفق قبل الانفصال، لكن ذلك لم يساعد. ثم حاولت إضافة كل شيء إلى مجموعة جلب الافتراضية، ولكن هذا ينشئ فقط تحذيرات حول GAE غير دعم ينضم. حاولت تحديد عمق جلب خطة الجلب إلى -1، لكن ذلك لم يفعل ذلك. أخيرا، حاولت استخدام Fetchgroups كما ترون أعلاه، ثم استرجع مع التعليمات البرمجية التالية:

    PersistenceManager pm = _pmf.getPersistenceManager(); 
                pm.setDetachAllOnCommit(true); 
                pm.getFetchPlan().setGroup("decks"); 
                pm.getFetchPlan().setGroup("cards"); 
                Transaction tx = pm.currentTransaction(); 
                Query query = null; 
            try { 
                tx.begin(); 
                        query = pm.newQuery(GoogleAccountsUser.class); //Subclass of User 
                        query.setFilter("_UniqueIdentifier == TheUser"); 
                        query.declareParameters("String TheUser"); 
                        List<User> results = (List<User>)query.execute(ID); //ID = Supplied 
parameter 
                        //TODO: Test for more than one result and throw 
                        if(results.size() == 0) 
                        { 
                                tx.commit(); 
                                return null; 
                        } 
                        else 
                        { 
                                User usr = (User)results.get(0); 
                                //usr = pm.detachCopy(usr); 
                                tx.commit(); 
                                return usr; 
                        } 
            } finally { 
                query.closeAll(); 
                    if (tx.isActive()) 
                    { 
                        tx.rollback(); 
                    } 
                pm.close(); 
            } 

هذا أيضا لا يعمل، وأنا نفاد الأفكار ...

هل كانت مفيدة؟

المحلول

أنا متأكد من أن قراءة السجل (مستوى التصحيح) سيخبرك بالطريقة، لأنها تخبرك بالتأكيد عندما تنفصل عن الأشياء. ربما gae / j لا يحترم التحميل كسول في فصل؟ DataNucleus نفسه يعمل بشكل جيد، مع جميع Datastores الأخرى.

لماذا استدعاء fetchplan.setgroup () عند الكتابة فوق جميع المجموعات الموجودة؟ Addgroup () يجعلني أكثر حساسية بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top