奇怪的hibernate缓存行为

时间:2012-06-15 12:13:07

标签: java hibernate

我使用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点。

所以问题是这个错误或功能?我怎样才能避免这种潜在的事情。

1 个答案:

答案 0 :(得分:1)

您有两个冲突的提取,您绝对不希望在列和@Fetch注释上指定提取,因为它将提供不可预测的行为。