Java PersistenceManager.getObjectById与祖先密钥

Java PersistenceManager.getObjectById与祖先密钥,java,google-app-engine,google-cloud-datastore,jdo,datanucleus,Java,Google App Engine,Google Cloud Datastore,Jdo,Datanucleus,我正在使用JDO为数据存储创建一个JavaGAE应用程序 我有这两个类用户和文件夹 @PersistenceCapable public class User { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key; @Persistent private Folder rootFolder; //getters and setters.

我正在使用JDO为数据存储创建一个JavaGAE应用程序

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

@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...
}
但这不起作用。它抛出以下异常:

org.datanucleus.exceptions.NucleusObjectNotFoundException: 
Could not retrieve entity of kind Folder with key Folder(371)
我认为这是因为文件夹的也包含其祖先的键,但我的问题是,给定其ID,我无法知道文件夹的所有祖先路径

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


有人知道如何做到这一点吗?

我不熟悉Java方面的东西,但Java/Python上的数据存储基本相同

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

您所能做的最好的事情是查询与该id匹配的实体,然后找出您希望在返回的集合中使用的实体。您可以在查询后再次执行getObjectById以获得一致的版本,尽管这对新实体没有帮助


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

谢谢@dragonx。请提供一个“查询与该id匹配的实体”的示例?
org.datanucleus.exceptions.NucleusObjectNotFoundException: 
Could not retrieve entity of kind Folder with key Folder(371)