#java #google-app-engine #persistence #entity-relationship #objectify
#java #google-app-engine #сохранение #сущность-отношение #объективировать
Вопрос:
Я новичок в Objectify и пытаюсь реализовать отношение «один ко многим». У меня есть сущности Organization и entity Person. Организация имеет @Transient
список свойств< Person > contactPeople . У класса Person есть @Parent
ключ свойства< Организация> organizationKey, который я могу установить с помощью setter .
Я бы хотел сохранить contactPeople в @PrePersist
обработчике организации. Для этого мне нужно лично установить родительский ключ.
Вики здесь говорится: «Вы не можете обновлять поля @Id или @Parent в обратном вызове @prePersist; к этому времени объект низкого уровня уже создан с полным ключом, поэтому его можно передать в качестве необязательного параметра».
Я не уверен, что это все еще точная информация? Потому что ключ com.google.appengine.api.datastore.Entity
объекта, который я получаю в PrePersist
обработчике, имеет ключ, который буквально говорит «no-id-yet».
Как бы вы это реализовали?
Спасибо!
Обновление от 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 сегодня.
Комментарии:
1. Из любопытства я сделал это :
@PrePersist void onPersist(Objectify ofy) { if (id == null) id = ofy.getFactory().allocateId(getClass()); }
. И оказалось, что этот выделенный идентификатор переопределяется числом, которое выше, чем я выделил, что приводит меня к выводу, что Wiki устарела, а ключ создается после события prePersist. Грустно.2. Джефф Шнитцер, автор Objectify, ответил на мой вопрос. «Я вообще думаю, что это плохая идея помещать операции сохранения внутри объектов pojos. Это одна из причин. Эта информация является точной. Вы не можете делать то, что предлагаете. Я не могу придумать обходной путь. Джефф»
Ответ №1:
Хм, кажется, вам нужно создать Dao перед вашими моделями данных. Итак, вы сможете сделать что-то вроде:
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 требует много вещей для обработки вашим собственным кодом, так что это обычное дело
Комментарии:
1. По словам автора Objectify, ситуация с Objectify4 будет лучше. Я обновил свой вопрос информацией.