"Exceeded maximum allocated IDs"-分配 KeyRange 时出现异常(AppEngine Objectify)

"Exceeded maximum allocated IDs"-Exception when allocating KeyRange (AppEngine Objectify)

我正在将一些实体从旧的应用程序引擎应用程序迁移到新的应用程序(除其他原因外,还有一个原因是升级到 objectify 5)。

还有一些实体具有自动生成的长 ID。现在我必须重新 allocate the ids (see also the javadoc and this 讨论)关于新的数据存储。

这是重要的几行:

Long id = anEntity.getId();
com.google.appengine.api.datastore.KeyRange keyRange = new com.google.appengine.api.datastore.KeyRange(null, AnEntity.class.getName(), id-1l, id+1l);

KeyRange<AnEntity> keys = new KeyRange<>(keyRange);

OfyService.ofy().factory().allocateIdRange(keys);

但是,这不起作用,因为抛出以下异常:

java.lang.IllegalArgumentException: Exceeded maximum allocated IDs
    at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:54)
    at com.google.appengine.api.datastore.DatastoreApiHelper.convertException(DatastoreApiHelper.java:127)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:96)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:88)
    at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:76)
    at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:36)
    at com.google.appengine.api.datastore.DatastoreServiceImpl.allocateIdRange(DatastoreServiceImpl.java:121)
    at com.googlecode.objectify.ObjectifyFactory.allocateIdRange(ObjectifyFactory.java:335)

我进一步测试了它,发现

KeyRange(null, AnEntity.class.getName(), 1, 1000000000l);

会起作用。但是,我已经生成的 ID 在 4503908059709440 到 6754883239673856 的范围内,显然太高了。

  1. 是我弄错了还是 allocateIdRange 方法不支持这么大的 ID(如提示 here a long ago)?

  2. 如果是后者,我该如何解决这个问题? (我想在一定范围内生成新的id,但是here他们说legacy-way很快就会被删除...而且我不喜欢自己生成它的想法。)

系统: - Java 7 - AppengineSDK 1.9.21 - objectify 版本:4.1.3(如前所述,我正在迁移)

感谢您的帮助。

我已经更改了代码,以便它分配一个字符串并使用 UUID 生成此字符串。 这解决了问题,但它仍然是 allocateIdRange 的奇怪行为...

另请参阅此 issue