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 :

Hibernate 3 : HibernateTemplate.saveOrUpdate


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Profil pro
    ingenieur
    Inscrit en
    Avril 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur

    Informations forums :
    Inscription : Avril 2002
    Messages : 207
    Par défaut Hibernate 3 : HibernateTemplate.saveOrUpdate
    Bonjour,
    J'ai un objet mappé sur une table avec une collection attachée.
    (Collection contenant des objets eux meme avec des collections d'autres objets).

    Mon projet : Spring + Hibernate 3 (objet : HibernateDaoSupport).

    Quand j'essaie de mettre à jour mon objet avec le saveOrUpdate() de l'objet HibernateTemplate j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Illegal attempt to associate a collection with two open sessions
    En faisant des recherches sur l'ami google j'ai bien compris qu'il y avait un pb de session ? mais je n'ai pas trouvé la solution au pb ???
    A noter que si je ne rappatrie pas les données de la collection (lazy) la mise à jour fonctionne correctement.

    Merci d'avance pour une piste....

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu n'aurais pas oublié de fermer la session qui a été utilisée pour la lecture ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    ingenieur
    Inscrit en
    Avril 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur

    Informations forums :
    Inscription : Avril 2002
    Messages : 207
    Par défaut
    Tout d'abord merci pour ta réponse ultra rapide !

    J'ai suivi ton conseil et rajouter dans ma classe DAO la fermeture de la session

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    // this = HibernateDaoSupport
     
    Session s = this.getSession();
    s.close();
    s = null;
    Malheureusement cela ne fonctionne toujours pas ?
    Je me demande si ma session est bien fermée ?
    Est ce la bonne méthode pour fermer une session... ? Je fais une recherche...

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il n'y a pas de problème sur la méthode, c'est bien session.close()...

    Peux-tu montrer le fichier hibernate.cfg.xml, les fichiers de mapping concernés par ton problème et le code des DAO ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    ingenieur
    Inscrit en
    Avril 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur

    Informations forums :
    Inscription : Avril 2002
    Messages : 207
    Par défaut
    Le fichier de mapping :

    Fichier de mapping de mon objet (test), ici l'implémentation de test : TestImpl
    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
     
    <class name="objet.process.TestImpl" table="test" >
     
    	<id name="id" type="int">
    		<column name="id"  />
    		<generator class="native"/>
    	</id>		
    	<property name="nom" type="string">
    		<column name="nom" length="100" not-null="true" />
    	</property>
     
    	...
    	<bag name="questions" table="compose" lazy="true"   order-by="numeroQuestion" cascade="all">
    		<key column="idTest" />
    		<many-to-many class="objet.process.QuestionImpl" column="numeroQuestion" />
    	</bag>
     
    </class>
    la query qui charge mon objet...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	<sql-query name="testNouveau">
    		<return alias="test" class="objet.process.TestImpl"/>
    		<![CDATA[
    			Select test.*
    			From test 
    			Inner join compose On test.id = compose.idTest
    			Inner join question On compose.numeroQuestion = question.numero
    			Where codeSousCategorie = :codeSG
    			order by nbrePassage desc
    		]]>
    	</sql-query>
    La DAO abstraite
    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
     
    public abstract class AbsctractDao extends HibernateDaoSupport {
     
      .....
     
      public void modifier(IObjetHcd bean) throws DAOException{
     
            try {	
                this.getHibernateTemplate().saveOrUpdate(bean);
     
            } catch (DataAccessException e) {
     
            	throw new DAOException(e.getMessage());
            } 
        }
     
        ....
     
    }
    Extrait de La DAO test qui étend la DAO abstraite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Query query = this.getSession().getNamedQuery(DaoTestImpl.QUERY_TEST_NOUVEAU);
    			query.setInteger("codeSG", codeSousCategorie);
                listeTests = query.list();
                test = (ITest) listeTests.get(0);
     
                Session s = this.getSession();
     
                s.flush();
                s.close();
                s = null;
                this.getSessionFactory().close();
    En gros juste aprés le chargement de l'objet, je close la session... !

    PAR AVANCE, MERCI de TON AIDE.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je pense que ton problème vient du fait que tu ouvres 2 sessions et que tu ne fermes pas celle du query.
    En gros, il faudrait faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Session s = this.getSession();
    
    Query query = s.getNamedQuery(DaoTestImpl.QUERY_TEST_NOUVEAU);
    			query.setInteger("codeSG", codeSousCategorie);
    listeTests = query.list();
    test = (ITest) listeTests.get(0);
    s.close();
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre éclairé
    Profil pro
    ingenieur
    Inscrit en
    Avril 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur

    Informations forums :
    Inscription : Avril 2002
    Messages : 207
    Par défaut
    Non j'ai toujours l'erreur.
    Je suis ok avec toi c'est un pb de double session.
    Mais je crois que c'est au moment de la sauvegarde que ca ne va pas....
    Bon, mille fois merci pour ton aide.....

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Est ce que tu fais un traitement (qui rattacherait l'objet à une session) sur les éléments de la liste avant de passer dans ta méthode "modifier" ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre éclairé
    Profil pro
    ingenieur
    Inscrit en
    Avril 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur

    Informations forums :
    Inscription : Avril 2002
    Messages : 207
    Par défaut
    Et bé, je fais une lecture pour charger l'objet et puis je le mets tout de suite à jour en appelant le service "modifier".
    En fait je mets à jour un indicateur (un champ) de la table (+1 dans le champ).

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Ton problème vient très certainement de là.
    Quand tu fais ta lecture, tu attaches l'objet à une session et quand ensuite tu exécutes la méthode "modifier", les objets liés restent attachés à la session si elle n'a pas été fermée...

    Par contre, pourquoi faire une lecture ?
    Soit tu mets lazy="false", soit après la lecture de l'objet parent, tu fais un appel au getter lié à la liste (pour charger)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre éclairé
    Profil pro
    ingenieur
    Inscrit en
    Avril 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur

    Informations forums :
    Inscription : Avril 2002
    Messages : 207
    Par défaut
    OK.
    Mais le chargement differé de ma collection posé un pb -> ???
    Je suis obligé de charger complétement l'objet.
    D'ou ce pb.....

  12. #12
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Sinon, essaye de fermer la session qui a été utilisée pour lire avant de passer le Pojo à ta méthode "modifier", ça devrait passer aussi...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [Hibernate] saveOrUpdate / Merge
    Par Adns-plop dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 16/04/2012, 13h36
  2. méthode hibernate saveorUpdate buguée?
    Par Palsajicoco dans le forum Hibernate
    Réponses: 0
    Dernier message: 08/06/2011, 13h10
  3. [Data] HibernateTemplate.saveOrUpdate() -> NonUniqueObjectException
    Par djmalo dans le forum Spring
    Réponses: 1
    Dernier message: 27/10/2009, 14h53
  4. SaveOrUpdate (hibernate) Linq
    Par ahmedmido dans le forum Linq
    Réponses: 1
    Dernier message: 05/11/2008, 17h16
  5. [Hibernate 3/Spring] HibernateTemplate non conseillé ?
    Par hugo123 dans le forum Hibernate
    Réponses: 13
    Dernier message: 08/04/2008, 12h24

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