我正在开始使用 Google App Engine,并且正在使用 Objectify。如何在数据存储中创建根实体,但如果它已经存在,则会出错?我没有找到任何内置的东西(例如DatastoreService.put()
因此ofy().save()
将覆盖现有实体而不是错误)。我习惯的简单技术是在事务中执行此操作:
- 如果已经存在则出错
- Save
然而,这不是幂等的;如果事务执行两次,就会在步骤 1 中出错。这是迄今为止我想到的最好的not在一笔交易中:
- 如果已经存在则出错
- Save
- Fetch
- 错误,如果这不是我们刚刚创建的数据
或者,如果我不介意两个保存请求same数据都成功,我可以跳过初始查找:
- Fetch
- 如果与我们要创建的数据相同,则报告成功
- 如果已经存在,但与我们要创建的数据不同,则出错
- Save
这是可行的,但是要完成我认为非常简单的操作会有点麻烦。有没有更好的办法?
这应该保证一致的行为:
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);
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)