Итак, у меня есть однонаправленное отношение один-ко-многим, когда я хочу сохранить детей в упорядоченном списке.Поскольку у них уже есть свойство index, я попытался последовать совету http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html и использовать расширение «list-ordering», чтобы использовать это свойство index для определения порядка дочерних элементов вместо использования 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 (пока нет идентификатора)Хранилище данных: Помещение сущности вида CHILD с ключом PARENT (3) / CHILD (пока нет идентификатора)Хранилище данных: ИНДЕКС: 10Хранилище данных: совершенная транзакция хранилища данных: 0Хранилище данных: запущена новая транзакция хранилища данных: 1Datastore: получение сущности вида PARENT с ключом PARENT (3)Datastore.Retrieve: подготовка запроса для всех детей РОДИТЕЛЯ (3) вида CHILDDatastore.Retrieve: добавлена сортировка: индекс ASCENDINGDatastore.Retrieve: у запроса 0 результатов.Хранилище данных: совершенная транзакция хранилища данных: 1