【发布时间】: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