У меня есть два объекта - пользователь и роль, которые я делаю постоянными, используя 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();
...