IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[Spring, Hibernate, Struts] LazyInitializationException


Sujet :

Hibernate Java

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut [Spring, Hibernate, Struts] LazyInitializationException
    Bonjour à tous,

    j'utilise Springframework 1.2, hibernate 3.0.3 et Struts 1.2.4.

    J'ai, dans mon fichier de mapping hibernate une simple relation one-to-many d'une classe Client (société) vers une classe Employee.
    En laissant la relation par défaut, je suis en mode lazy="true" et celà me pose un souci assez important.

    En effet, dans mon premier use-case, j'affiche la liste des société (sans charger les employees). Cette liste est stockée en session par mon form bean struts.
    Quand je sélection un élément de ma liste, je désire afficher le liste des employés de cette société mais là, j'ai une érreur que je comprend assez bien et sont voici le début de la stack :

    ERROR LazyInitializationException: failed to lazily initialize a collection (demo.client.data.Client.employees) - no session or session was closed [15:38:34.950] org.hibernate.LazyInitializationException.<init>(LazyInitializationException.java:19)
    En effet, entre mes deux appels struts, la session hibernate a été détruite. Ma question est donc la suivante :
    - Comment détacher le proxy généré par la CGLIB de ma classe 'Client'
    - n'y as t'il pas de ServletFilter Spring à mettre en place pour réassocier ma session (ou une nouvelle session) au ThreadLocal de mon Servlet ?

    PS: Tout fonctionne parfaitement si le suis en lazy="false" mais il est impensable de travailler dans ce mode.


    Merci à tous
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  2. #2
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Il faut créer une nouvelle Session Hibernate pour le load des collections lazy-loadées car tu ne sais effectivement pas si la collection a ou non été chargée. Tout est expliqué dans la doc Hibernate, notion d'objets détachés

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Merci Ego, j'ai bien compris le principe des objets détachés, mais ma session est injectée par IoC (Spring). Dois-je mettre mon LocalSessionFactoryBean en singleton="false" :
    Je ne trouve rien de clair à se sujet...


    Merci


    ps: singleton="false" ne fonctionne pas d'ailleur, c'est un Factory donc, obligatoirement un Singleton
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Bon, j'ai trouvé une petite chose qui cloche dans Spring, surement du à une mauvaise comprehension de ma part alors si un expert pouvais éclaircir ce point ce serais bien aimable :

    J'ai remplacer dans mon AbstractHibernateDao cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object o = getHibernateTemplate().load(getBeanClass(), id.getId());
    Par celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object o = getSession().load(getBeanClass(), id.getId());
    A présent, le lazy-load fonctionne correctement...

    PS: Mon AbstractHibernateDao hérite de HibernateDaoSupport (Hibernate 3)

    Par contre, le saveOrUpdate explose gentilement avec l'erreur suivante :
    org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
    Voici mon mapping pour ma classe Client au cas ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	<class name="Client" table="SOCIETE">
     
    		<id name="id" type="string" unsaved-value="null">
    			<column name="ID" sql-type="char(32)" not-null="true" />
    			<generator class="uuid.hex" />
    		</id>
     
    		<property name="raisonSociale" column="RAISON_SOCIALE"/>
     
    		<set name="employees" cascade="all,delete-orphan" >
    			<key column="SOCIETE_ID" not-null="true"/>
    			<one-to-many class="Employee" />
    		</set>
     
    	</class>
    Evidement, il explose entre deux sessions différente car mon test JUnit fonctionne pour sa part mais tout est fait dans une seule session Hibernate.
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Bon, la solution est bien dans un Servlet Filter et voici sa définition/configuration :


    web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
       ...
    	<filter>
    		<filter-name>hibernateFilter</filter-name>
    		<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    		<init-param>
    			<param-name>sessionFactoryBeanName</param-name>
    			<param-value>mySessionFactory</param-value>
    		</init-param>
    		<init-param>
    			<param-name>singleSession</param-name>
    			<param-value>false</param-value>
    		</init-param>
    	</filter>
     
    	<filter-mapping>
    		<filter-name>hibernateFilter</filter-name>
    		<url-pattern>*.do</url-pattern>
    	</filter-mapping>
    	<filter-mapping>
    		<filter-name>hibernateFilter</filter-name>
    		<url-pattern>*.jsp</url-pattern>
    	</filter-mapping>
       ...
    J'ai replacer mon code avec les getHibernateTemplate(). xxxx() au lieu des getSession().xxxx() et tout fonctionne correctement.
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  6. #6
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    c'est cool les gars qui se répondent à eux mêmes et font participer mes autres !! :-)

    super !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Data] Gestion des exceptions dans applications Spring Hibernate Struts
    Par coco-sup dans le forum Spring
    Réponses: 4
    Dernier message: 09/12/2012, 12h58
  2. Squelette pour Spring+Hibernate+Struts
    Par inflation dans le forum Maven
    Réponses: 1
    Dernier message: 08/02/2011, 10h52
  3. [Data] Spring + hibernate + struts
    Par maxf1 dans le forum Spring
    Réponses: 9
    Dernier message: 15/11/2007, 16h02
  4. Réponses: 2
    Dernier message: 16/02/2006, 09h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo