tutorial example java hibernate

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 de Fetch 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