没有懒惰地初始化一个角色集合
嗨我有两个这样的课程:
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; }
尝试从LAZY到EAGER的 swich fetchType
... @OneToMany(fetch=FetchType.EAGER) private Set nodeValues; ...
但在这种情况下,您的应用程序无论如何都会从数据库中获取数据。 如果这个查询非常困难 – 这可能会影响性能。 更多信息: https : //docs.oracle.com/javaee/6/api/javax/persistence/FetchType.html
==> 73