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

Lin*_*e81 28 java hibernate

嗨,我有两个这样的课程:

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;
...
}
Run Code Online (Sandbox Code Playgroud)

当我像这样使用它们时:

 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

任何的想法?我对Hibernate很新

Joh*_*erg 77

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

你可以避免这个问题

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

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