Я пытаюсь сохранить объекты 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...
}
Поле имени уникально в каждом домене типа и считается Первичным ключом.
Для сохранения "тривиального" (Строка, интервал) поля, все, в чем я нуждаюсь, должна добавить корректная аннотация.Пока все хорошо. Однако я не понимаю, как я должен сохранить варивший домом (Ребенок, Родительский элемент) типы, на которые ссылаются. Если я:
Vector<Child> offsprings;
становится Vector<String> offspringsNames;
? Если это так, как я обрабатываю объект во времени выполнения? Сделайте я просто запрашиваю для Первичного ключа от Class.getName
, получать объекты, на которые ссылаются?
put()
операция? Таким образом, Vector<Child> offsprings;
становится Vector<Key> offspringsHashKeys;
?Я прочитал все официальные соответствующие документы/пример GAE. Повсюду, они всегда сохраняют "тривиальные" ссылки, исходно поддерживаемые Хранилищем данных (например, в примере Гостевой книги, только Строки и Longs).
См. Документацию google appengine в следующих разделах для более ясного понимания (Отношения, Транзакции)
Также прочтите об отсоединяемых объектах в 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; }
В этом случае у вас будет чтобы управлять ссылочной целостностью, а также убедиться, что они находятся в одной группе сущностей, если вам нужно обновить / добавить их в одной транзакции
. ИМО, если бы я моделировал сценарий реального мира (Отец-дети), я ' Я бы пошел по маршруту «Собственные отношения», раз уж сколько детей может иметь парень;). Конечно, возникает дополнительный вопрос, сколько отцов вы собираетесь обновлять одновременно?
Надеюсь, это поможет, ура!
Если у вас есть ссылка на Отца
в Ребенке
и на Ребенка
в Отце, чем у вас возможность несоответствия при условии, что отношения между Отцом и Ребенком двусторонние (т.е. отец каждого Ребенка
должен быть в списке Ребенка
рен для этого Отца). Необходима только одна из двух ссылок.
Оба решения будут работать, но хранение списка дочерних элементов в отце имеет два недостатка:
В моем проекте 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.