Java 使用objectify检查唯一播放器

Java 使用objectify检查唯一播放器,java,google-app-engine,google-cloud-datastore,objectify,nosql,Java,Google App Engine,Google Cloud Datastore,Objectify,Nosql,我使用objectify和GAE,我想通过pseudo创建唯一的播放器。我知道没有像sql数据库那样的唯一键。所以我试着用事务来做这件事。我想开始我的交易,搜索是否已经有一个球员与这个伪,并创建球员,如果没有 Player player = ofy().load().type(Player.class).filter("pseudo =", tmpPseudo).first().now(); 但这不起作用,因为有一个过滤器。现在我被卡住了,因为我不知道如何修复它 谢谢。您必须用@Index注释

我使用objectify和GAE,我想通过pseudo创建唯一的播放器。我知道没有像sql数据库那样的唯一键。所以我试着用事务来做这件事。我想开始我的交易,搜索是否已经有一个球员与这个伪,并创建球员,如果没有

Player player = ofy().load().type(Player.class).filter("pseudo =", tmpPseudo).first().now();
但这不起作用,因为有一个过滤器。现在我被卡住了,因为我不知道如何修复它


谢谢。

您必须用@Index注释将字段标记为pseudo,如下所示:

Player.java

import com.googlecode.objectify.annotation.Index;

@Index
String pseudo;

因此,它可以通过该字段进行过滤。

最简单的策略是检查是否使用了它,写入,然后在保存后重新查询。如果您得到两个结果,而您的结果是较旧的结果,请删除该行并返回一个错误(或其他错误)。尽管由于数据存储中的“最终一致性”约束,仍然有可能丢失它。在重新查询之前添加延迟可能会有所帮助,但这取决于应用程序负载,可能并非真正必要

在我的例子中,我通过将对象复制到事务中来解决问题

final Player=ofy().load().type(Player.class).filter(“pseudo=,tmpPseudo).first().now()

然后在事务内部,我进行检查,而不是在事务之前:

Player当前播放器=Player


如果
currentPlayer==null
==>创建播放器,否则否。

我已经这样做了。错误是在事务中只允许祖先查询。您说“这不起作用”是什么意思?异常或未加载播放器?编辑-好对不起,我想现在例外的消息是“只允许在事务中使用祖先查询”。您检查过这个吗?是的,我查过这个。但问题是,我必须检查是否已经有一个球员与给定的伪。因此,如果我试图让一个玩家使用这个伪码,但什么也得不到,我就会进入交易。但在此期间,其他玩家也可以这样做并进入交易。两者都将添加一个具有相同伪码的玩家。