我正在使用 Hibernate 4.1.3,并且很惊讶地看到,即使在二级缓存被命中时,也会针对同一实体咨询数据库:
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
查看堆栈跟踪,似乎 SQL 是由从二级缓存加载实体的方法执行的:
org.hibernate.event.internal.DefaultLoadEventListener (assembleCacheEntry) 中的 loadFromSecondLevelCache。
我在这里错过了什么吗?我确实在 User 类中使用了 Eager fetch 注释。
编辑
我有两个实体,User 和 UserStats,如下所示:
@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;
...
}
我发现问题在于,即使从二级缓存中正确检索到用户,从数据库中加载了从 UserStats 到 User 的反向映射。该用户与从缓存中检索到的用户完全相同,因此对我来说似乎不太合乎逻辑。