2010-03-08 64 views
2

我试图加载用户的全部的对象图,它包含一个 收集甲板,然后包含的卡的集合,作为 例如: 用户:问题拆卸整个对象图中GAE-J与JDO

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

这也不起作用,而我运行的想法......

回答

1

我确定阅读日志(调试级别)会告诉你更多,因为它肯定会告诉你什么时候分离事物。也许GAE/J不尊重分离时的延迟加载? DataNucleus本身与所有其他数据存储一起工作良好。

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

+0

将setGroup()更改为addGroup()完全修复了它。谢谢!令人惊讶的是,我几乎所有的东西都可以正确使用,而且一个小小的错误使我耗费数日时间......我猜想它会发生什么,以致于不熟悉复杂框架。 – tempy 2010-03-09 15:12:39