【问题标题】:App Engine identifier. Key vs Id应用引擎标识符。密钥与 ID
【发布时间】:2011-07-30 01:11:28
【问题描述】:

为了在 Google App Engine 中识别我的 JDO 对象,我使用 Key 类型。它工作正常,但是当我需要通过 url 传递它时,它会变得有点长。

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

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

有什么想法吗?

【问题讨论】:

  • 你能贴出你用来尝试通过id获取的代码吗?

标签: java google-app-engine jdo


【解决方案1】:

是的,你可以这样做。每当您需要获取 ID 时,都可以使用以下方法调用。假设您正在使用名为 user:user.getKey().getId() 的实体类 User 的对象。 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 列下的数据存储中可见的值。使用你的代码是行不通的。我得到类似:Could not retrieve entity of kind User with key User("50")
  • 你看到的是解码后的实体密钥。如果您还没有这样做,则必须在控制器代码(例如 Servlet)中解析 ID 参数字符串。像这样的东西可以在 Servlet 中工作:Long.parseLong(httpServletRequest.getParameter("id")。您是否在数据存储查看器中看到 ID 为 50 的实体?
  • 对不起,我的错。创建密钥时,您必须使用字符串(实体类型的名称)。更正了上面的代码。
【解决方案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);

【讨论】:

  • 正如我的问题中所述,我使用“Key”类型而不是“Long”作为我的密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多