gpt4 book ai didi

java - 带有祖先键的 PersistenceManager.getObjectById

转载 作者:行者123 更新时间:2023-11-30 04:27:01 24 4
gpt4 key购买 nike

我正在使用 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(长)检索文件夹,因此我尝试这样做:

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)

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

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

有人知道怎么做吗?

最佳答案

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

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

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

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

关于java - 带有祖先键的 PersistenceManager.getObjectById,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15619451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com