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

时间:2014-04-01 16:52:34

标签: java google-app-engine google-cloud-datastore objectify

Objectify的save().entity(E entity).now()方法返回已保存Key<E>的{​​{1}},这在第一次保存新实体时非常有用。到目前为止,非常好。

但是,在保存已存在于数据存储区中的实体时,此方法返回的内容并不完全清楚,或者返回值是否可以告诉我该写入是否成功。根据{{​​3}},除非引发entity,否则我可以认为 成功了吗?如果是这样,无论写入是否在事务中,都是真的吗?

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

RuntimeException

首先,我想第一件事是我应该通过一次if(ofy().save().entity(entA).now() != null) { ofy().save().entity(entB).now(); } 电话保存这些?

其次,检查ofy().save().entities(ent1, ent2).now()电话的返回值是否有意义:

  1. 在交易中? (例如,如果Objectify捕获ofy().save().entity().now()则会重试,但如果事务提交仍然失败会发生什么?)
  2. 感谢任何人可以就此作出任何澄清。

2 个答案:

答案 0 :(得分:5)

如果你不关心Key值(可能已经分配了,即你有一个null的长id),那么你可以忽略返回值。

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

我会更进一步说你不应该在所有中使用ids 的自动分配。在构造POJO时用分配器显式生成它们。

答案 1 :(得分:0)

通过一次调用保存实体将导致单个RPC,这意味着事务失败的窗口将更小(调用.now()两次触发两个同步RPC)。还要记住,对实体组的写入存在限制因素,因此任何导致更多RPC的模式都会产生比事务经过时间本身更广泛的影响。

save的结果总是有一个键,失败会导致异常(在事务的上下文中,可能是重试)。因此,将其用作状态检查并不重要。如果您想在放置后知道密钥,它就非常有用。