【问题标题】:Getting an Entity key获取实体密钥
【发布时间】:2012-05-25 10:54:21
【问题描述】:

根据此处的问答: Get an Objectify Entity's Key

对于持久化对象,获取实体键:

@Transient
Key<Categoria> getKey() {
   return new Key<Categoria>(Categoria.class, id);
}

不返回相同的键:

Objectify ofy = ObjectifyService.begin();
Key<Categoria> key = ofy.getFactory().getKey(someobject);

还是应该?

我的模型如下所示:

@Entity
class Categoria{
  @Parent
  private Key<Someclass> parentKey;

  @Transient
  Key<Categoria> getKey() {
   return new Key<Categoria>(Categoria.class, id);
 }
 // Code omitted
}

【问题讨论】:

  • 也许它们不是相同的 (==) 键,但应该相等 (.equals())。不是吗?
  • 我实际上是通过它们的字符串表示来比较键,比如 testobjectKey.getString()

标签: google-app-engine objectify


【解决方案1】:

如果Categoria@Parent 字段,它只会生成不同的密钥。在这种情况下,您需要将父键与类和 id 一起传递给 Key 构造函数。

【讨论】:

  • 我明白了。但是,我有另一个与@Parent 相关的密钥。 getKey 方法返回一个没有那个注解的键
  • 为什么我的应用生成的密钥没有该注释?
  • 对不起,我真的不明白你在问什么。你能改写一下这个问题吗?
  • 你需要return new Key&lt;Categoria&gt;(parentKey, Categoria.class, id);
  • 那么也许您没有正确构造父键(例如,它有父键)?真的,这段代码被广泛使用——这么简单的东西几乎不可能被破解。尝试发布一个完整的测试用例。
【解决方案2】:

应该的。我总是通过从长 ID 创建的键来获取 Objectify Entities。如果需要,您还可以使用返回的密钥从密钥中获取长 id。

编辑: 您无法以您尝试的方式获得密钥。

你必须这样做。

Key<Car> rootKey = new Key<Car>(Car.class, 959);
Key<Car> keyWithParent = new Key<Car>(parent, Car.class, 959);

from the objectify wiki

所以对于这一行: Key key = ofy.getFactory().getKey(someobject);

键将由父键加上类别键组成

这意味着您在函数中进行查找时必须包含父键

Key<Categoria> getKey() {
 return new Key<Categoria>(parentKey, Categoria.class, id);
}

【讨论】:

  • 我不太明白您所说的“您无法按照您尝试的方式获得密钥。”是什么意思;我的意思是,您是说答案中的 getKey 函数应该返回与我从工厂方法中获得的密钥相同的密钥吗?
  • 我面临的问题是,我需要使用密钥从数据存储中获取一些实体,但是此处“getKey”函数提供的密钥不允许我获取实体,而当我使用工厂生成或提供的密钥时,我可以从数据存储中获取实体。
  • 如前所述,您必须使用“getKey”函数中的父键来返回实体。
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多