いくつかの調査の後、私は自分の質問に答えることができると思います。重要なのは、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 の回答によると、エンティティはその参照とともにキャッシュされるため、さらに注釈を付ける必要はありません。