Каков подходящий способ создания объектов с отношением «один ко многим» с использованием Objectify и RequestFactory? Я прочитал документацию по этим библиотекам, а также просмотрел ряд примеров проектов, таких как listwidget и gwtgae2011. Все они используют аннотацию @Embedded
, а это не то, что мне нужно, потому что она хранит все в одном объекте. Согласно документации, другим вариантом является использование свойства @Parent
в дочерних классах. В моем примере (геттеры/сеттеры удалены для простоты) у меня есть сущности Person
и Organization
, которые определены как
@Entity
public class Person extends DatastoreObject
{
private String name;
private String phoneNumber;
private String email;
@Parent private Key<Organization> organizationKey;
}
и
@Entity
public class Organization extends DatastoreObject
{
private String name;
private List<Person> contactPeople;
private String address;
}
Теперь, если я правильно понял документацию, чтобы сохранить организацию с одним человеком, я должен сначала сохранить организацию, затем установить organizationKey
в ObjectifyService.factory().getKey(organization)
для объекта человека, а затем сохранить его. Мне уже не нравится, что мне приходится перебирать каждый дочерний объект вручную, но использование RequestFactory делает все более запутанным из-за наличия прокси-классов. Как бы я определил классы Organization и OrganizationProxy - с Key‹> или без него? Должен ли я определить что-то подобное в Organization ?
public void setContactPeople(List<Person> contactPeople)
{
for (int i = 0; i < contactPeople.size(); ++i)
{
DAOBase dao = new DAOBase();
Key<Organization> key = dao.ofy().put(this);
contactPeople.get(i).setOrganizationKey(key);
}
this.contactPeople = contactPeople;
}
И как мне загрузить организацию с ее дочерними элементами из хранилища данных? Придется ли мне вручную извлекать каждого человека и заполнять Organization.contactPeople в методе @PostLoad
?
Похоже, мне придется написать МНОГО кода обслуживания только для того, чтобы делать то, что JPA/JDO делает за кулисами. Я просто не понимаю :(
Я что-то упустил или это единственный способ реализовать это?
Заранее большое спасибо за ответы!!!