Objectify的save().entity(E entity).now()方法返回保存的entity的Key<E>,这在首次保存新实体时非常有用。到现在为止还好。
但是,在保存数据存储中已经存在的实体时,还不完全清楚此方法返回什么,或者返回值是否可以告诉我写入是否成功。我是否可以假设它是成功的,除非抛出一个RuntimeException,如这些javadocs?如果是这样的话,不管写是否在事务中,都是真的吗?
具体来说,我正在使用Objectify读取、修改和保存XG事务中的两个实体。目前,在保存第二个保存之前,我正在检查第一个保存的返回值,如下所示:
if(ofy().save().entity(entA).now() != null) {
ofy().save().entity(entB).now();
}首先,我想第一件事是我应该用一个ofy().save().entities(ent1, ent2).now()调用保存这些?
其次,对我来说,检查ofy().save().entity().now()调用的返回值是否有意义:
ConcurrentModificationException,但是如果事务提交始终失败,会发生什么情况?)感谢任何人对此作出的任何澄清。
发布于 2014-04-03 02:14:29
如果您不关心键值(它可能已被分配,即您有一个空的长id),那么您可以忽略返回值。
在您的问题中没有直接提到:在事务中使用自动id生成器是危险的,不应该这样做,因为它不是幂等操作。即使事务成功,您也可能得到事务重试,并且重试将创建一个新实体。始终在事务之外分配ids。
我将进一步说明,您根本不应该使用I的自动分配。在构造POJO时,使用分配器显式地生成它们。
发布于 2014-04-02 00:59:19
使用一个调用保存实体将导致一个RPC,这意味着事务失败窗口将更小(调用.now()两次将触发两个同步RPC)。还请记住,在写入实体组时有一个节流,所以任何导致更多RPC的模式都会产生比事务本身更大的影响。
保存的结果总是有一个键,失败将导致异常(在事务的上下文中,可能是重试)。因此,使用它作为状态检查是没有意义的。这只是有用的,如果你想知道钥匙后,你做了一个投入。
https://stackoverflow.com/questions/22792102
复制相似问题