1

単純な長い主キーを持つエンティティがあります。私は次のようなクエリを実行します: Select from table where primary_key IN (....);

Hibernate はクエリを実行して Id (指定したばかりです!) を取得し、L2 キャッシュに移動するようです。最初のクエリをスキップする方法はありますか? 主キーによる一連のエンティティが必要です。これが JPA 1 なのか JPA 2.0 なのか (Lists をより適切にサポートする) は不明です。

ループで findById() を実行して目的の結果を得ることができますが、これは明らかに最適ではありません。

4

1 に答える 1

0

クエリ キャッシングを有効にし、この特定のクエリをキャッシュ可能にする必要があります。これはヒントを介して JPA 2.0 でのみ使用できます。

query.setHint(“org.hibernate.cacheable”, true);

また、次のプロパティを設定してクエリ キャッシュを有効にします。

hibernate.cache.use_query_cache true

もう 1 つの解決策は、ループ内で getReference を使用し、バッチ読み込みを有効にすることです。インスタンスがキャッシュに存在する場合は、キャッシュから返されます。そうでない場合は、プロキシされた最初のオブジェクトにアクセスしたときに 1 つのクエリが起動され、それらのバッチがロードされます。これをユーティリティ関数の背後に隠すことができます。

public List<T> findMany(Class<T> entityClass,List<? extends Serializable> ids) {
  List<T> result = new ArrayList<T>;
  for(Serializable id:ids) {
     result.add(entityManager.getRefrence(id));
  }

  for(T entity:result) {
    // force initialization of proxies, if batch loading is enabled
    // this shouldn't lead to one query per entity
    Hibernate.initialize(entity); 
  }
  return result;      
} 

これには、いくつかの調整が必要になる場合があります-テストしていません-特にジェネリック部分。

于 2011-10-14T20:17:56.217 に答える