App Engine 标识符。Key 与 Id 的区别。

7
为了在Google App Engine中识别我的JDO对象,我使用Key类型。这很好用,但当我需要通过URL传递它时,它会变得有些长。

例如:http://mysite.com/user/aghtaWx1LWFwcHIZCxIGTXlVc2VyGAMMCxIHTXlJbWFnZRgHDA

当我在管理工具中查看我的实体时,我可以看到数据存储还为我的实体对象设置了一个“id”,它似乎是一个增量数字值,与Key字符串相比相当短。我能用这个来获取我的对象的信息吗?我该如何做呢?我尝试使用ID而不是密钥来使用getObjectbyId()...但不起作用。

有什么想法吗?

你能否发布一下你尝试使用的按id获取代码? - Yasser
2个回答

9
是的,您可以这样做。每当您需要获取ID时,可以使用以下方法调用。假设您正在使用实体类User的对象命名为useruser.getKey().getId()。ID的类型为long。有关更多信息,请参见com.google.appengine.api.datastore.KeyJavaDoc

当您拥有ID时,可以从中构建Key,然后简单地查询对象。

Key key = KeyFactory.createKey("User", id);
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
User user = datastore.get(key);

“id”实际上是一个字符串,它是在数据存储中“ID/Name”列下可见的值。使用您的代码无法正常工作。我得到了类似这样的东西:“无法检索到具有键User(“50”)的用户类型实体”。 - Luca Matteis
1
你所看到的是解码后的实体键。如果你还没有这样做,你需要在控制器代码(例如Servlet)中解析ID参数字符串。在Servlet中可以使用类似以下代码:Long.parseLong(httpServletRequest.getParameter("id"))。你在数据存储查看器中是否看到了ID为50的实体? - Benjamin Muschko
抱歉,是我的错。在创建键时,您必须使用字符串(实体类型的名称)。已更正上面的代码。 - Benjamin Muschko

2

您需要在实体中将id定义为主键:

private class MyObject implements Serializable{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;
}

那么您可以尝试这个方法:
long id = someObject.getId();

MyObject mo = getPM().getObjectById(MyObject.class, id);

如我所述,我正在使用"type"类型来代替"long"类型作为我的键。 - Luca Matteis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接