1

我正在使用JDO爲Datastore創建Java GAE應用程序。帶祖先密鑰的PersistenceManager.getObjectById

我有這2類用戶和文件夾。

@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) 

我想這是因爲該文件夾的關鍵包含其祖先鍵爲好,但我的問題是,我不知道所有的的祖先路徑給定其ID的文件夾。

我可以知道它是路徑中的第一個祖先,即擁有根文件夾的用戶。我發現有一個Query.setAncestor(Key)方法,這可能適合在這裏,但它只是一個查詢,而不是一個「密鑰查找」...

任何人都知道如何做到這一點?

回答

2

我並不熟悉Java的一面,但數據存儲在Java/Python上基本相同。

一旦你開始使用祖先,ids /名稱不再是實體的唯一標識符。唯一標識符是id與整個祖先路徑的組合。在不同的祖先下可能有多個具有相同ID的實體。沒有完整的祖先路徑,你沒有獨特的鑰匙。

您可以做的最好的做法是對匹配該ID的實體進行查詢,然後在返回的集合內找出您想要的內容。您可以在Query之後再次執行getObjectById以獲得一致版本,但這對於新實體並沒有什麼幫助。

你可能想重溫一些事情,比如你是否真的需要在這種情況下的祖先。如果這樣做,則需要設計一些位置來存儲文件夾的整個祖先路徑,以便在執行getObjectById時引用該位置。或者,如果您計劃將文件夾名稱設爲唯一,請使用名稱而不是ID,以便查找。等等。

+0

Thanks @dragonx。請你能提供一個「查詢符合該id的實體」的例子嗎? – MikO 2013-03-25 16:42:56