Google app engine 使用Objectify创建或出错
我开始使用Google应用程序引擎,并使用Objectify。如何在数据存储中创建根实体,但如果它已经存在,则会出错?我没有找到为此内置的任何内容(例如,Google app engine 使用Objectify创建或出错,google-app-engine,google-cloud-datastore,objectify,Google App Engine,Google Cloud Datastore,Objectify,我开始使用Google应用程序引擎,并使用Objectify。如何在数据存储中创建根实体,但如果它已经存在,则会出错?我没有找到为此内置的任何内容(例如,DatastoreService.put(),因此,ofy().save()将覆盖现有实体而不是err)。我使用的简单技术是在事务中执行此操作: 如果已经存在,则会出错 拯救 然而,这不是幂等的;如果事务执行两次,则在步骤1中会出错。以下是我迄今为止提出的最好的建议,不是在交易中: 如果已经存在,则会出错 拯救 取回 如果不是我们刚刚创建的数据
DatastoreService.put()
,因此,ofy().save()
将覆盖现有实体而不是err)。我使用的简单技术是在事务中执行此操作:
这是可行的,但要完成我认为非常简单的操作,它会变得有点笨重。有更好的方法吗?这应该保证一致的行为:
final String id = // pick the unique id
final long txnId = // pick a uuid, timestamp, or even just a random number
ofy().transact(new VoidWork() {
public void vrun() {
Thing th = ofy().load().type(thing.class).id(id).now();
if (th != null) {
if (th.getTxnId() == txnId)
return;
else
throw ThingAlreadyExistsException();
}
th = createThing(id, txnId);
ofy().save().entity(th);
}
});
当它实际上不存在时,不能抛出
ThingAlreadyExistsException
?如果GAE事务抛出异常,但它“已提交并最终将成功应用”,我得到的印象是Objectify将重新运行该事务。然后,我想,它会看到第一个事务的结果并抛出异常。我不这么认为。Objectify仅在遇到ConcurrentModificationException时重试,我认为在这种情况下,保存不会“提交并最终成功应用”。发件人:“在事务已提交并最终将成功应用的情况下,您可以接收DatastoreTimeoutException
、ConcurrentModificationException
或DatastoreFailureException
异常。“说得好。我已经更新了答案,以便在成功提交时解决CME问题。我希望谷歌能详细说明造成这种局面的原因。@stickfigure Genius!感谢您的编辑-现在我确信了。:)这比验证我写的所有数据都是相同的要容易得多。