Hibernate第二级命中,但同样的实体仍然可以访问数据库

时间:2012-08-08 10:02:53

标签: java hibernate caching

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

0 个答案:

没有答案