我的理解是,在使用objectify时,您可以通过以下两种方式之一生成数据存储区密钥:
指定对象的唯一ID,该ID将用于生成数据存储区密钥(使用注释@Id分配给数据成员的唯一ID)
不要指定唯一ID,因此将自动生成数据存储区键(数据成员上的注释@Id仍然存在,但没有为其分配任何内容)
使用选项1,为了加载指定的实体,我们首先使用Key.create(SomeEntity.class,uniqueID)获取密钥,其中uniqueID将是唯一的。
如果我决定使用选项2,如果让数据存储区自动生成密钥,如何加载所需的实体?
答案 0 :(得分:1)
还有其他参数吗?如果您在不决定密钥的情况下创建对象,但提供(例如)城市,用户名,电子邮件,则按城市,用户名,电子邮件进行搜索。一旦你拥有了这个,就有了这个对象。如果需要,可以从那里获得对象的密钥。
答案 1 :(得分:0)
如果您的实体@Id字段为空并且您使用.now()同步保存它,那么@Id带注释的字段(假设" id"在此示例中)将被设置为自动分配的/在以下调用期间生成值。
ofy().save().entity(someEntity).now();
Long myId = someEntity.getId();
然后someEntity.getId()将是一个有效的生成的String / Long,您可以使用,注意某处,提供给用户,从API等返回以便以后:
ofy().load().type(Entity.class).id(myId).now();
如果您需要异步保存实体(不使用.now()),那么也可以这样做,只需使用ObjectifyFactory中的allocateId函数在保存之前设置id以确保唯一ID - 这与您的1)类似,但是生成确保唯一的UniqueId的安全方式。
通常应该通过查询字段组合来搜索条目,因为根据您的数据,它可能与单个条目不匹配,并且您需要为这些字段编制索引以增加成本。