10

現在、エンティティで JPA2 @Cacheable アノテーションを使用していますが、すべてうまく機能しています。

ManyToOne アソシエーションをキャッシュする必要があります。

従来の Hibernate では、@Cache との関連付けにアノテーションを付ける必要がありました。

@org.hibernate.annotations.Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Student> supervisionGroup;

そして、これは機能します。しかし、エンティティ自体以外には JPA2 @Cacheable アノテーションを使用できないようです。

私は何かを見逃していますか、それとも JPA 委員会はエンティティと同様にアソシエーションもキャッシュする必要があることを認識できませんでしたか? 確かにそれは薄暗いオプションではありませんか??

4

2 に答える 2

4

いくつかの調査の後、私は自分の質問に答えることができると思います。重要なのは、Hibernate が 2LC 内のオブジェクトを脱水することです。これは、関連付けを明示的にキャッシュする必要があるかどうかに影響します。

何かを見逃していたり​​、詳細が間違っていたりした場合は、詳細を追加してください。

単純化されたクラス構造は次のとおりです。

@Entity
@Cacheable
public class Tutor
{
   @OneToMany(mappedBy="tutor")
   private Set<Student> students;
}

@Entity
@Cacheable
public class Student
{
   @ManyToOne(fetch=FetchType.LAZY)
   @JoinColumn(name="TUTOR_FK")
   private Tutor tutor;
}

休止状態の場合

Second Level Cache (2LC) は、エンティティを脱水形式で保存します。

{1=CacheEntry(Tutor)[1, Jack Daw]}
{1=CacheEntry(Student)[1, Jane Smith, 1]}    

Student データの最後の 1 は、tutor への外部キーです。

したがって、学生 ID 1 への参照があり、チューターへの参照をたどると、外部キーがキャッシュにあるため、キャッシュ ヒットが発生します。追加の選択は必要ありません。

ただし、逆に Tutor で getStudents() を呼び出すと、2LC に外部キーがないため、select が必要になります。(選択が完了すると、休止状態は ID を取得し、2LC へのヒットを開始できます)。

これを回避するには、古い org.hibernate.annotations.Cache アノテーションを @OneToMany 関係に追加する必要があります。

TopLinkの場合

私はEclipseLinkのインストールを手元に持っていないので、これをテストすることはできませんが、EclipseLinkは2LCデータを元のオブジェクトグラフの形式で保存することを理解しているので、上記は関係ありません。Chris の回答によると、エンティティはその参照とともにキャッシュされるため、さらに注釈を付ける必要はありません。

于 2013-01-17T18:24:46.050 に答える
0

JPA のキャッシュは、エンティティ オブジェクト自体用です。エンティティがキャッシュされている限り、すべての参照もキャッシュされます。ただし、参照されるエンティティ オブジェクトには独自のキャッシュ オプションがあります。

于 2013-01-16T18:44:57.893 に答える