如何在一个实体组中创建实体?

时间:2010-02-02 16:36:20

标签: java google-app-engine jdo entity-groups entity-group-transactions

我正在构建一个基于谷歌应用引擎(Java)的应用程序,使用JDO进行持久化。

有人可以给我一个示例或指向一些代码,这些代码在事务中使用javax.jdo.PersistenceManager.makePersistentAll()来显示多个实体(相同类型)的持久性。

基本上我需要了解如何在一个实体组中放置多个entite,以便可以使用事务中的makePersistentAll()来保存它们。

4 个答案:

答案 0 :(得分:1)

This section文档正好处理了这一点。

答案 1 :(得分:1)

我这样做了:

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作为父

传递

我不确定你是否可以将不同的父母传递给同类的物品

答案 2 :(得分:0)

感谢Nick的回复。

本文档仅介绍app引擎在其父子关系时对实体组的隐式处理。我想在事务中使用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.

虽然这种方法有效,但问题在于您必须依赖已经持久的实体来创建实体组。

答案 3 :(得分:0)

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,这应该将所有这些对象放在同一个实体组中。我很想知道我是不是错了。