自动生成密钥

时间:2014-10-31 19:40:42

标签: java google-app-engine objectify

我的理解是,在使用objectify时,您可以通过以下两种方式之一生成数据存储区密钥:

  1. 指定对象的唯一ID,该ID将用于生成数据存储区密钥(使用注释@Id分配给数据成员的唯一ID)

  2. 不要指定唯一ID,因此将自动生成数据存储区键(数据成员上的注释@Id仍然存在,但没有为其分配任何内容)

  3. 使用选项1,为了加载指定的实体,我们首先使用Key.create(SomeEntity.class,uniqueID)获取密钥,其中uniqueID将是唯一的。

    如果我决定使用选项2,如果让数据存储区自动生成密钥,如何加载所需的实体?

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的安全方式。

通常应该通过查询字段组合来搜索条目,因为根据您的数据,它可能与单个条目不匹配,并且您需要为这些字段编制索引以增加成本。

相关问题