Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 使用Objectify创建或出错_Google App Engine_Google Cloud Datastore_Objectify - Fatal编程技术网

Google app engine 使用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中会出错。以下是我迄今为止提出的最好的建议,不是在交易中: 如果已经存在,则会出错 拯救 取回 如果不是我们刚刚创建的数据

我开始使用Google应用程序引擎,并使用Objectify。如何在数据存储中创建根实体,但如果它已经存在,则会出错?我没有找到为此内置的任何内容(例如,
DatastoreService.put()
,因此,
ofy().save()
将覆盖现有实体而不是err)。我使用的简单技术是在事务中执行此操作:

  • 如果已经存在,则会出错
  • 拯救
  • 然而,这不是幂等的;如果事务执行两次,则在步骤1中会出错。以下是我迄今为止提出的最好的建议,不是在交易中:

  • 如果已经存在,则会出错
  • 拯救
  • 取回
  • 如果不是我们刚刚创建的数据,那就错了
  • 或者,如果我不介意两个保存相同数据的请求都成功,我可以跳过初始查找:

  • 取回
  • 如果与我们要创建的数据相同,则报告成功
  • 如果已经存在,但不是我们将要创建的相同数据,则出错
  • 拯救

  • 这是可行的,但要完成我认为非常简单的操作,它会变得有点笨重。有更好的方法吗?

    这应该保证一致的行为:

    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!感谢您的编辑-现在我确信了。:)这比验证我写的所有数据都是相同的要容易得多。