Java 使用objectify检查唯一播放器
我使用objectify和GAE,我想通过pseudo创建唯一的播放器。我知道没有像sql数据库那样的唯一键。所以我试着用事务来做这件事。我想开始我的交易,搜索是否已经有一个球员与这个伪,并创建球员,如果没有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注释
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
==>创建播放器,否则否。我已经这样做了。错误是在事务中只允许祖先查询。您说“这不起作用”是什么意思?异常或未加载播放器?编辑-好对不起,我想现在例外的消息是“只允许在事务中使用祖先查询”。您检查过这个吗?是的,我查过这个。但问题是,我必须检查是否已经有一个球员与给定的伪。因此,如果我试图让一个玩家使用这个伪码,但什么也得不到,我就会进入交易。但在此期间,其他玩家也可以这样做并进入交易。两者都将添加一个具有相同伪码的玩家。