Google App Engine: хранение неизвестных отношений между многими - PullRequest
1 голос
/ 18 июля 2010

У меня есть два объекта - пользователь и роль, которые я делаю постоянными, используя JDO и механизм приложений googles. Два типа данных связаны между собой как отношения «многие ко многим». Я попытался смоделировать это так же, как в описываемом учебнике, как наборы, содержащие ключ соответствующего объекта. К тому времени, когда я создаю свои объекты, эти ключи становятся нулевыми. Поэтому для генерации ключей я делаю эти объекты постоянными. После этого я добавляю освежающие ключи к этим объектам. Однако эти ключи не сохраняются в конце.

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

Ниже приведен пример кода для объяснения проблемы.

Какую практику хранить эти ключи?

Персистент Роль класса

public class Role {

   @PrimaryKey
   @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
   private Key Role_id;

   @Persistent
   private Set<Key> Users = new HashSet<Key>();
...
}

Постоянный класс пользователя

public class User {

   @PrimaryKey
   @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
   private Key User_id;

   @Persistent
   private String EMail = null;

   @Persistent
   private Set<Key> Roles = new HashSet<Key>();
   ...
}

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

    PersistenceManager pm = PMF.get().getPersistenceManager();
    Role GlobalAdmin = new Role();
    User Daniel = new User();

    try {
        pm.makePersistent(GlobalAdmin);
        pm.makePersistent(Daniel);
    } catch (Exception e){
        System.out.println("Storing failed: " + e.getMessage());
    }

    GlobalAdmin.addUser(Daniel.getUser_id());
    Daniel.addRole(GlobalAdmin.getRole_id());
    Daniel.setEMail("a@b.com");

    pm.close();
...

Ответы [ 2 ]

1 голос
/ 20 февраля 2011

Я думаю, вы должны прочитать документацию от datanucleus.Это объяснит решение, которое у вас есть в настоящее время.

http://www.datanucleus.org/products/accessplatform_1_1/jdo/attach_detach.html

JDO предоставляет интерфейс для сохранения объектов.JDO 1.0 не предоставляет способ взять объект, который только что был сохранен, просто поработать с ним и обновить постоянный объект позже.Пользователь должен скопировать поля вручную и позже скопировать их обратно в постоянный объект.JDO 2.0 представляет новый способ обработки этой ситуации, отсоединяя объект от графа постоянства, позволяя работать с ним в приложении пользователя.Затем его можно присоединить к графику постоянства позже.

0 голосов
/ 21 июля 2010

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

Итак, прежде всего эти классы должны быть обнаружимы:

  @PersistenceCapable(detachable = "true") 
  public class User {
  ...

Сделав объекты постоянными, я отсоединяю их, устанавливаю ключи и отправляю их в магазин ...

    ...
    pm.makePersistent(GlobalAdmin);
    pm.makePersistent(Daniel);

    pm.detachCopy(GlobalAdmin);
    pm.detachCopy(Daniel);

    GlobalAdmin.addUser(Daniel.getUser_id());
    Daniel.addRole(GlobalAdmin.getRole_id());

    pm.makePersistent(GlobalAdmin);
    pm.makePersistent(Daniel);
    ...
...