java - example - Falló al inicializar perezosamente una colección de roles.
hibernate jpa (3)
Es posible que no estés recuperando el Conjunto Unido. Asegúrese de incluir el conjunto en su 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();
}
Donde tu clase tiene 2 sets como:
public class Node implements Serializable {
@OneToMany(fetch=FetchType.LAZY)
private Set<NodeValue> nodeValues;
@OneToMany(fetch=FetchType.LAZY)
private Set<NodeStat> nodeStats;
}
Hola tengo dos clases como esta:
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;
...
}
Cuando los uso así:
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;
}
Este código devuelve una excepción: no se pudo inicializar perezosamente una colección de roles: com.porism.service.domain.Indicator.indicatorAlternateLabels, no se cerró ninguna sesión o sesión
¿Alguna idea? Soy muy nuevo en Hibernate
Las excepciones perezosas se producen cuando se obtiene un objeto que normalmente contiene una colección que se carga de forma perezosa e intenta acceder a esa colección.
Puedes evitar este problema
- acceder a la colección perezosa dentro de una transacción.
- Inicializando la colección usando
Hibernate.initialize(obj);
- Traer la colección en otra transacción.
- Utilice
Fetch profiles
para seleccionar el tiempo de ejecución deFetch profiles
perezoso / no perezoso - Establecer fetch como no perezoso (que generalmente no se recomienda)
Además, recomendaría ver los enlaces related
a su derecha donde esta pregunta ha sido respondida muchas veces antes. Ver también el diseño de aplicaciones de carga lenta de Hibernate .
Prueba swich fetchType de LAZY a EAGER
...
@OneToMany(fetch=FetchType.EAGER)
private Set<NodeValue> nodeValues;
...
Pero en este caso su aplicación recuperará datos de DB de todos modos. Si esta consulta es muy difícil, esto puede afectar el rendimiento. Más aquí: https://docs.oracle.com/javaee/6/api/javax/persistence/FetchType.html
==> 73