【发布时间】:2011-02-28 13:58:35
【问题描述】:
我遇到了“无法在单个事务中对多个实体组进行操作”。使用带有以下代码的 JDO 的 APPENGINE FOR JAVA 时出现问题:
PersistenceManager pm = PMF.get().getPersistenceManager();
Query q = pm.newQuery("SELECT this FROM " + TypeA.class.getName() + " WHERE userId == userIdParam "); q.declareParameters("String userIdParam"); 列出 poos = (List) q.execute(userIdParam);
for (TypeA a : allTypeAs) { a.setSomeField(someValue); } pm.close(); }
问题似乎是我不能同时对多个实体进行操作,因为它们在事务中不在同一个实体组中。即使我似乎没有参与交易,appengine 也会生成一个,因为我在 jdoconfig.xml 中有以下设置:
<property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>
很好。到目前为止,我想我明白了。
但是 - 如果我将上面代码中的 TypeA 替换为 TypeB - 我不会收到错误消息。我不相信类型 a 和类型 b 之间有什么不同——它们都具有相同的密钥结构。他们确实有不同的领域,但这不重要,对吧?
我的问题是 - TypeA 和 TypeB 之间可能有什么不同,它们给出了这种不同的行为?因此,我从根本上误解了这种行为甚至可能存在……
谢谢。
【问题讨论】:
-
使用 autoCreateDatastoreTxns 可能是个坏主意,这正是您的帖子概述的原因。
-
我认为这是 appengine 文档中推荐的设置。
-
"我们推荐使用的 JDO 配置将名为 datanucleus.appengine.autoCreateDatastoreTxns 的属性设置为 true。这是一个 App Engine 特定的属性,它告诉 JDO 实现将数据存储事务与 JDO 事务相关联在应用程序代码中管理。如果您从头开始构建一个新应用程序,这可能就是您想要的。"
标签: java google-app-engine persistence google-cloud-datastore jdo