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 :

ConcurrentModificationException sur le commit.


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 41
    Par défaut ConcurrentModificationException sur le commit.
    Bonjour,

    Je n'arrive pas à m'en sortir, j'ai sans arrêt ce type d'exception. Je suis débutant sur Hibernate, et j'essaie de développer une appli avec.

    Voici le problème :
    Je possède plusieurs objets persistants pour modéliser une sorte de page. Une page a plusieurs tableau et chaque tableaux a plusieurs cellules. Cela nous donne plusieurs relation one-to-many en cascades. Ces relations sont en plus triées car ce sont des listes. (je dois pouvoir inverser la position des cellules dans le tableau).
    Lors de la modification d'une cellule (tout au bout de la cascade) : je lève immencablement une ConcurrentModificationException.

    Petit bout de code : l'exception est levée lors du commit, ou d'un flush si j'en mets un au niveau du commit.
    try{
    Cellule cell = (Cellule)HibernateUtil.getSession().get(Cellule.class, id);
    HibernateUtil.beginTransaction();
    cell.setContent(content);

    HibernateUtil.commitTransaction();
    }catch(Throwable e){
    HibernateUtil.rollbackTransaction();
    e.printStackTrace();
    }finally{
    HibernateUtil.closeSession();
    }
    voici un bout de mon mapping.
    <class name="fr.xxxxx.admin.server.hibernate.beans.Tableau" table="TABLEAU">
    <id name="id" column="Tableau_ID">
    <generator class="identity"/>
    </id>
    <many-to-one name="page" column="REF_PAGE_ID" not-null="true"/>
    <property name="index" column="TAB_INDEX" type="int" not-null="true"/>
    <property name="width" column="TAB_WIDTH"/>
    <property name="classe" column="TAB_CLASS"/>
    <list name="cellules" inverse="true">
    <key column="REF_TAB_ID"/>
    <index column="CEL_INDEX"/>
    <one-to-many class="fr.xxxxx.admin.server.hibernate.beans.Cellule"/>
    </list>
    </class>

    <class name="fr.xxxxx.admin.server.hibernate.beans.Cellule" table="CELLULE">
    <id name="id" column="CEL_ID">
    <generator class="identity"/>
    </id>
    <property name="type" column="CEL_TYPE"/>
    <property name="content" type="text" column="CEL_CONTENT"/>
    <property name="width" column="CEL_WIDTH"/>
    <property name="classe" column="CEL_CLASS"/>
    <many-to-one name="tableau" column="REF_TAB_ID" not-null="true"/>
    <property name="index" column="CEL_INDEX" type="int" not-null="true"/>
    </class>
    et la stack :
    Caused by: java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:841)
    at java.util.HashMap$ValueIterator.next(HashMap.java:871)
    at org.hibernate.pretty.Printer.toString(Printer.java:90)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:97)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at fr.xxxxx.admin.server.tools.HibernateUtil.commitTransaction(HibernateUtil.java:103)

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Question 1 : as-tu un seul thread, ou plusieurs accès concurrents ?
    Question 2 : Reproductible à 100% avec le code donné ?
    Question 3 : Tu es en log debug ? Si tu te mets en log erreur ca passe ?

  3. #3
    Membre averti
    Inscrit en
    Février 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 41
    Par défaut
    1/ Un seul thread, oui.

    2/ Reproduit à 100% : oui, mais je n'ai donné que la partie du code qui merde, et je ne suis pas sur qu'en faisant un copié/collé l'erreur soit reproduit... Si besoin, j'essaierai de faire une mini appli zippé qui fait le bug.

    3/ heu, j'avoue ne pas avoir trop regardé les logs, j'ai tout laissé de base. J'avoue également ne pas avoir trop fouillé les fichiers log4j.properties... Mais je ne vois pas trop le rapport entre l'affichage des logs et mon problème.
    Que l'erreur soit loggé ou pas, le contenu de ma cellule n'est pas mise à jour de toute façon, et c'est bien là tout mon problème.

    En tout cas merci de m'avoir répondu si vite Je continue de chercher en tout cas.

  4. #4
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Ben en fait l'idée du niveau de log c'est des traces de ce genre de pb d'après notre ami
    Il semble que ce soit le niveau debug qui provoque un accès concurrent sur l'iterateur ... Si effectivement en error tu n'as plus de pb, on pourra essayer de creuser de ce cote, mais ce que j'ai trouvé pour le moment n'est pas hypra clair.

    Une question liée à la question 3 précédente : surcharges tu des méthodes toString ? Si oui, en les commentant ça résout le problème ?

  5. #5
    Membre averti
    Inscrit en
    Février 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 41
    Par défaut
    Je t'avoue une grande honte de ma vie : je ne comprends pas grand chose aux réglages de log4j... J'ai copié le fichier de base livré avec hibernate dans WEB-INF (et classes au cas où) , et j'ai tout mis en error. Ben les logs crachent encore plein de chose dès qu'hibernate fait une requete... et le problème est toujours là!

    Je vais me pencher sur la conf de mes logs....

  6. #6
    Membre averti
    Inscrit en
    Février 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 41
    Par défaut
    C'est de la folie....

    Effectivement, c'était un problème de log. J'avais encore le message suivant :
    log4j:WARN No appenders could be found for logger (org.apache.catalina.startup.Embedded).
    log4j:WARN Please initialize the log4j system properly.
    j'ai donc fait ce que m'a dit mister google : j'ai mis mon log4j dans common/classes. Le message a disparu (mais pas mes logs, qui finalement ne sont toujours pas correctement configurée...).

    Mais miracle, la réparation de ce problème de log non initialisé fait que maintenant je n'ai plus d'exception...

    J'aime bien comprendre quand un problème est résolu, peux-tu m'envoyer un lien vers un site qui m'explique, ou m'expliquer toi même, le rapport entre les logs et mon précédent problème?

    Merci en tout cas énormément. Dès que je reçois ta réponse je tag le sujet "résolu".


  7. #7
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Désolé, plusieurs jours que je ne m'étais pas connecté ....
    Si je me souviens bien, c'est une histoire que au commit, le log "dump" les objets qui sont en Session. J'ai lu des choses expliquant que si une exception était levée pendant ce dump, alors l'iterator se retrouvait en mauvais état et engendrait une ConcurrentModificationException.

    De tête toujours (je ne retrouve pas le site en question ) cela arrive si tu as redéfini la méthode toString d'un de tes Beans et que cette méthode génère une exception. C'est le cas ?

    (en fait changer le niveau de log c'était pour voir si c'était ce problème là ou pas, ce n'est pas vraiment une résolution en soi ...)

Discussions similaires

  1. [Hook] Hook conditionnel sur pre-commit lors d'un Tag
    Par robinson13 dans le forum Subversion
    Réponses: 0
    Dernier message: 02/09/2014, 15h22
  2. Message d'erreur sur un commit
    Par edblv dans le forum NetBeans
    Réponses: 0
    Dernier message: 13/07/2011, 12h17
  3. Réponses: 3
    Dernier message: 11/01/2007, 13h56
  4. [DB2]Plantage sur COMMIT
    Par Dundee dans le forum DB2
    Réponses: 1
    Dernier message: 24/11/2004, 11h05
  5. Query Begin et Commit son sur un bateau....
    Par faoz75 dans le forum Requêtes
    Réponses: 5
    Dernier message: 15/08/2003, 11h48

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