Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用字符串或Long作为Google应用程序引擎数据存储密钥_Java_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Java 使用字符串或Long作为Google应用程序引擎数据存储密钥

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

GAE数据存储长id和字符串键的区别是什么

使用钥匙

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,您是正确的,但我没有发现“自动”部分很重要。