没有懒惰地初始化一个角色集合

嗨我有两个这样的课程:

public class Indicator implements Serializable { ... @OneToMany(mappedBy = "indicator",fetch=FetchType.LAZY) private List indicatorAlternateLabels; public List getIndicatorAlternateLabels() { return indicatorAlternateLabels; } public void setIndicatorAlternateLabels(List 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 indicatorAlternateLabels = null; indicatorAlternateLabels=indicator.getIndicatorAlternateLabels(); metricTypeDetail.setIndicatorAlternateLabels(indicatorAlternateLabels); return metricTypeDetail; } 

此代码返回一个exception:无法懒惰地初始化角色集合:com.porism.service.domain.Indicator.indicatorAlternateLabels,没有会话或会话已关闭

任何想法? 我对Hibernate很新

当您获取通常包含延迟加载的集合的对象并尝试访问该集合时,会发生延迟exception。

你可以避免这个问题

  • 在事务中访问惰性集合。
  • 使用Hibernate.initialize(obj);初始化集合Hibernate.initialize(obj);
  • 在另一个事务中获取集合
  • 使用Fetch profiles选择延迟/非延迟获取运行时
  • 将fetch设置为非惰性(通常不推荐)

此外,我建议您查看以前多次回答此问题的related链接。 另请参阅Hibernate延迟加载应用程序设计 。

您可能没有获取加入集。 确保在HQL中包含该集:

 public List 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(); } 

你的class级有2套,如:

 public class Node implements Serializable { @OneToMany(fetch=FetchType.LAZY) private Set nodeValues; @OneToMany(fetch=FetchType.LAZY) private Set nodeStats; } 

尝试从LAZYEAGER的 swich fetchType

 ... @OneToMany(fetch=FetchType.EAGER) private Set nodeValues; ... 

但在这种情况下,您的应用程序无论如何都会从数据库中获取数据。 如果这个查询非常困难 – 这可能会影响性能。 更多信息: https : //docs.oracle.com/javaee/6/api/javax/persistence/FetchType.html

==> 73