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 :

mapping de map


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut mapping de map
    Bonjour.

    Je dois mapper un map contenant en index un Integer et en élément un objet Perception. Map<Integer, Perception>
    Cette map est un attribut de la classe MyClass
    Mapping de MyClass:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <class name="test.model.MyClass" table="myClass" catalog="test">
    		<id name="id" type="java.lang.Integer">
    			<column name="id" />
    			<generator class="increment" />
    		</id>
     
                    <map name="visibility" table="visibility" cascade="all">
    			<key column="id" />
    			<index-many-to-many column="sense" class="test.model.Sense"/>
    			<many-to-many column="perception" class="test.model.Perception"/>
    		</map>
    </class>
    Mapping de Perception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        <class name="test.model.Perception" table="perception" catalog="test">
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="increment" />
            </id>        
        </class>
    Mapping de Sense
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <class name="Sense" table="sense" catalog="test">
      <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="increment" />
            </id>
    </class>
    Code java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Map<Integer, Perception> visibility = new HashMap<Integer, Perception>();
    MyClass myClass= new myClass();
    Perception perception1= new Perception();
    Perception perception2= new Perception();
     
    visibility.put(1, perception1);
    visibility.put(2, perception2);
     
    myClass.setVisibility(visibility);
    sess.save(perception1);
    sess.save(perception2);
    sess.save(myClass);
    Si je n'ajoute qu'un seul Element à ma map visibility, la sauvegarde se passe sans problème. Si j'en mets plusieurs j'ai :
    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
    25
     
    Hibernate: insert into myclass (id) values (?)
    Hibernate: insert into perception(id) values (?)
    Hibernate: insert into perception(id) values (?)
    Hibernate: insert into visibility (id, sense, perception) values (?, ?, ?)
    Hibernate: insert into visibility (id, sense, perception) values (?, ?, ?)
     
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:145)
    	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    	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 test.main.main(main.java:82)
    Caused by: java.sql.BatchUpdateException: Duplicate entry '1' for key 'PRIMARY'
    	at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1257)
    	at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:943)
    	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
    	... 8 more
    Il y a donc un problème d'auto-increment dans la table visibility. Elle est pourtant paramétrée pour être en auto-incrément. J'ai testé avec des inserts en dur ça passe sans soucis dans la table visibility.

    J'ai essayé en mettant des flush un peu partout pour récupérer les index, mais comme la table visibility n'est pas un objet mappé il ne récupère pas le dernier id inséré ...
    Il y a surement un paramètre que j'ai oublié de préciser quelque part mais je ne vois pas ce qui pourrait me débloquer.

    Merci pour votre aide.

    Benoit

  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 fais 2 fois la sauvegarde des éléments...
    une fois via sess.save(element1);
    et une autre via sess.save(myClass);

    puisque le mapping de myClass a une stratégie "cascade=all".
    Tu peux retirer les sess.save(element1)...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Oui merci. C'est un mauvais copier/coller le cascade all.
    Mais cela ne règle pas le problème sur la map stockée dans la table visibility.

  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
    Peux-tu montrer le mapping de Element ?
    (pas celui de test.model.Perception)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Pardon, j'ai mis tout comme il faut dans mon premier post.
    Les bons mapping et classes.
    En espérant que cela aide mieux à comprendre.

Discussions similaires

  1. [MAPS] SAS MAPS graphique 2 barres
    Par id301077 dans le forum ODS et reporting
    Réponses: 1
    Dernier message: 30/10/2008, 16h33
  2. Mapping de map un peu complexe
    Par hpavavar dans le forum Hibernate
    Réponses: 13
    Dernier message: 11/08/2008, 11h32
  3. [STL] Parcours de maps de maps de char*
    Par FenX. dans le forum SL & STL
    Réponses: 19
    Dernier message: 17/07/2007, 09h50
  4. Réponses: 8
    Dernier message: 09/02/2007, 15h31
  5. Réponses: 4
    Dernier message: 02/03/2006, 20h40

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