嗨,我有两个这样的课程:
public class Indicator implements Serializable {
...
@OneToMany(mappedBy = "indicator",fetch=FetchType.LAZY)
private List<IndicatorAlternateLabel> indicatorAlternateLabels;
public List<IndicatorAlternateLabel> getIndicatorAlternateLabels() {
return indicatorAlternateLabels;
}
public void setIndicatorAlternateLabels(List<IndicatorAlternateLabel> indicatorAlternateLabels) {
this.indicatorAlternateLabels = indicatorAlternateLabels;
}
...
}
public class IndicatorAlternateLabel implements Serializable {
...
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
@JoinColumn(name = "IndicatorID")
@XmlTransient
private Indicator indicator;
...
}
当我像这样使用它们时:
public MetricTypeDetail getMetricTypeDetail(Integer metricTypeId) {
Criteria crit = sessionFactory.getCurrentSession().createCriteria(Indicator.class, "sub")
.add(Restrictions.eq("number", metricTypeId))
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).setCacheable(true);
crit.setMaxResults(1);
Indicator indicator=(Indicator) crit.uniqueResult();
MetricTypeDetail metricTypeDetail=new MetricTypeDetail(indicator);
List<IndicatorAlternateLabel> indicatorAlternateLabels = null;
indicatorAlternateLabels=indicator.getIndicatorAlternateLabels();
metricTypeDetail.setIndicatorAlternateLabels(indicatorAlternateLabels);
return metricTypeDetail;
}
此代码返回异常: 未能懒惰地初始化角色集合:com.porism.service.domain.Indicator.indicatorAlternateLabels,没有会话或会话被关闭
有什么想法吗?我是Hibernate的新手
答案 0 :(得分:76)
当您获取通常包含延迟加载的集合的对象并尝试访问该集合时,会发生延迟异常。
您可以通过
来避免此问题Hibernate.initialize(obj);
Fetch profiles
选择延迟/非延迟抓取运行时此外,我建议您查看右侧的 related
链接,此问题已经多次得到解答。另请参阅Hibernate lazy-load application design。
答案 1 :(得分:3)
你可能没有获取加入集。请务必在HQL中包含该集:
public List<Node> getAll() {
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("FROM Node as n LEFT JOIN FETCH n.nodeValues LEFT JOIN FETCH n.nodeStats");
return query.list();
}
你的班级有2套,如:
public class Node implements Serializable {
@OneToMany(fetch=FetchType.LAZY)
private Set<NodeValue> nodeValues;
@OneToMany(fetch=FetchType.LAZY)
private Set<NodeStat> nodeStats;
}
答案 2 :(得分:0)
尝试将swich fetchType从 LAZY 改为 EAGER
...
@OneToMany(fetch=FetchType.EAGER)
private Set<NodeValue> nodeValues;
...
但在这种情况下,您的应用程序无论如何都会从数据库中获取数据。 如果这个查询非常困难 - 这可能会影响性能。 更多信息: https://docs.oracle.com/javaee/6/api/javax/persistence/FetchType.html
==&GT; 73
答案 3 :(得分:0)
建议here解决著名的LazyInitializationException是以下方法之一:
(1)使用Hibernate.initialize
Hibernate.initialize(topics.getComments());
(2)使用JOIN FETCH
您可以在JPQL中使用JOIN FETCH语法来显式提取子集合。这有点像EAGER提取。
(3)使用OpenSessionInViewFilter
LazyInitializationException通常发生在视图层中。如果使用Spring框架,则可以使用OpenSessionInViewFilter。但是,我不建议您这样做。如果使用不正确,可能会导致性能问题。