1

我使用 ehcache 和休眠 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)当我第一次从休眠加载实体A时,它不会读取字段B。这没关系 - 因为 FetchType.LAZY 已设置。

2)第二次加载实体 AI 时,看到 sql 查询检索实体 A JOIN 实体 B。

3)如果删除@Fetch(value = FetchMode.JOIN)点2将不会执行。

那么问题是这个错误还是功能?我怎样才能避免这种潜在的事情。

4

1 回答 1

1

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

于 2012-06-15T15:56:50.417 回答