Каков подходящий способ создания объектов с отношением «один ко многим» с использованием Objectify и RequestFactory? - PullRequest
4 голосов
/ 19 октября 2011

Каков подходящий способ создания объектов с отношением «один ко многим» с использованием 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 - с ключом <> или без него?Должен ли я определить что-то подобное в Организации?

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;
}

И как мне загрузить Организацию с дочерними элементами из Datastore?Придется ли мне вручную извлекать каждого Person и заполнять Organization.contactPeople методом @PostLoad?

Кажется, мне придется написать МНОГО кода обслуживания, чтобы сделать то, что JPA / JDO выполняет засцена.Я просто не понимаю: (

Я что-то упустил или это единственный способ реализовать это?

Большое спасибо за ответы заранее !!!

1 Ответ

1 голос
/ 19 октября 2011

Вам нужно сделать это как @Parent только тогда, когда вы собираетесь использовать его в транзакции против всех Person в этом Organization. Я уверен, что это не то, что вы хотите.

Достаточно сохранить только private Key<Organization> organizationKey и выполнить фильтрацию по этому полю, когда вам нужно найти Person для указанного Organization

Что касается загрузки всех объектов, на которые есть ссылки, то да, вы должны загрузить их вручную. Это лаваш, но не так много кода.

Кроме того, существует другой способ хранения этих отношений, если ваша организация достаточно мала и состоит из нескольких сотен человек. В этом случае вы можете иметь List<Key<Person>> contactPeopleKey; и загружать всех этих людей существующими Key, вручную, это будет намного быстрее, чем загрузка новым Query

...