Как создать сущности в одной группе сущностей?

Я создаю приложение на основе Google App Engine (Java), используя JDO для постоянства.

Может ли кто-нибудь дать мне пример или указать на какой-то код, который показывает сохранение нескольких сущностей (одного типа) с использованием javax.jdo.PersistenceManager.makePersistentAll() в транзакции.

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

4 ответа

Решение

Спасибо за ответ, Ник.

В этом документе рассказывается только о неявной обработке групп сущностей механизмом приложения при его родительско-дочерних отношениях. Я хочу сохранить несколько объектов одного типа, используя PeristentManager.makePersistentAll (список) в транзакции. Если объекты не совпадают с Entity Group, это вызывает исключение. В настоящее время я могу сделать это, как показано ниже, но думаю, что должен быть лучший и более подходящий подход для этого -

User u1 = new User("a");
UserDAO.getInstance().addObject(user1); 
// UserDAO.addObject uses PersistentManager.makePersistent() in transaction and user 
// object now has its Key set. I want to avoid this step.

User u2 = new User("x"); 
u2.setKey(KeyFactory.createKey(u1.getKey(),User.class.getSimpleName(), 100 /*some random id*/)); 

User u3 = new User("p");
u3.setKey(KeyFactory.createKey(u1.getKey(), User.class.getSimpleName(), 200)); 

UserDAO.getInstance().addObjects(Arrays.asList(new User[]{u2, u3})); 
// UserDAO.addObjects uses PersistentManager.makePersistentAll() in transaction.

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

Я сделал это:

public static final Key root_key = KeyFactory.createKey("Object", "RootKey");

...

поэтому типичный постоянный объект хранилища данных будет устанавливать идентификатор в конструкторе, а не получать его автоматически

public DSO_MyType(string Name, Key parent)
    {
        KeyFactory.Builder b = new KeyFactory.Builder(parent);;
        id = b.addChild(DSO_MyType.class.getSimpleName() , Name).getKey();
    }

и вы передаете root_key в качестве родителя

я не уверен, что вы можете передать разных родителей одинаковым предметам

Этот раздел документов посвящен именно этому.

Гопи, AFAIK, тебе не нужно это делать... это должно работать (не проверял):

List<User> userList = new ArrayList<User>();
userList.add(new User("a"));
userList.add(new User("b"));
userList.add(new User("c"));
UserDAO().getInstance().addObjects(userList);

Опять же, AFAIK, это должно поместить все эти объекты в одну группу сущностей. Я хотел бы знать, если я не прав.

Другие вопросы по тегам