gpt4 book ai didi

java - 使用 JDO 在 GAE-J 中分离整个对象图的问题

转载 作者:行者123 更新时间:2023-11-30 11:59:43 25 4
gpt4 key购买 nike

我正在尝试加载用户的完整对象图,其中包含甲板的集合,然后包含卡片的集合,如这样的:用户:

@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()
{
}
}

每个 Deck 都有一组 Cards,例如:

@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 本身与所有其他数据存储一起工作良好。

为什么在覆盖所有现有组时调用 FetchPlan.setGroup()? addGroup() 对我来说更有意义。

关于java - 使用 JDO 在 GAE-J 中分离整个对象图的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com