1

我遇到了“无法在单个事务中对多个实体组进行操作”。在使用APPENGINE FOR JAVA w/JDO时使用以下代码时出现问题:无法将我的头围绕appengine数据存储持久性

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

查询q = pm.newQuery(“SELECT this FROM”+ TypeA.class.getName() +“WHERE userId == userIdParam”); q.declareParameters(“String userIdParam”); List poos =(List)q.execute(userIdParam); (TypeA a:allTypeAs){ a.setSomeField(someValue); } pm.close(); }

这个问题似乎是,我不能在同一时间对多个实体进行操作,因为它们在事务中不在同一个实体组中。虽然看起来像我在一个事务中我没有,AppEngine上生成一个,因为我有以下我jdoconfig.xml设置:

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

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

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

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

谢谢。

+0

使用autoCreateDatastoreTxns可能是一个糟糕的主意,因为你的文章大纲的原因。 – 2010-06-08 12:56:39

+0

我认为这是来自appengine文档的推荐设置。 – aloo 2010-06-08 23:23:11

+0

“我们推荐使用的JDO配置将名为datanucleus.appengine.autoCreateDatastoreTxns的属性设置为true,这是一个App Engine特定的属性,它告诉JDO实现将数据存储区事务与应用程序代码中管理的JDO事务相关联。正在从头构建一个新的应用程序,这可能是你想要的。“ – aloo 2010-06-08 23:24:05

回答

5

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

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

+0

TypeB没有任何对我的数据存储中任何其他实体的引用。你怎么知道你的实体是否在同一个实体组中?如果你想要如何改变它? – aloo 2010-06-07 16:12:47

+0

所以我对我的代码做了一些修改。我对我的查询返回的结果调用了pm.detachCopyAll。然后我通过结果列表进行迭代,最后调用pm.MakePersistentAll(后跟pm.close)。这工作!但为什么?!?!?!?!!?!? – aloo 2010-06-07 16:14:06

+0

作品我的意思是它允许我同时更新多个TypeA实体,而不会丢失原始错误.... – aloo 2010-06-07 16:14:42