Mysql
 sql >> Base de données >  >> RDS >> Mysql

Hibernate - échec de l'initialisation paresseuse d'une collection de rôles :beans.Language.patients, impossible d'initialiser le proxy - pas de session

Votre convertisseur json essaie de sérialiser l'entité entière, qui contient la liste de tous les patients parlant chaque langue. D'après ce que j'ai compris, la liste des patients dans le json n'est pas attendue. Vous avez donc trois options (ordonnées dans lesquelles je les considérerais) :

  • Supprimez le mappage aux patients dans l'entité Langue. Avez-vous besoin d'accéder aux patients depuis l'entité linguistique ? Si ce n'est pas le cas, supprimez ce mappage.
  • Créez un DTO de langue dans lequel vous transférez vos données avant de quitter la couche tx. De cette façon, quiconque appelle le service n'obtiendra jamais de LazyInitException. Pas de surprise :les champs DTO sont toujours définis avec impatience.
  • Configurez votre convertisseur JSON pour ne pas sérialiser les champs patient. Vous n'avez pas dit quelle bibliothèque json vous utilisez. Certains d'entre eux vous donnent une annotation pour ignorer certains champs (@JsonIgnore pour Jackson par exemple), autre nécessite une configuration java.

Pour appliquer la première solution, mettez à jour ces fichiers de cette façon :

Langue.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>

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

J'ai mis à jour le constructeur sans argument et setId méthode à protected . Vous pouvez même les mettre à jour en private :seul hibernate devrait les utiliser (et il peut utiliser des champs/méthodes privés).