1

Учитывая следующую конфигурациюApp Engine: Как сохраняются связанные объекты с использованием объективизации

@Entity 
public class A{ 
    … 
    private List<Key<B>>bees; 
    … 
} 

@Entity 
public class B{ 
    … 
} 

Как упорствовать B таким образом, что она принадлежит к коллекции bees в A? Должен ли я упорствовать дважды? Назад, когда я использую с помощью JPA/JDO с DataNucleus все, что я сделал

A aa = getA(); 
B bb = createB(…); 
aa.getBees().add(bb); 
aa.update(); 

Но объективировать я должен сохраняться дважды? Как и в, я должен сделать

A aa = getA(); 
B bb = createB(…); 

aa.getBees().add(bb.getKey()); 
ofy().save().entity(bb).now(); 
ofy().save().entity(aa).now(); 

ответ

2

Это не для меня ясно, что вы просите, но # 1 лучшая практика, когда сохраняющаяся связанные учреждения, явно выделить идентификаторы с помощью аллокатора. На самом деле, вам лучше не использовать функцию «Нуль-длинная идентификация, установленная для сохранения».

Таким образом, чтобы сохранить A и B:

B b = new B(...); // Id set by ObjectifyFactory.allocateId() 
A a = new A(...); // Id set by ObjectifyFactory.allocateId() 
a.getBees().add(b.getKey()); 
ofy().save().entities(a, b); 

Лично я хотел бы добавить к bA «s конструктор.

+0

Я вручную создаю свои ключи как 'pageKey = KeyFactory.createKey (bookKey, Page.class.getSimpleName(), bookId +" "+ pageNumber)' Так что практически у меня уже есть ключи. Поэтому я предполагаю, что это то же самое, что использовать 'ObjectifyFactory.allocateId()'. Я буквально использую 'Key', а не Long или String. –

+0

Кроме того, следующая строка не компилирует' a.getBees(). Add (b.getKey()); 'Я не могу добавить ключ хранилища данных в объектное обобщение. Вы знаете, как это исправить? tag @ tx802 –

+0

Вы можете преобразовать между собственным хранилищем данных 'Key' и Objectify' Key 'достаточно тривиально. Это вопрос Java 101, на который легко ответить Javadocs Objectify. – stickfigure

0

Да, вам нужно поставить оба aa и bb (в соответствии с вашим примером). Помните, что нет ничего особенного в списке B s в вашем A - это похоже на любое другое многозначное свойство, но эти значения: Key s вместо Long s или String s.

Таким образом, если вы сохраняете aa, Objectify не выполняет «следовать» этим клавишам и не сохраняет указанные объекты. Я буду откладывать до stickfigure, но я предполагаю, что это по дизайну, поскольку это может привести к неожиданным написаниям, что может повлиять на стоимость и производительность вашего приложения.

+0

Я вручную создаю свои ключи как 'pageKey = KeyFactory.createKey (bookKey, Page.class.getSimpleName(), bookId +" "+ pageNumber)' Так что практически у меня уже есть ключи. Поэтому я предполагаю, что это то же самое, что использовать 'ObjectifyFactory.allocateId()'. Я буквально использую 'Key', а не Long или String. –

+0

Также следующая строка не компилирует' a.getBees(). Add (b.getKey()); 'Я не могу добавить ключ хранилища данных к общему общему объекту. Вы знаете, как это исправить? –

+0

Я не знаю, что 'b.getKey()', но вы должны иметь возможность добавить 'Key.create (b)' в свой 'List' – tx802

Смежные вопросы