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] des update en "double"


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3
    Par défaut [hibernate] des update en "double"
    bonjour,
    j'ai une application standalone. Dans celle ci, j'ai une table album qui peut avoir o,n (user), et la table user peut avoir o,n album relation o,n au sens relationnel.
    ci-joint mon mapping hibernate.

    pour album
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <hibernate-mapping>
    
    	<class 
        name="racine.pgr.gestiongalerie.metier.Album" 
        table="ALBUM" >
        
        <id name="id" column="ID" type="java.lang.Long">
            <generator class="increment"></generator>
        </id>
        
        <property name="cheminGalerie" column="REP_GAL" type="java.lang.String"/>
        <property name="js" column="REP_JS" type="java.lang.String"/>
        <property name="imgBorder" column="REP_IMG" type="java.lang.String"/>
        <property name="css" column="REP_CSS" type="java.lang.String"/>
    		<property name="valueForExif" column="VALUE_FOR_EXIF" type="java.lang.String"/>
    		<property name="descriptifCourt" column="DESCRIPTIF_COURT" type="java.lang.String"/>
    		<property name="forPiclens" column="FOR_PICLENS" type="java.lang.Boolean"/>
    		<property name="keepExif" column="KEEP_EXIF" type="java.lang.Boolean"/>
    		
    		<many-to-one name="galerie" class="racine.pgr.gestiongalerie.metier.Galerie"
    				column="ID_GALERIE"
    				unique="true"
    				lazy="false"
            />
        
        <list name="albumUserRels" table="AlbumUserRel" cascade="delete-orphan">
        	<key column="ID_USER"/>
        	<list-index column="ID"/> <!-- ordre selon la colonne de la table accédée (AlbumUserRel) -->
        	<one-to-many class="racine.pgr.gestiongalerie.metier.AlbumUserRel"/>
        </list>
        
    	</class>
    </hibernate-mapping>
    pour la table AlbumUserRel
    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
     
    <hibernate-mapping>
     
      <class 
        name="racine.pgr.gestiongalerie.metier.AlbumUserRel" 
        table="AlbumUserRel" >
     
        <id name="id" column="ID" type="java.lang.Long">
            <generator class="increment"/>
        </id>
     
     		<many-to-one name="user" column="ID_USER" fetch="select" class="racine.pgr.gestiongalerie.metier.User" not-null="false"/>
     		<many-to-one name="album" column="ID_ALBUM" fetch="select" class="racine.pgr.gestiongalerie.metier.Album" not-null="false"/>
     
      </class>
    </hibernate-mapping>
    et la table user pour info.
    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
     
    <hibernate-mapping>
     
      <class 
        name="racine.pgr.gestiongalerie.metier.User" 
        table="User" >
     
        <id name="id" column="ID" type="java.lang.Long">
            <generator class="increment"/>
        </id>
     
     		<!-- property name="pos" column="POS" type="java.lang.Integer"/-->
     		<property name="firstName" column="FIRST_NAME" type="java.lang.String"/>
     		<property name="lastName" column="LAST_NAME" type="java.lang.String"/>
     		<property name="login" column="LOGIN" type="java.lang.String"/>
     		<property name="password" column="PASSWORD" type="java.lang.String"/>
     		<property name="profile" column="PROFILE" type="java.lang.String"/>
     		<property name="dateCreation" column="DATECREATION" type="java.util.Date"/>
     		<property name="dateValidite" column="DATEVALIDITE" type="java.util.Date"/>
     
      </class>
    </hibernate-mapping>
    Maintenant, quand je sauvegarde des utilisateurs pour un album, j'execute le conde suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        List albumUserRels = album.getAlbumUserRels();
          if (albumUserRels != null)
          {
            for (int i = 0; i < albumUserRels.size(); i++)
            {
              AlbumUserRel albumUserRel = (AlbumUserRel) albumUserRels.get(i);
              albumUserRel.setAlbum(album);
              User user = daoUser.getUser(albumUserRel.getUser().getId());
              albumUserRel.setUser(user);
              daoAlbum.insertAlbumUserRel(albumUserRel);
            }
          }
          daoAlbum.insertAlbum(album);
    sachant que insertAlbumUserRel fait un saveOrUpdate et insertAlbum fait également un saveOrUpdate.

    Il insère bien les valeurs :
    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
    INSERT INTO ALBUMUSERREL VALUES(1,NULL,0)
    INSERT INTO ALBUMUSERREL VALUES(2,NULL,1)
    INSERT INTO ALBUMUSERREL VALUES(3,NULL,2)
    INSERT INTO ALBUMUSERREL VALUES(4,NULL,3)
    INSERT INTO ALBUM VALUES(1,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
    DELETE FROM ALBUMUSERREL WHERE ID=1
    INSERT INTO ALBUMUSERREL VALUES(1,1,0)
    DELETE FROM ALBUMUSERREL WHERE ID=2
    INSERT INTO ALBUMUSERREL VALUES(2,1,1)
    DELETE FROM ALBUMUSERREL WHERE ID=3
    INSERT INTO ALBUMUSERREL VALUES(3,1,2)
    DELETE FROM ALBUMUSERREL WHERE ID=4
    INSERT INTO ALBUMUSERREL VALUES(4,1,3)
    DELETE FROM ALBUMUSERREL WHERE ID=1
    INSERT INTO ALBUMUSERREL VALUES(0,1,1)
    DELETE FROM ALBUMUSERREL WHERE ID=2
    INSERT INTO ALBUMUSERREL VALUES(1,1,1)
    DELETE FROM ALBUMUSERREL WHERE ID=3
    INSERT INTO ALBUMUSERREL VALUES(2,1,1)
    DELETE FROM ALBUMUSERREL WHERE ID=4
    INSERT INTO ALBUMUSERREL VALUES(3,1,1)
    COMMIT
    Mon problème est qu'il effectue une série de delete/update qui ne correspondent à rien ici en gras.
    Auriez-vous une idé d'où cela peut venir.

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il y a une raison particulière de faire appel à cette classe intermédiaire qu'est AlbumUserRel plutot que de faire directement un mapping many-to-many album <-> user?

    A part çà, pourrait tu ajouter des messages dans ton code aux différentes étape et nous donner l'output de ces messages combiné au sql généré par hibernate? Est-il possibel que tu appelle simplement deux fois la méthode?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3
    Par défaut
    La principale raison est que j'aimerai ajouter par la suite des champs dans la table de jointure. Voir même par la suite mettre une autre association sur la table de jointure s'il y a trop de colonnes.
    J'aurais pu passer par un composite-element mais j'ai testé c'est plus flexible en passant par un object intermédiaire, enfin pas dans ce cas à priori.

    Pour ce qui est des traces, je n'ai aucune erreur jusqu'à ce que je commite la transaction, ou éventuellement flush la session(mais je n'ai pas testé)...
    Oui bon, non je n'appelle pas deux fois la méthode (j'ai fait le débug sous eclipse pour vérifier), cela fait pareil si je place le commitTransaction juste après la dernière instruction....

    phfff, j'ai beau le tourné dans tous les sens ca me fait des truc bizarres.
    Je n'ai plus d'idées...


    Citation Envoyé par tchize_ Voir le message
    il y a une raison particulière de faire appel à cette classe intermédiaire qu'est AlbumUserRel plutot que de faire directement un mapping many-to-many album <-> user?

    A part çà, pourrait tu ajouter des messages dans ton code aux différentes étape et nous donner l'output de ces messages combiné au sql généré par hibernate? Est-il possibel que tu appelle simplement deux fois la méthode?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    de fait, si tu a besoin de champs en plus, ca s'explique Que se passe-t-il si tu met ceci à la fin de la boucle (dans la boucle)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.out.println("envoi des données");
    session.flush();
    ?

    Note que quand tu fait un select, hibernate commence à faire un flush. Aussi, il me semblerait assez judicieux de persister l'album (et eventuellement le user) avant de créer et persister les rel qui lui correspondent. Sinon, tu risque d'avoir des rel vers l'album '0' que tu stocke, puis quand tu stocke enfin l'album, ca devient des relations vers l'album '9' par exemple. (Note que hibernate devrait normalement raler sur le coup si album n'existe pas)


    La logique de la boucle, j'avoue m'échappe un peu aussi, si je lit bien:

    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
        List albumUserRels = album.getAlbumUserRels();
          if (albumUserRels != null)
          {
            for (int i = 0; i < albumUserRels.size(); i++)
            {
              AlbumUserRel albumUserRel = (AlbumUserRel) albumUserRels.get(i);
              // albumUserRel est donc une relation album -> user X
              albumUserRel.setAlbum(album); 
              // on redéfinit album à ce qui devrait déjà être album, code inutile
              User user = daoUser.getUser(albumUserRel.getUser().getId());
              // On récupère le user de l'albumUserRel par Id+dao au lieu de faire simplement
              // User user = albumUserRel.getUser();
              // Déjà inutile en soit
              albumUserRel.setUser(user);
              // on redéfinit le user à la même valeur, ce qui se résume à
              // albumUserRel.setUser(albumUserRel.getUser());
              daoAlbum.insertAlbumUserRel(albumUserRel);
              // on fait un update sans rien avoir théoriquement changé
          }
    Si t'expliquait ce que tu cherche à faire?

Discussions similaires

  1. Interprétation des valeurs NULL et '' (double quotes)
    Par thatsallfunk dans le forum Administration
    Réponses: 2
    Dernier message: 09/01/2009, 15h21
  2. [MySQL] Sauvegarder du texte (db mysql) CR, single-quote, double-quote, etc
    Par vandeyy dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/03/2007, 11h22

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