0

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

4

0 回答 0