Java 应用程序引擎标识符。密钥vs Id
要在Google App Engine中识别我的JDO对象,我使用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
键
类型。它工作得很好,但当我需要通过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的实体?抱歉,我的错误。创建密钥时必须使用字符串(实体类型的名称)。更正了上面的代码。