Java 使用字符串或Long作为Google应用程序引擎数据存储密钥
GAE数据存储长id和字符串键的区别是什么 使用钥匙Java 使用字符串或Long作为Google应用程序引擎数据存储密钥,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,GAE数据存储长id和字符串键的区别是什么 使用钥匙 KeyFactory.createKey(kind, key); KeyFactory.createKey(kind, id); 所以在这种情况下,两者都可以用作标识符。如果我从KeyFactory.createKey(种类,键)创建一个键,其中键是一个字符串,我可以看到键的id字段是0。在这种情况下,getId()将是0?相反,如果设置的是KeyFactory.createKey(kind,someLongValue),那么getNam
KeyFactory.createKey(kind, key);
KeyFactory.createKey(kind, id);
所以在这种情况下,两者都可以用作标识符。如果我从
KeyFactory.createKey(种类,键)
创建一个键,其中键是一个字符串,我可以看到键的id
字段是0。在这种情况下,getId()
将是0
?相反,如果设置的是KeyFactory.createKey(kind,someLongValue)
,那么getName()
将是一个空的String
?一个应用引擎密钥可以有一个唯一的长ID,也可以有一个唯一的字符串名称-它们是互斥的。如果设置长ID,则名称将为空。对于任何类型的实体,您决定使用哪种类型实际上取决于您的用例
使用长ID的一个好处是,您可以让应用程序引擎为您自动生成它们。也就是说,您可以创建实体,其ID没有任何值,然后在保存实体时,数据存储将为其提供一个有效的唯一长ID
如果使用字符串名称,则必须在保存实体之前创建唯一名称。在某些情况下,如果实体上的某些属性与唯一名称自然匹配(例如,零件的SKU),则此选项非常有用。此外,有些人为字符串名称生成随机UUID-这确保所有名称都是全局唯一的,而不仅仅是特定实体种类和祖先路径中的唯一名称。与自动生成的代理ID(长)或“自然”业务ID(字符串)之间的区别相同.也许只是技术上的问题,但我不同意你通过自动生成功能来区分它们。您可以自己自动生成ID—我这样做通常是因为我想访问ID,但不想进行同步保存—然后您可以将这些ID用作长ID或字符串ID。我知道最后一个有点不合常规,我自己也没有做过,但我不明白为什么不可以。长或字符串都可以让您事先设置值。在这种情况下,由您来确保独特性。但是,只有长ID才允许保留值null,这将导致AppEngine在第一次保存时自动生成该值。您不能将字符串ID保留为空-当您尝试保存时,应用程序引擎将抛出错误。因此,不同之处在于AppEngine只会自动生成长ID,而不是字符串(根据定义,“自动生成”意味着系统为您而不是程序员生成)。没错,我猜“自动生成”就是这个意思。另一方面,我认为重要的是数据存储可以为您生成id—长或字符串。关于“自动”部分仅适用于长id,您是正确的,但我没有发现“自动”部分很重要。