【问题标题】:Can't wrap my head around appengine data store persistence无法理解 appengine 数据存储持久性
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • TypeB 没有对我的数据存储中的任何其他实体的任何引用。您如何知道您的实体是否在同一个实体组中?如果你愿意,你如何改变它?
  • 所以我对我的代码做了一点修改。我在查询返回的结果上调用了 pm.detachCopyAll。然后我遍历结果列表进行更改,最后我调用了 pm.MakePersistentAll(后跟 pm.close)。这行得通!但是为什么?!?!?!?!?!?
  • 按作品我的意思是它可以让我同时更新多个 TypeA 实体而不会引发原始错误....
  • 好吧,如果你有一个类 Book,它有一个属性 List&lt;Page&gt; pages,其中 Page 是另一个类,那么一本书的所有页面将与该书在同一个实体组中。我真的不知道为什么它会发生在你身上。我不确定使用该 JDO 选项实际上是否意味着您不必创建单个事务。似乎更多的是允许移植使用不同持久性后端的 JDO 应用程序,该后端没有数据存储的某些限制(在这些情况下通过将其设置为 false 来完成),所以我认为你应该使用交易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多