1

我正在为数据存储区使用 JDO 创建一个 Java GAE 应用程序。

我有这两个类用户和文件夹。

@PersistenceCapable
public class User {    
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key key;
  @Persistent
  private Folder rootFolder;    
  //getters and setters...
}

@PersistenceCapable
public class Folder {   
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key key;
  @Persistent
  private List<Folder> subfolders;    
  //getters and setters...
}

我想检索一个给定ID (Long)的文件夹,所以我尝试这样做:

Key key = KeyFactory.createKey(Folder.class.getSimpleName(), 371);
folder = this.pm.getObjectById(Folder.class, key);

但这不起作用。它抛出这个异常:

org.datanucleus.exceptions.NucleusObjectNotFoundException: 
Could not retrieve entity of kind Folder with key Folder(371)

我认为这是因为文件夹的密钥也包含其祖先的密钥,但我的问题是我无法知道给定其 ID 的文件夹的所有祖先路径

我所知道的是路径中的第一个祖先,即拥有根文件夹的用户。我发现有一种Query.setAncestor(Key)方法可能适合这里,但它只适用于查询,而不适用于“密钥查找”......

有人知道该怎么做吗?

4

1 回答 1

2

我不熟悉 Java 方面的事情,但数据存储在 Java/Python 上基本相同。

一旦你开始使用祖先,ids/names 就不再是实体的唯一标识符。唯一标识符是 id 加上整个祖先路径的组合。在不同的祖先下可能有多个具有相同 id 的实体。如果没有整个祖先路径,您就没有唯一键。

您可以做的最好的事情是查询与该 id 匹配的实体,然后在返回的集合中找出您想要的实体。您可以在 Query 之后再次执行 getObjectById 以获得一致的版本,但这对新实体并没有真正的帮助。

您可能想重新审视一些事情,例如在这种情况下您是否真的需要祖先。如果这样做,则需要设计一些位置来存储文件夹的整个祖先路径,以便在执行 getObjectById 时可以参考它。或者,如果您计划文件夹名称是唯一的,请使用名称而不是 id,以便更容易查找。等等

于 2013-03-25T16:34:37.973 回答