Hibernate 缓存视图中打开会话的延迟加载关系的延迟加载集合

Hibernate 缓存视图中打开会话的延迟加载关系的延迟加载集合,hibernate,caching,lazy-loading,second-level-cache,open-session-in-view,Hibernate,Caching,Lazy Loading,Second Level Cache,Open Session In View,我有这种情况(详情见底部): X是一个hibernate实体 X.y是对y(另一个hibernate实体)的延迟加载引用 z是hibernate实体z的延迟加载、缓存集合 在事务后Springbean中,在视图中的开放会话中,我正在访问X.y.z并获取“org.hibernate.HibernateException:无法解析加载集合[…]的所有者以进行二级缓存”。 调试到Hibernate 4.3.8.Final我发现X.y是使用临时会话延迟加载的,因此在“原始”StatefulPersi

我有这种情况(详情见底部):

  • X是一个hibernate实体
  • X.y是对y(另一个hibernate实体)的延迟加载引用
  • z是hibernate实体z的延迟加载、缓存集合
在事务后Springbean中,在视图中的开放会话中,我正在访问X.y.z并获取“org.hibernate.HibernateException:无法解析加载集合[…]的所有者以进行二级缓存”。 调试到Hibernate 4.3.8.Final我发现X.y是使用临时会话延迟加载的,因此在“原始”
StatefulPersistenceContext
中不可用,其中
CollectionLoadContext
正在查找它

那么我是在做一些没有做的事情吗?我需要提前显式触发这个延迟加载还是删除缓存

public class Teachable {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fk_org_element_sch", nullable = false)
    protected ElementSch element;
}

public class ElementSch {
    @OneToMany(targetEntity = ElementConnectionSch.class)
    @JoinColumn(name = "fk_org_element_parent")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Collection<ElementConnectionSch> childConnections;
}

public class ElementConnectionSch {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="fk_org_element_parent")
    private ElementSch parent;
}
公共类可教{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“fk\u org\u element\u sch”,null=false)
受保护元素SCH元素;
}
公共类元素{
@OneToMany(targetEntity=ElementConnectionSch.class)
@JoinColumn(name=“fk\U组织\U元素\U父级”)
@缓存(用法=缓存并发策略。非严格读写)
私人收集儿童连接;
}
公共类元素连接{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“fk\U组织\U元素\U父级”)
私立小学家长;
}

提交事务后,但仍在视图中的open session中,我将调用Teachable.getElement().getChildConnections()并获取HibernateeException。通过调试,我可以看到ElementSch和ElementConnectionSch在单独的会话中被延迟加载,即主会话已加载可教会话,两个单独的临时会话正在用于ElementSch和ElementConnectionSch。

由于Hibernate版本升级,这已被确定为我们的一个问题:

我们使用SpringWebFlow并将Hibernate实体放入流范围。为了在流中的多个调用之间正常工作,我们将重新附加包装器注入实体和集合,以便它们拾取正在进行的调用的会话,而不是使用创建它们的会话(现在已关闭)


随着版本升级,该注入的执行方式发生了变化,尽管有效,但它在加载原始映射之前应用了,也就是说,我们在空迭代器上循环,没有注入任何内容。

您也可以上载您的hbm文件吗??还获取X.y集合的属性值??