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

标签 java google-app-engine jdo google-cloud-datastore

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

@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/

相关文章:

java - 使用 JFreeChart 在 Netbeans 中编译错误

java.sql.SQLSyntaxErrorException : unexpected token: (

java - ofy().consistency(Consistency.STRONG).load().type(this.getEntityClass()).count() 是否应该始终返回正确的结果?

google-app-engine - 找不到类 org.datanucleus.api.jdo.PersistenceManagerFactoryClass

java - 如何在 Java Wicket 中使用 YUI 日历?

java - Spring MVC 中的选择框看起来是空的

python - 带有 Google App Engine 的 Google Prediction API

java - GAE 部署 Java8/Java7 错误

java - 谷歌应用程序引擎/JDO : is there a session cache?

java - Java 数据对象 (JDO) 是从哪个版本开始允许使用注释来替代 XML 的?