私は Hibernate 4.1.3 を使用していますが、2 番目のレベルのキャッシュがヒットしている間でも、同じエンティティについてデータベースも参照されていることに驚いています。
DEBUG net.sf.ehcache.Cache - com.behindmedia.btfd.model.UserCache: com.behindmedia.btfd.model.User store hit for com.behindmedia.btfd.model.User#2
DEBUG org.hibernate.SQL - select user0_.id as id5_3_ .... etc
スタック トレースを見ると、2 番目のレベルのキャッシュからエンティティを読み込むメソッドによって SQL が実行されているようです。
org.hibernate.event.internal.DefaultLoadEventListener (assemblyCacheEntry) の loadFromSecondLevelCache。
ここで何か不足していますか?User クラスで熱心なフェッチ アノテーションを使用します。
編集
次のように、User と UserStats の 2 つのエンティティがあります。
@Entity
public class User {
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private UserStats stats = new UserStats(this);
...
}
@Entity
public class UserStats extends AbstractUserStats {
@OneToOne(mappedBy = "stats")
private User user;
...
}
問題は、ユーザーが第 2 レベルのキャッシュから正しく取得されても、UserStats から User への逆マッピングがデータベースから読み込まれることであることがわかりました。このユーザーは、キャッシュから取得したユーザーとまったく同じであるため、あまり論理的ではないように思えます。