Хранилище данных GAE: сохранение ссылочных объектов

Я пытаюсь сохранить объекты Java к хранилищу данных GAE.

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

public class Father {
    String name;
    int age;
    Vector<Child> offsprings; //this is what I call "non-trivial" reference 
    //ctor, getters, setters...
}

public class Child {
    String name;
    int age;
    Father father; //this is what I call "non-trivial" reference 
    //ctor, getters, setters...
}

Поле имени уникально в каждом домене типа и считается Первичным ключом.

Для сохранения "тривиального" (Строка, интервал) поля, все, в чем я нуждаюсь, должна добавить корректная аннотация.Пока все хорошо. Однако я не понимаю, как я должен сохранить варивший домом (Ребенок, Родительский элемент) типы, на которые ссылаются. Если я:

  1. Преобразуйте каждую такую ссылку для содержания Первичного ключа (имя Строка, в этом примере) вместо "фактического" объекта, таким образом, Vector<Child> offsprings; становится Vector<String> offspringsNames;?

    Если это так, как я обрабатываю объект во времени выполнения? Сделайте я просто запрашиваю для Первичного ключа от Class.getName, получать объекты, на которые ссылаются?

  2. Преобразуйте каждую такую ссылку для удержания фактической Клавиши, предоставленной мне Хранилищем данных на надлежащее put() операция? Таким образом, Vector<Child> offsprings; становится Vector<Key> offspringsHashKeys;?

Я прочитал все официальные соответствующие документы/пример GAE. Повсюду, они всегда сохраняют "тривиальные" ссылки, исходно поддерживаемые Хранилищем данных (например, в примере Гостевой книги, только Строки и Longs).

7
задан David Underhill 21 July 2010 в 21:21
поделиться

3 ответа

  • См. Документацию google appengine в следующих разделах для более ясного понимания (Отношения, Транзакции)

  • Также прочтите об отсоединяемых объектах в JDO

  • Для запроса выборочных столбцов (или полей) прочтите о fetchgroups в JDO

Для на ваш вопрос У вас есть несколько вариантов:

  • Отношение «Один ко многим» (объекты будут в одной группе сущностей). Здесь у вас может быть список дочерних элементов вашего родителя (класс «Отец»). Это поместит все объекты в одну группу сущностей. Если вы не хотите получать потомков каждый раз, когда вы выбираете отца, вы можете удалить потомков из «группы выборки по умолчанию»

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Father {
   @PrimaryKey
   @Persistent
   private String name;

   @Persistent
   private int age;

   @Persistent(mappedBy = "father", defaultFetchGroup = "false")
   private List childern;
}

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Child   {
   @Persistent
   @PrimaryKey
   private String name;

   @Persistent
   private Father dad;
}

  • Необслуживаемые отношения, в которых вы храните ключи вместо ссылок:

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Father {

   @PrimaryKey
   @Persistent
   private String name;

   @Persistent
   private int age;

   @Persistent
   private List childern;
}

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Child   {
   @Persistent
   @PrimaryKey
   private String name;

   @Persistent
   private Key dad;
}

В этом случае у вас будет чтобы управлять ссылочной целостностью, а также убедиться, что они находятся в одной группе сущностей, если вам нужно обновить / добавить их в одной транзакции

. ИМО, если бы я моделировал сценарий реального мира (Отец-дети), я ' Я бы пошел по маршруту «Собственные отношения», раз уж сколько детей может иметь парень;). Конечно, возникает дополнительный вопрос, сколько отцов вы собираетесь обновлять одновременно?

Надеюсь, это поможет, ура!

0
ответ дан 8 December 2019 в 01:41
поделиться

Если у вас есть ссылка на Отца в Ребенке и на Ребенка в Отце, чем у вас возможность несоответствия при условии, что отношения между Отцом и Ребенком двусторонние (т.е. отец каждого Ребенка должен быть в списке Ребенка рен для этого Отца). Необходима только одна из двух ссылок.

Оба решения будут работать, но хранение списка дочерних элементов в отце имеет два недостатка:

  1. Каждый доступ к объекту «Отец» будет загружать ключи списка в дочерний объект. Если ключей много, это может вызвать ненужные накладные расходы.
  2. Я считаю, что GAE ограничивает размер списка до 5 000 пунктов.
0
ответ дан 8 December 2019 в 01:41
поделиться

В моем проекте jappstart есть примеры создания отношений родитель/потомок с помощью GAE/JPA. Посмотрите, как сущности, связанные с аутентификацией, связаны друг с другом здесь.

Один-к-одному (см. UserAccount.java и PersistentUser.java):

// parent
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private PersistentUser persistentUser;

// child
@OneToOne(mappedBy = "persistentUser", fetch = FetchType.LAZY)
private UserAccount userAccount;

Один-ко-многим (см. PersistentUser.java) :

@OneToMany(mappedBy = "persistentUser", cascade = CascadeType.ALL)
private Collection<PersistentLogin> persistentLogins;

Многие-к-одному (см. PersistentLogin.java):

@ManyToOne(fetch = FetchType.LAZY)
private PersistentUser persistentUser;

Также обратите внимание в конструкторах, как KeyFactory используется для сущностей с родителем и без родителя.

@Id
private Key key;

// this entity has a parent
public PersistentUser(final Key key, final String username) {
    this.key = KeyFactory.createKey(key, getClass().getSimpleName(), username);
    ...
}

// this entity does not have a parent
public UserAccount(final String username) {
    this.key = KeyFactory.createKey(getClass().getSimpleName(), username);
    ....
}

Надеюсь, это будет полезно для вас. Из вопроса я не смог понять, используете ли вы JPA или JDO.

0
ответ дан 8 December 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: