Java 应用程序引擎标识符。密钥vs Id

Java 应用程序引擎标识符。密钥vs Id,java,google-app-engine,jdo,Java,Google App Engine,Jdo,要在Google App Engine中识别我的JDO对象,我使用键类型。它工作得很好,但当我需要通过URL传递它时,它会变得有点长 例如:http://mysite.com/user/aghtaWx1LWFwcHIZCxIGTXlVc2VyGAMMCxIHTXlJbWFnZRgHDA 在我的管理查看器中查看我的实体时,我可以看到数据存储还为我的实体对象设置了一个“id”,这似乎是一个增量数值,与键字符串相比,它非常短。我可以用它来获取我的物体的信息吗?我该怎么做?我尝试用id而不是键使用get

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

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

在我的管理查看器中查看我的实体时,我可以看到数据存储还为我的实体对象设置了一个“id”,这似乎是一个增量数值,与键字符串相比,它非常短。我可以用它来获取我的物体的信息吗?我该怎么做?我尝试用id而不是键使用
getObjectbyId()
。。。它不起作用


有什么想法吗?

您需要将实体中的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);

是的,你能做到。无论何时需要获取ID,都可以使用以下方法调用。假设您正在使用名为
User
的实体类
User
的对象:
User.getKey().getId()
。id的类型为
long
。有关更多信息,请参见
com.google.appengine.api.datastore.Key的链接

只要您有了ID,就可以从中构建
,然后简单地查询对象

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

您可以发布您用来尝试通过id获取的代码吗?正如我在问题中所述,我使用的是“Key”类型而不是“Long”类型作为我的密钥。
id
实际上是一个字符串,它是在
id/Name
列下的数据存储中可见的值。用你的代码来解决这个问题是行不通的。我得到的结果是:
无法检索具有密钥User(“50”)的用户类型的实体。
您看到的是解码的实体密钥。如果您还没有这样做,则必须解析控制器代码(例如Servlet)中的ID参数字符串。类似的内容将在Servlet中工作:
Long.parseLong(httpServletRequest.getParameter(“id”)
。您是否在数据存储查看器中看到id为50的实体?抱歉,我的错误。创建密钥时必须使用字符串(实体类型的名称)。更正了上面的代码。