0

我有这种情况(底部有详细信息):

  • X 是一个休眠实体
  • Xy 是对另一个休眠实体 Y 的延迟加载引用
  • Yz 是休眠实体 Z 的延迟加载、缓存集合

在事务后 Spring bean 中,在 open-session-in-view 中,我正在访问 Xyz 并获得“org.hibernate.HibernateException: Unable to resolve owner of loading collection [...] for second level caching”。调试到 Hibernate 4.3.8.Final 我发现 Xy 是使用临时会话延迟加载的,因此在寻找它的“原始”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;
}

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

4

1 回答 1

0

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

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

随着版本升级,这种注入的执行方式发生了变化,尽管它可以工作,但它是在加载原始映射之前应用的,即我们循环遍历空迭代器并且什么都不注入。

于 2015-12-17T08:04:03.213 回答