我有两个对象,一个用户和一个角色,我使用JDO和谷歌应用引擎持久 . 这两种数据类型彼此相关,因为许多关系都是无主的 . 我试图建模那么多,因为在gae-tutorial中被描述为持有相应对象键的集合 . 到我创建对象时,这些键为空 . 因此,为了生成一些密钥,我将这些对象保持不变 . 之后,我将引用键添加到这些对象 . 但是这些密钥最终没有存储 .
除了设置键之外,我还操纵了一些其他属性(在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 回答
我想你应该阅读datanucleus的文档 . 这将解释您目前拥有的解决方案 .
http://www.datanucleus.org/products/accessplatform_1_1/jdo/attach_detach.html
我找到了解决问题的方法 . 当我想写这些键时,我必须分离这些键并在以后再次使它们持久化 . 我既不理解为什么必须这样做,也不会有更优雅的东西 . 但是,它证明了工作 .
首先,这些类必须是可检测的:
在使对象持久化之后,我将它们分离,设置我的密钥并将这些对象重新存储到商店......