自动id分配器是否会返回我在其他实体上任意设置的id?

时间:2012-01-20 22:08:25

标签: google-app-engine google-cloud-datastore

如果我任意将新实体的id设置为1000,而不首先使用allocateIds,那么以后的实体是否可以自动获得id 1000并覆盖我的原始实体?

在伪代码中,如果我有:

Entity e1;
e1.setId(1000);
datastore.put(e1);

...稍后......

Entity e2;
datastore.put(e2);

有没有机会e2会自动获得身份1000并覆盖e1?

1 个答案:

答案 0 :(得分:3)

正如Java API documentation

中所述
  

为了插入而创建实体(而不是更新)   不鼓励使用此构造函数,除非id是从a获得的   从中获取的KeyRange返回的密钥   AsyncDatastoreService.allocateIds(String,long)或   DatastoreService.allocateIds(String,long)为同一类型。

另请参阅Python documentation

  

但请注意,数据存储区无法保证避免应用程序分配的ID。虽然不太可能,但数据存储区可能会分配一个数字ID,该数字ID将导致与具有应用程序分配ID的实体发生冲突。避免此问题的唯一方法是让您的应用使用allocate_ids()来获取一批ID。数据存储区的自动ID生成器不会使用使用allocate_ids()获取的ID,因此您的应用可以使用这些ID而不会发生冲突。

您不应该创建具有数据存储尚未分配的ID的实体,如果要将用户定义的标识符作为实体密钥的一部分提供,请改用key_name