Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Hibernate- falhou ao inicializar preguiçosamente uma coleção de role:beans.Language.patients, não foi possível inicializar o proxy - sem Session


Seu conversor json tenta serializar toda a entidade, que contém a lista de todos os pacientes que falam cada idioma. Pelo que entendi, a lista de pacientes no json não é esperada. Então você tem três opções (ordenadas em que eu as consideraria):
  • Remova o mapeamento para pacientes na entidade Idioma. Você precisa ter acesso aos pacientes da entidade linguística? Caso contrário, remova este mapeamento.
  • Crie um DTO de idioma para onde você transfere seus dados antes de sair da camada tx. Dessa forma, quem chamar o serviço nunca receberá um LazyInitException. Nenhuma surpresa:os campos DTO são sempre definidos com antecedência.
  • Configure seu conversor json para não serializar os campos do paciente. Você não disse qual lib json está usando. Alguns deles fornecem uma anotação para ignorar alguns campos (@JsonIgnore para Jackson, por exemplo), outros requerem configuração java.

Para aplicar a primeira solução, atualize esses arquivos desta forma:

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>

Language.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;
    }
}

Atualizei o construtor no-arg e setId método para protected . Você pode até mesmo atualizá-los para private :apenas o hibernate deve usá-los (e pode usar campos/métodos privados).