【发布时间】:2011-03-17 11:22:36
【问题描述】:
我有两个对象,一个用户和一个角色,我使用 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();
...
【问题讨论】:
-
没有人知道如何回答这个简单的问题吗?似乎 GAE 并不像 Google 和 VMWare 所希望的那样受欢迎......
标签: google-app-engine persistence jdo