sql >> Base de Datos >  >> RDS >> Mysql

Hibernate:no se pudo inicializar perezosamente una colección de funciones:beans.Language.patients, no se pudo inicializar el proxy:no hay sesión

Su convertidor json intenta serializar toda la entidad, que contiene la lista de todos los pacientes que hablan cada idioma. Por lo que entendí, no se espera la lista de pacientes en el json. Así que tienes tres opciones (ordenadas en las que las consideraría):

  • Elimine la asignación a pacientes en la entidad Idioma. ¿Necesita obtener acceso a los pacientes desde la entidad de idioma? Si no, elimine esta asignación.
  • Cree un DTO de idioma donde transfiera sus datos antes de salir de la capa tx. De esta manera, quien llame al servicio nunca obtendrá una LazyInitException. No sorprende:los campos DTO siempre se configuran con entusiasmo.
  • Configure su convertidor json para que no serialice los campos del paciente. No has dicho qué json lib estás usando. Algunos de ellos le dan una anotación para ignorar algunos campos (@JsonIgnore para Jackson, por ejemplo), otro requiere configuración Java.

Para aplicar la primera solución, actualice esos archivos de esta manera:

Idioma.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 14, 2016 4:33:23 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="beans.Language" table="language" catalog="myglukose" optimistic-lock="version">
        <id name="idlanguage" type="java.lang.Integer">
            <column name="idlanguage" />
            <generator class="identity" />
        </id>
        <property name="language" type="string">
            <column name="language" length="45" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

Idioma.java

public class Language  implements java.io.Serializable {
    private Integer idlanguage;
    private String language;

    protected Language() {
    }


    public Language(String language) {
        this.language = language;
    }

    public Integer getIdlanguage() {
        return this.idlanguage;
    }

    protected void setIdlanguage(Integer idlanguage) {
        this.idlanguage = idlanguage;
    }
    public String getLanguage() {
        return this.language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }
}

Actualicé el constructor sin argumentos y setId método para protected . Incluso puedes actualizarlos a private :solo hibernate debería usarlos (y puede usar campos/métodos privados).