首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Objectify save()中解释返回值

如何在Objectify save()中解释返回值
EN

Stack Overflow用户
提问于 2014-04-01 16:52:33
回答 2查看 1.4K关注 0票数 2

Objectify的save().entity(E entity).now()方法返回保存的entityKey<E>,这在首次保存新实体时非常有用。到现在为止还好。

但是,在保存数据存储中已经存在的实体时,还不完全清楚此方法返回什么,或者返回值是否可以告诉我写入是否成功。我是否可以假设它是成功的,除非抛出一个RuntimeException,如这些javadocs?如果是这样的话,不管写是否在事务中,都是真的吗?

具体来说,我正在使用Objectify读取、修改和保存XG事务中的两个实体。目前,在保存第二个保存之前,我正在检查第一个保存的返回值,如下所示:

代码语言:javascript
运行
复制
if(ofy().save().entity(entA).now() != null) {
    ofy().save().entity(entB).now();
}

首先,我想第一件事是我应该用一个ofy().save().entities(ent1, ent2).now()调用保存这些?

其次,对我来说,检查ofy().save().entity().now()调用的返回值是否有意义:

  1. 从来没有
  2. 在交易里面?(例如,如果对象化重试捕获了ConcurrentModificationException,但是如果事务提交始终失败,会发生什么情况?)

感谢任何人对此作出的任何澄清。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-03 02:14:29

如果您不关心键值(它可能已被分配,即您有一个空的长id),那么您可以忽略返回值。

在您的问题中没有直接提到:在事务中使用自动id生成器是危险的,不应该这样做,因为它不是幂等操作。即使事务成功,您也可能得到事务重试,并且重试将创建一个新实体。始终在事务之外分配ids。

我将进一步说明,您根本不应该使用I的自动分配。在构造POJO时,使用分配器显式地生成它们。

票数 5
EN

Stack Overflow用户

发布于 2014-04-02 00:59:19

使用一个调用保存实体将导致一个RPC,这意味着事务失败窗口将更小(调用.now()两次将触发两个同步RPC)。还请记住,在写入实体组时有一个节流,所以任何导致更多RPC的模式都会产生比事务本身更大的影响。

保存的结果总是有一个键,失败将导致异常(在事务的上下文中,可能是重试)。因此,使用它作为状态检查是没有意义的。这只是有用的,如果你想知道钥匙后,你做了一个投入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22792102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档