したがって、答えは、エンティティの切り離されたバージョンを使用することです。私は今このようなものに見える1つの関数を使用してすべてのエンティティをロードします:
@SuppressWarnings("unchecked")
E cachedEntity = (E) cache.get(cacheKey);
if (cachedEntity != null) {
entity = cachedEntity;
}
else {
entity = pm.getObjectById(Eclass, key);
cache.put(cacheKey, pm.detachCopy(entity));
}
欠点は、子オブジェクトを取得するときに、RPCentity = pm.makePersistent(entity)
を生成するエンティティを明示的にアタッチし直す必要があることです。Datastore.GET
ただし、これはあまり頻繁には発生せず、子オブジェクトではなくエンティティ自体にアクセスしたいだけなので、非常に効率的です。
私はさらに良い解決策に出くわしました。JDOはエンティティがデータストアに実際に存在するかどうかをチェックするため、エンティティをアタッチするときに1つのRPC呼び出しがあります。また、DataNucleusのドキュメントによると、PMFでに設定datanucleus.attachSameDatastore
するだけでこれをオフにできます。false
ただし、私には機能しませんDatastore.GET
。オブジェクトをアタッチするときに常に呼び出されます。それが機能すれば、キャッシュからオブジェクトをフェッチした直後にすべてのオブジェクトを暗黙的にアタッチでき、コストはかかりません。必要に応じて手動でアタッチする必要はありません。