Использование расширения упорядочивания списка в DataNucleus приводит к пустому списку - PullRequest
4 голосов
/ 18 марта 2012

Итак, у меня есть однонаправленное отношение один-ко-многим, когда я хочу сохранить детей в упорядоченном списке.Поскольку у них уже есть свойство 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

1 Ответ

0 голосов
/ 12 октября 2012

Я использую плагин GAE 1.7.0 с JDO, и мой сценарий точно такой же. У меня есть список предметов, и мне нужно поддерживать их порядок.

Теперь я использовал приложение в течение длительного периода времени без внесения вышеуказанных изменений (без реализации функции).

Сегодня я реализовал функцию заказа, используя статью, и данные не извлекаются! данные присутствуют в базе данных , но не выбираются во время загрузки родительского объекта. Несмотря на то, что список помечен:

@Persistent(defaultFetchGroup = "true")</p> <p>@Element(dependent = "true")

...