GAE,JDO:Add,Move&删除有序列表的实体

时间:2012-10-26 03:55:07

标签: java google-app-engine jdo

嗨我有一个父实体说A有子实体列表说List< B>孩子。

我需要维护子实体的顺序,因为它对我的应用程序很重要。

我做的方式是使用: https://developers.google.com/appengine/docs/java/datastore/jdo/relationships#Owned_One_to_Many_Relationships

订购集合如何维护订单。

@Persistent

@Element(dependent = "true")

@Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="index ASC"))

private List objects;

现在我使用:

添加到列表中

newObj.setIndex(0);

for (int i = 0; i < objList.size(); i++) {

objList.get(i).setIndex(i + 1);

}

objList.add(newObj);

使用以下方式移动:

if (direction.equalsIgnoreCase("up")) {

objList.get(index).setIndex(index - 1);

objList.get(index - 1).setIndex(index);

}

else if (direction.equalsIgnoreCase("down")) {

objList.get(index).setIndex(index + 1);

objList.get(index + 1).setIndex(index);

}

使用以下命令删除:

for (int i = index + 1; i < objList.size(); i++) {

objList.get(i).setIndex(i - 1);

}

objList.remove(index);

这是正确的方法吗?添加&amp;移动似乎有效。但删除表现得很奇怪。随机objs被删除,列表处于完全不一致的状态!

GAE:1.7.2

DataNucleus Enhancer(版本3.1.0.m2)

2 个答案:

答案 0 :(得分:0)

尝试在调整所有索引之前调用objList.remove()。

答案 1 :(得分:0)

在索引处删除仅对索引列表(即标准JDO列表)有实际意义,并且您没有使用它。当您使用DataNucleus和RDBMS调用它时会抛出异常。很明显,GAE没有绕过这样的细节,但逻辑会暗示它。从有序列表中删除某些内容确实应该调用 remove(Object)

使用此索引列的设置移动对象可能会在下次读入时工作... “排序”子句唯一能做的就是在读取它们时对它进行排序。