使用DataNucleus的列表排序扩展导致空列表

时间:2012-03-18 17:14:46

标签: google-app-engine google-cloud-datastore datanucleus

所以,我有一个单向的一对多关系,我希望将孩子保持在有序列表中。由于他们已经拥有“索引”属性,我尝试遵循http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html上的建议并使用“list-ordering”扩展来使用index-property来确定子节点的顺序,而不是使用auto-生成一个。

不幸的是,只要我添加注释,就会停止返回子项,只给我一个空列表。

我用这个简单的例子重新创建了问题:

@PersistenceCapable(detachable = "true")
@FetchGroup(name = "parent.children", members = {@Persistent(name = "children")})
public class Parent {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    @Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="index ASC"))
    private List<Child> children;

    // getters/setters
}

@PersistenceCapable(detachable = "true")
public class Child {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private Integer index;

    // getters/setters
}

DAO:

public void save(T entity) {
    PersistenceManager pm = getPersistenceManager();
    Transaction tx = pm.currentTransaction();
    try {
        tx.begin();
        pm.makePersistent(entity);
        tx.commit();
    } finally {
        if(tx.isActive())
            tx.rollback();
        pm.close();
    }
}

public T get(Key key, String... fetchGroups) {
     PersistenceManager pm = getPersistenceManager();
     Transaction tx = pm.currentTransaction();
     addFetchGroups(pm, fetchGroups);
     try {
         tx.begin();
         pm.setDetachAllOnCommit(true);
         T entity = (T) pm.getObjectById(entityClass, key);
         tx.commit();
         return entity;
     } finally {
         if(tx.isActive())
             tx.rollback();
         pm.close();
     }
}

测试代码:

Parent parent = new Parent();
Child child = new Child(); 
child.setIndex(10);
parent.getChildren().add(child);
mParentDao.save(parent);

Parent parent2 = mParentDao.get(parent.getKey(), "parent.children");

我有什么特别的错误吗?

[编辑]以下是相关的日志输出:

数据存储:将类型PARENT的实体与关键PARENT(no-id-yet)放在一起 数据存储:将关键PARENT(3)/ CHILD(no-id-yet)的实体CHILD放入实体中 数据存储:INDEX:10
数据存储:提交的数据存储事务:0
数据存储:启动新数据存储事务:1
数据存储:获得具有关键父母(3)的亲切父母的实体 Datastore.Retrieve:准备查询类型为CHILD的父母(3)的所有子女 Datastore.Retrieve:添加了排序:索引ASCENDING
Datastore.Retrieve:查询结果为0 数据存储:提交的数据存储事务:1

1 个答案:

答案 0 :(得分:0)

我使用GAE插件1.7.0和JDO,我的场景完全一样。我有一个项目列表,我也需要维护他们的订单。

现在我使用该应用程序很长一段时间而没有进行上述更改(未实现该功能)。

今天我使用文章实现了订单功能,但未检索到数据!数据存在于数据库中,但在父对象加载期间不会获取。即使列表标有:

@Persistent(defaultFetchGroup = "true")

@Element(dependent = "true")