我正在使用带有数据存储区界面的Google App Engine。
每当我尝试更新一个实体时,就会创建一个全新的实体,尽管我很肯定我正在保存同一个实体,这意味着它确实具有相同的密钥。
这是我的代码:
Key key=KeyFactory.createKey("user",Long.parseLong(ID));
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity entity=new Entity("user",key);
entity.setProperty // ...whatever, updating the properties
datastore.put(entity); //by putting an entity it's supposed to
// either create a new one if non exists, or update an entity if it already exists
我确信在我的管理控制台中确认的所有更新期间密钥都是相同的:
id=3001 600643316
id=3002 600643316
id=3003 600643316
创建了一组具有相同密钥(600643316)的实体。
答案 0 :(得分:1)
数据存储区只允许应用创建一个带有String键名称的新实体,而不是数字ID。数字ID是系统分配的ID。如果密钥具有数字ID但不具有字符串密钥名称,则数据存储将忽略它并将其替换为系统分配的数字ID。
在您的示例中,如果ID
是一个字符串,那么您可以删除Long.parseLong()
位,或将其转换回String。 KeyFactory.createKey(String kind, String name)
创建一个带有密钥名称的Key
。
答案 1 :(得分:0)
所以似乎Dan是正确的,这是正确的方法,如谷歌指南中所述,如果你希望你的应用程序从你创建的唯一键构建键,你需要使用字符串。
“您可以指定实体在创建对象时是否应使用应用程序指定的键名称字符串或系统指定的数字ID作为其标识符。要设置键名称,请将其作为Entity构造函数的第二个参数提供:
Entity employee = new Entity("Employee","asalieri");
“看来你是对的,在他们的例子中,第二个参数确实是一个字符串 - user1032663