我正在使用 JDO 构建基于 google app engine (Java) 的应用程序以实现持久性。
有人可以给我一个例子或指出一些代码,这些代码显示在事务中使用 javax.jdo.PersistenceManager.makePersistentAll() 持久化多个实体(相同类型)。
基本上我需要了解如何将多个实体放在一个实体组中,以便可以在事务中使用 makePersistentAll() 保存它们。
我正在使用 JDO 构建基于 google app engine (Java) 的应用程序以实现持久性。
有人可以给我一个例子或指出一些代码,这些代码显示在事务中使用 javax.jdo.PersistenceManager.makePersistentAll() 持久化多个实体(相同类型)。
基本上我需要了解如何将多个实体放在一个实体组中,以便可以在事务中使用 makePersistentAll() 保存它们。
我这样做了:
public static final Key root_key = KeyFactory.createKey("Object", "RootKey");
...
因此典型的数据存储持久对象将在构造函数中设置 id 而不是自动获取
public DSO_MyType(string Name, Key parent)
{
KeyFactory.Builder b = new KeyFactory.Builder(parent);;
id = b.addChild(DSO_MyType.class.getSimpleName() , Name).getKey();
}
并且您将 root_key 作为父级传递
我不确定你是否可以将不同的父母传递给同类的对象
文档的这一部分正是针对这一点的。
感谢尼克的回复。
本文档仅讲述应用引擎在父子关系时对实体组的隐式处理。我想在事务中使用 PeristentManager.makePersistentAll(list) 保存多个相同类型的对象。如果对象不是同一个实体组,则会引发异常。目前我可以这样做,但认为必须有一个更好,更合适的方法来做到这一点 -
User u1 = new User("a");
UserDAO.getInstance().addObject(user1);
// UserDAO.addObject uses PersistentManager.makePersistent() in transaction and user
// object now has its Key set. I want to avoid this step.
User u2 = new User("x");
u2.setKey(KeyFactory.createKey(u1.getKey(),User.class.getSimpleName(), 100 /*some random id*/));
User u3 = new User("p");
u3.setKey(KeyFactory.createKey(u1.getKey(), User.class.getSimpleName(), 200));
UserDAO.getInstance().addObjects(Arrays.asList(new User[]{u2, u3}));
// UserDAO.addObjects uses PersistentManager.makePersistentAll() in transaction.
尽管这种方法有效,但问题在于您必须依赖已经持久的实体来创建实体组。
Gopi,AFAIK,您不必这样做……这应该可以工作(尚未测试):
List<User> userList = new ArrayList<User>();
userList.add(new User("a"));
userList.add(new User("b"));
userList.add(new User("c"));
UserDAO().getInstance().addObjects(userList);
同样,AFAIK,这应该将所有这些对象放在同一个实体组中。我很想知道我是否错了。