1

データストアにJDOを使用してJavaGAEアプリを作成しています。

私はこれらの2つのクラスUserとFolderを持っています。

@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の両方で基本的に同じです。

祖先の使用を開始すると、ID/名前はエンティティの一意の識別子ではなくなります。一意の識別子は、IDと祖先パス全体の組み合わせです。異なる祖先の下に同じIDを持つ複数のエンティティを持つことができます。祖先パス全体がないと、一意のキーがありません。

最善の方法は、そのIDに一致するエンティティのクエリを実行してから、返されたセット内で必要なエンティティを特定することです。クエリの後でgetObjectByIdを再度実行して、一貫性のあるバージョンを取得できますが、新しいエンティティの場合は実際には役に立ちません。

この状況で本当に祖先が必要かどうかなど、いくつかのことを再検討することをお勧めします。その場合、getObjectByIdを実行するときにそれを参照できるように、フォルダーの祖先パス全体を格納する場所を設計する必要があります。または、フォルダ名を一意にする場合は、IDの代わりに名前を使用して、検索しやすくします。等

于 2013-03-25T16:34:37.973 に答える