Google App Engine не сохраняет список объектов в классе - PullRequest
0 голосов
/ 24 марта 2011

Я использую реализацию DataNeucleus JDO, которая отлично работает на моем тестовом сервере, но не работает хорошо при развертывании. Я новичок в GAE, и я знаю, что не все функции DataNeucleus поддерживаются.Не уверен, как заставить это работать.

У меня есть класс сказать:


@PersistenceCapable
public class MyInfoClass {


  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  Key key;

  @Persistent(mappedBy = "myInfoClass")
  private List <BuddyData> buddyList;

  ...
}




И BuddyData


@PersistenceCapable
public class BuddyData {

...
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    Key key;

    // the one-to-many rel to MyInfoClass -> BuddyData
    @Persistent
    private MyInfoClass myInfoClass;

....

}




Я сохраняю данные в хранилище данных, как показано нижекоторый работает в тестовой среде, но не работает при развертывании в ядре приложения.


        PersistenceManager pm = PMF.get().getPersistenceManager();
        Transaction tx = pm.currentTransaction();
        try {
            tx.begin();
            //NOTE : myInfo is the persistent MyInfoClass object retrieved from the datastore
            myInfo.getBuddyList().add(new BuddyData(email));
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
            pm.close();
        }


1 Ответ

1 голос
/ 24 марта 2011

Собственные отношения могут быть довольно сложными в GAE. Я помню, как сражался с ними часами.

Прежде всего, у вас есть собственный цикл отношений. Я сомневаюсь, что это поддерживается GAE. Таким образом, вам нужно изменить одну из сущностей, чтобы использовать Key для ссылки на другую, вместо прямой связи с объектом (т.е. отношения с собственностью).

Например:

@PersistenceCapable
public class BuddyData {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    Key key;

    // use Key instead of MyInfoClass
    @Persistent
    private Key myInfoClass;
}

Во-вторых, при получении списка BuddyData убедитесь, что PersistenceManager все еще открыт. Если вы делаете это так:

PersistenceManager pm = PMF.get().getPersistenceManager();
MyInfoClass info = pm.getObjectById(MyInfoClass.class, key);
pm.close();
info.getBuddyList();

Тогда содержимое buddyList будет пустым.

В этом случае вам нужно либо переместить pm.close() после getBuddyList(), либо установить его в качестве группы извлечения по умолчанию (см. Ниже), которая будет охотно выполнять предварительную выборку всего содержимого с потенциальной потерей производительности.

@Persistent(mappedBy = "myInfoClass", defaultFetchGroup = "true")
private List <BuddyData> buddyList;

Удачи.

...