我正在使用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的反向映射。这个用户与从缓存中检索到的用户完全相同,所以对我来说这似乎不合逻辑。