2012-02-21 9 views
1

以下は、私のHibernateマッピングファイルのスニペットです。返されるMyCodeオブジェクトにマップされるネイティブSQLクエリを使用しています。クエリで指定されたテーブルのうち、実際にHibernateにマップされているものはほんの一部です。ネイティブSQLクエリのHibernateキャッシング

<hibernate-mapping package="a.b.c.d"> 
    <class name="MyCode" table="OVERRIDE" schema="SCHEMA1"> 
     <id name="myId" type="java.lang.Long"> 
      <column name=ID" length="22"/> 
      <generator class="assigned"/> 
     </id> 
     <property name="myCode" type="java.lang.String"> 
      <column name=CD"/> 
     </property> 
     <property name="myDescription" type="java.lang.String"> 
      <column name="DESC" length="120"/> 
     </property> 
    </class> 

    <sql-query name="retrieveCodes"> 
     <return class="MyCode"/> 
     <![CDATA[ 
     select distinct o.ID, ec.CD, o.DESC 
     from SCHEMA1.AEFX aefx, SCHEMA1.EC ec, SCHEMA1.FC fc, SCHEMA1.MYCODE o 
     .... 
     .... 

このクエリでキャッシュを追加することのメリットについては、関連するデータはめったに更新されませんが、多くのデータが読み込まれます。

Hibernateがこれらのタイプのクエリに対してサポートしていることについては、Hibernateのドキュメントで明確な答えを得ることができませんでした。私は、上記の表のほとんどがHibernateに知られていないので、第2レベルのキャッシュがここではうまく動作しないだろうと推測しています。 このネイティブクエリのキャッシングに関する最良の選択肢は何ですか?

ありがとうございます。

答えて

3

すべてのネイティブクエリはキャッシュ、すべての領域を無効にします。

+0

ありがとう、なぜですか? – DJ180

+0

ネイティブクエリーを変更したことをスパイするのは非常に難しいと思います。たとえば、すべてのデータを変更するストアドプロシージャを呼び出すことができます。 jvmからそれを追跡する方法はありません。キャッシングは簡単で無効なキャッシュは難しい。 – iddqd

関連する問題