我有这种情况(底部有详细信息):
- 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。