我遇到了“无法在单个事务中对多个实体组进行操作”的问题。通过以下代码使用带有JDO的APPENGINE FOR JAVA时出现问题:

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

查询q = pm.newQuery(“从中选择此内容+ TypeA.class.getName()
   +“ WHERE userId == userIdParam”);
 q.declareParameters(“ String userIdParam”);
 List poos =(列表)q.execute(userIdParam);

对于(TypeA a:allTypeAs){
  a.setSomeField(someValue);
 }
 pm.close();
    }

看来问题是我无法同时在多个实体上进行交易,因为它们在交易中不在同一实体组中。即使看起来好像不在事务中,appengine也会生成一个,因为我在jdoconfig.xml中设置了以下内容:

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


精细。到目前为止,我认为我了解。

但是-如果我将上面代码中的TypeA替换为TypeB-我没有收到错误。我不相信类型a和类型b之间有什么不同-它们都具有相同的键结构。他们确实有不同的领域,但这没关系吧?

我的问题是-TypeA和TypeB在这种行为上有何不同?因此,我从根本上误解了您这种行为甚至可能存在的事实。

谢谢。

最佳答案

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

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

10-08 12:36