无法围绕appengine数据存储持久化

时间:2010-06-07 07:18:04

标签: java google-app-engine persistence google-cloud-datastore jdo

我遇到了“无法在单个交易中对多个实体组进行操作”。使用APPENGINE FOR JAVA w / JDO时出现问题,代码如下:

PersistenceManager pm = PMF.get()。getPersistenceManager();

查询q = pm.newQuery(“SELECT this FROM”+ TypeA.class.getName()    +“WHERE userId == userIdParam”);  q.declareParameters(“String userIdParam”);  列表poos =(列表)q.execute(userIdParam);

for(TypeA a:allTypeAs){   a.setSomeField(someValue中);  }  pm.close();     }

似乎问题是我不能同时在多个实体上操作b / c它们在事务中不在同一个实体组中。虽然看起来我不在事务中,但是appengine会生成一个,因为我在jdoconfig.xml中有以下设置:

   <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>

精细。到目前为止,我想我明白了。

但是 - 如果我在上面的代码中用TypeB替换TypeA - 我没有得到错误。我不相信类型a和类型b之间有任何不同 - 它们都具有相同的键结构。他们确实有不同的领域,但这不重要,对吗?

我的问题是 - 在TypeA和TypeB之间可能有什么不同,他们会给出这种不同的行为?因此,你从根本上误解了这种行为甚至可能存在......

感谢。

1 个答案:

答案 0 :(得分:5)

我没有在App Engine上工作那么多,但从我记得的实体组被定义为具有根(树)的对象的层次结构。如果您的TypeB对象具有同时也是TypeB的子属性,则它们可能都在同一个实体组中。同样,如果他们都是其他类型的孩子。

如果不是这种情况,您可能需要分离从选择中获取的对象列表,修改每个对象,然后为每个对象创建一个新事务以逐个保存。
看一下updating using detach(子部分末尾的较长示例)。