Java 奇怪的hibernate缓存行为

Java 奇怪的hibernate缓存行为,java,hibernate,Java,Hibernate,我使用ehcache和hibernate3.6.7最终版本。这是一个揭示缓存问题的伪代码示例 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class A{ long id; @OneToMany(mappedBy = "aId", targetEntity = B.class, fetch = FetchType.LAZY) @Fetch(value = FetchMode.JO

我使用ehcache和hibernate3.6.7最终版本。这是一个揭示缓存问题的伪代码示例

@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; 
}
@Cache(用法=cacheconcurrencysttrategy.READ\u WRITE)
公共A类{
长id;
@OneToMany(mappedBy=“aId”,targetEntity=B.class,fetch=FetchType.LAZY)
@Fetch(value=FetchMode.JOIN)
@缓存(用法=CacheConcurrencyStrategy.READ\u WRITE)
保护集字段B;
}    
@缓存(用法=CacheConcurrencyStrategy.READ\u WRITE)
公共B类{
长id;
长期投标;
}
1) 第一次从hibernate加载实体A时,它不读取fieldB。这是正常的-因为设置了FetchType.LAZY

2) 第二次加载实体A时,我看到sql查询检索实体A并加入实体B

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


那么问题是这个bug还是特性?我怎样才能避免这些潜在的事情。

您有两个冲突的获取,您肯定不想在列和@fetch注释上指定获取,因为它将提供不可预测的行为。

您有两个冲突的获取,您肯定不想在列上指定fetch和@fetch注释,因为它将提供不可预测的行为。

您也可以在Hibernate论坛上尝试询问。如果你足够勇敢(并且有时间),可以使用Hibernate源代码进行调试。你也可以尝试在Hibernate论坛上提问。如果您足够勇敢(并且有时间),请使用Hibernate源代码进行调试。