2

休止状態 3.2.5 を使用しています。

DepartmentTrainingテーブルの間に一対多の関係があります。第 2 レベルのキャッシングが有効になり (EHCache を使用) dept.cfg.xml、データをキャッシングするために および `training.hbm.xml ファイルの両方で以下のエントリが作成されます。

<cache usage="read-only" />

問題の説明

Deptレコードとレコードの両方を取得するために、初めて DB ヒットが行われTrainingます。2 回目Departmentはキャッシュからデータがフェッチされますが、データを取得するためにTrainingDB ヒットが再度行われます - なぜですか? このTrainingデータも、毎回 DB にアクセスするのではなく、キャッシュから取得する必要があります。

これはDept.javaファイルです。

private int deptId;
private String deptName;
private Map trainingDetails;

次のように、 dept.hbm.xmlファイルのマッピングについて言及しました。

//Mappings between POJO and DB Table
<map name="trainingDetails" inverse="false" cascade="delete" lazy="false">
      <key column="DEPT_ID"></key>          
      <map-key formula="ID" type="integer"></map-key>
      <one-to-many class="com.model.Training"/>          
</map>

これは私が試したコードです:

SessionFactory sf = new Configuration().configure("trial.cfg.xml").buildSessionFactory();
    Session session = sf.openSession();

    Dept department = (Dept)session.load(Dept.class, 1);
    //Some business related operations
    session.flush();
    session.close();
            //Some operations
            Session session1 = sf.openSession();        
    Dept department1 = (Dept)session1.load(Dept.class, 1);
    //Here I can see in the console the query for fetching the 
    //training details for the department is getting executed again
    //but the Department details is getting fetched from the Cache - WHY?
    //I want the Training details also to be fetched from the cache.
    session1.flush();
    session1.close();

不足しているものと、これを解決する方法を教えてください。

4

1 に答える 1

5

エンティティを第 2 レベルのキャッシュにキャッシュするように Hibernate に指示すると、キャッシュDepartmentされたエンティティごとにおよびフィールドDepartmentの値が格納されます。ただし、デフォルトではフィールドの内容は保存されません。が第 2 レベルのキャッシュから読み取られ、アプリケーションが members フィールドにアクセスする必要がある場合、Hibernate はデータベースにアクセスしてコレクションの現在のメンバーを決定します。deptIddeptNametrainingDetailsDepartment

Hibernate に members フィールドの内容をキャッシュさせたい場合は、cache要素をmembers宣言に追加してキャッシュするように指示する必要があります。

//Mappings between POJO and DB Table
<map name="trainingDetails" inverse="false" cascade="delete" lazy="false">
      <!-- Cache the ids of entities are members of this collection -->
      <cache usage="read-only" />
      <key column="DEPT_ID"></key>          
      <map-key formula="ID" type="integer"></map-key>
      <one-to-many class="com.model.Training"/>          
</map>
于 2013-06-30T09:32:48.193 に答える