مشكلة فصل الرسم البياني للكائن بالكامل في GAE-J مع JDO
-
18-09-2019 - |
سؤال
أحاول تحميل الرسم البياني الكائن الكامل للمستخدم، والذي يحتوي على مجموعة من الطوابق، والتي تحتوي بعد ذلك على مجموعة من البطاقات، على هذا النحو: المستخدم:
@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 () يجعلني أكثر حساسية بالنسبة لي.