我有两个对象,一个用户和一个角色,我使用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();
...
答案 0 :(得分:1)
我认为你应该阅读datanucleus的文档。这将解释您目前的解决方案。
http://www.datanucleus.org/products/accessplatform_1_1/jdo/attach_detach.html
JDO提供了一个接口 持久化对象。 JDO 1.0 没有提供一种方式 刚刚坚持的对象 只是努力并更新 以后持久化对象。用户有 手动复制字段并复制 他们回到持久化的对象 后来。 JDO 2.0引入了一种新的方式 处理这种情况,通过分离 持久性图中的对象, 允许它在 用户申请。它可以是 附加到持久性图 后面。
答案 1 :(得分:0)
我找到了解决问题的方法。当我想写这些键时,我必须分离这些键并在以后再次使它们持久化。我既不理解为什么必须这样做,也不会有更优雅的东西。但是,它证明了工作。
首先,这些类必须是可检测的:
@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);
...