【问题标题】:Caching lazy loaded Collection of a lazy loaded relation from open-session-in-view从 open-session-in-view 缓存延迟加载关系的集合
【发布时间】:2015-12-08 12:57:29
【问题描述】:

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

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

在事务后 Spring bean 中,在 open-session-in-view 中,我正在访问 X.y.z 并得到“org.hibernate.HibernateException: Unable to resolve owner of loading collection [...] for second level caching ”。 调试到 Hibernate 4.3.8.Final 我发现 X.y 是使用临时会话延迟加载的,因此在 CollectionLoadContext 正在寻找它的“原始”StatefulPersistenceContext 中不可用。

所以我在做一些没有做的事情吗?我是否需要事先显式触发延迟加载或移除缓存?

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;
}

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

【问题讨论】:

  • 你也可以上传你的hbm文件吗?还 fetch X.y 集合的属性值??

标签: hibernate caching lazy-loading second-level-cache open-session-in-view


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    相关资源
    最近更新 更多