Могу ли я сохранить дочерние объекты в обработчике @PrePersist родительского класса? (Объективировать 3.1b1)

Я новичок в Objectify и пытаюсь реализовать отношения "один ко многим". У меня есть объекты Организация и объект Лицо. У организации есть @Transient свойство Список‹ Person > contactPeople. У класса Person есть свойство @Parent Key‹ Organization > OrganizationKey, которое я могу установить с помощью установщика.

Я хочу сохранить contactPeople в @PrePersist обработчике Organization. Для этого мне нужно установить родительский ключ в Person.

Wiki здесь говорит: "Вы не можете обновить Поля @Id или @Parent в обратном вызове @PrePersist; к этому моменту низкоуровневый Entity уже создан с полным ключом, поэтому его можно передать как необязательный параметр."

Я не уверен, что это все еще точная информация? Потому что ключ объекта com.google.appengine.api.datastore.Entity, который я получаю в обработчике PrePersist, имеет ключ, который буквально говорит «пока нет идентификатора».

Как бы вы это реализовали?

Спасибо!

Обновление от 17 ноября 2011 г.:

В новом Objectify4 мы сможем создавать полуавтоматические отношения следующим образом:

class Beastie {
   @Parent
   @Load
   ParentThing parent;

   @Id Long id;

   @Load({"bigGroup", "smallGroup"})
   SomeThing some;

   @Load("bigGroup")
   List<OtherThing> others;

   @Load
   Ref<OtherThing> refToOtherThing;

   Ref<OtherThing> anotherRef;  // this one is never fetched automatically
}

Здесь находится развивающийся проектный документ новая версия.

Это большие новости. Джон Паттерсон, автор Twig, сегодня присоединился к проекту Objectify.


person expert    schedule 20.10.2011    source источник
comment
Из любопытства сделал так: @PrePersist void onPersist(Objectify ofy) { if (id == null) id = ofy.getFactory().allocateId(getClass()); }. И оказалось, что этот выделенный идентификатор перекрывается номером, который выше, чем я выделил, что приводит меня к выводу, что Wiki устарела, а Key создается после события PrePersist. Грустный.   -  person expert    schedule 20.10.2011
comment
Джефф Шнитцер, автор Objectify, ответил на мой вопрос. В целом я считаю плохой идеей размещать операции сохранения внутри объектов pojos. Это одна из причин. Эта информация является точной. Вы не можете сделать то, что предлагаете. Я не могу придумать обходной путь навскидку. Джефф   -  person expert    schedule 20.10.2011


Ответы (1)


Хм, кажется, вам нужно сделать Дао перед вашими моделями данных. Итак, вы сможете сделать что-то вроде:

Organization organization = ...
List<Person> people = ...
ob.put(organization)
for (Person person: people) {
    person.organizationKey = organization.getKey();
    ob.put(person);
    organization.contactPeopleKeys.add(person.getKey());
}
ob.put(organization)

GAE+Objectify требует много чего для обработки вашим собственным кодом, так что это обычное дело

person Igor Artamonov    schedule 20.10.2011
comment
По мнению автора Objectify ситуация будет лучше в Objectify4. Я обновил свой вопрос информацией. - person expert; 19.11.2011