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()
电话的返回值是否有意义:
ofy().save().entity().now()
则会重试,但如果事务提交仍然失败会发生什么?)感谢任何人可以就此作出任何澄清。
答案 0 :(得分:5)
如果你不关心Key值(可能已经分配了,即你有一个null的长id),那么你可以忽略返回值。
不是直接在你的问题中,但需要提及:在事务中使用自动id生成器是危险的,不应该这样做,因为它不是幂等操作。即使事务成功,您也可能会获得事务重试,并且重试将创建一个新实体。始终在交易之外分配ID。
我会更进一步说你不应该在所有中使用ids 的自动分配。在构造POJO时用分配器显式生成它们。
答案 1 :(得分:0)
通过一次调用保存实体将导致单个RPC,这意味着事务失败的窗口将更小(调用.now()
两次触发两个同步RPC)。还要记住,对实体组的写入存在限制因素,因此任何导致更多RPC的模式都会产生比事务经过时间本身更广泛的影响。
save的结果总是有一个键,失败会导致异常(在事务的上下文中,可能是重试)。因此,将其用作状态检查并不重要。如果您想在放置后知道密钥,它就非常有用。