我使用ehcache和hibernate 3.6.7 Final。这是一个伪代码示例,它揭示了缓存问题。
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class A{
long id;
@OneToMany(mappedBy = "aId", targetEntity = B.class, fetch = FetchType.LAZY)
@Fetch(value = FetchMode.JOIN)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
protected Set<B> fieldB;
}
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class B {
long id;
long bId;
}
1)第一次从hibernate加载实体A时,它不会读取fieldB。这没关系 - 因为设置了FetchType.LAZY。
2)第二次加载实体A时,我看到sql查询检索实体A JOIN实体B.
3)如果删除@Fetch(value = FetchMode.JOIN),则不会执行第2点。
所以问题是这个错误或功能?我怎样才能避免这种潜在的事情。
答案 0 :(得分:1)
您有两个冲突的提取,您绝对不希望在列和@Fetch注释上指定提取,因为它将提供不可预测的行为。