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 : merge() avec une clé composée


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Profil pro
    lead dev
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : lead dev

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Par défaut Hibernate : merge() avec une clé composée
    Bonjour,

    Alors j'ai une table Collaborateur et une table ListeDiffusion. Mes collaborateurs ont la possibilité de s'abonner à un certain nombre de listes de diffusion. Donc hop j'ai créée une table de jointure avec la classe java associée.
    Voici le mapping hibernate pour la table de jointure (Abonnement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <class name="Abonnement" table="ABONNEMENT" optimistic-lock="none">
    	<composite-id>
    		<key-property name="idLstDiffAbonn" type="int" column="ID_LST_DIFF"/>
    		<key-property name="idCollabAbonn" type="int" column="ID_COL"/>
    	</composite-id>
    	  <many-to-one name="idLstDiffAbonn" class="ListeDiffusion" column="ID_LST_DIFF" not-null="true" cascade="merge"/>
    	  <many-to-one name="idCollabAbonn" class="Collaborateur" column="ID_COL" not-null="true" cascade="merge"/>
    </class>
    Maintenant je souhaiterai faire des "insert" dans la table abonnement, mais à ce que j'ai lu les getHibernateTemplate().merge(....) ne fonctionnent pas pour les clé composées.

    Auriez vous une idée sur comment procéder pour créer et supprimer des abonnements (couple collab et LstDiffusion dans la table abonnement) ?

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut
    Pourquoi ne pas utilisé une relation <many-to-many> ?

    Apres comme tu as créer ta propre classe Java, tu gère les insert et update normalement sans passer par un merge.

  3. #3
    Membre confirmé
    Profil pro
    lead dev
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : lead dev

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Par défaut
    mokay..

    Donc dans le fichier de mapping de la liste de diffusion on obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      <set name="collaborateurLstDiff" table="ABONNEMENT"     >
    		<key column="ID_LST_DIF" />
    		<many-to-many  class="Collaborateur" column="ID_COL"   />
      </set>

    J'ai viré la classe Abonnement de l'appli (ainsi que la DAO et l'interface correspondante).

    Par contre dans le fichier ListeDiffusionDaoHibernate comment je dois faire pour récupérer toutes les listes de diffusion à partir de l'id d'un collaborateur.
    Avec le précédent mapping je pensais faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public List<ListeDiffusion> getListesDiffusion(final int idCollaborateur) {
         String requete = "from ListeDiffusion as ld where ld.id in (select abt.id_lst_dif From ABONNEMENT as abt where abt.id_col=?) order by ld.nom"; 
         List<ListeDiffusion> listeDiff = getHibernateTemplate().find(requete, idCollaborateur);
         return listeDiff;
        }

    Mais sans classe Abonnement.. je vois pas comment procéder.. alors si qqun peut m'aiguiller ca serait simpatoch

  4. #4
    Membre confirmé
    Profil pro
    lead dev
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : lead dev

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Par défaut
    Hé bé.. ca ne se bouscule pas au portillon ><

    Bref tout ça pour dire que je me trouve de nouveau bloqué mais cette fois au niveau de la persistance de la table de jointure (Abonnement).

    Voici un extrait de ma classe de test :
    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
    public final void testAbonner() throws ExtranetCEException{
     
             ListeDiffusion lstDiff = listeDiffusionDao.getListeDiffusionParId(6);
             Collaborateur collab = collaborateurDao.getCollaborateurParId(1);
             //Collaborateur collab = (Collaborateur)collaborateurDao.findById(Collaborateur.class, 1);
     
     
             System.out.println(collab.getNomCollab()+"oooooooo");
             lstDiff.addCollaborateurLstDiff(collab);
     
             lstDiff.addCollaborateurLstDiff(collab);
     
             Iterator<Collaborateur> curseurCol = lstDiff.getCollaborateurLstDiff().iterator();
     
             while(curseurCol.hasNext()){
                 System.out.println(lstDiff.getNomLstDiff()+"    "+curseurCol.next().getNomCollab());
             }
             lstDiff = listeDiffusionDao.sauvegarderListeDiffusion(lstDiff);
     
             assertTrue(lstDiff.getCollaborateurLstDiff().contains(collab));
          }
    Quand je regarde le rapport pour vérifier mes out.println tout me parait nikel, les variables ont pris les bonnes valeurs. Cependant dans la base de données la table abonnement n'a pas bougé alors que j'aurai aimé y voir le couple 6,1.


    Savez vous comment on doit procéder pour insérer un tuple dans une table de jointure avec hibernate ?

    Précision : J'ai un mapping many-to-many donc aucune classe Java ou DAO pour la table de jointure Abonnement.

    Précision2 : Je n'ai pas de requete portant sur l'abonnement dans mon fichier ListeDiffusionDaoHibernate, dans ma tête c'est hibernate qui fait la correspondance entre les propriétés de chaque POJO et leur insertion dans la base de données et donc il en est de meme si la propriété est une collection.. il devrait mettre a jour les tables de jointure.


    Merci de votre aide, c'est vraiment pénible de bloquer la dessus :/

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut
    Hé bé.. ca ne se bouscule pas au portillon ><
    Ici c'est le forum Spring et c'est plustot une question Hibernate.

    Sinon tu aura surement une réponse à ton prbleme ICI :

    http://www.hibernate.org/hib_docs/v3.../tutorial.html

    tu as un exemple de mapping Many-to-many et de la gestion de la relation (C'est hibernate qui gère le tout).

    Sinon que fait la méthode sauvegarderListeDiffusion ?

    A un moment tu fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public List<ListeDiffusion> getListesDiffusion(final int idCollaborateur) {
         String requete = "from ListeDiffusion as ld where ld.id in (select abt.id_lst_dif From ABONNEMENT as abt where abt.id_col=?) order by ld.nom"; 
         List<ListeDiffusion> listeDiff = getHibernateTemplate().find(requete, idCollaborateur);
         return listeDiff;
        }
    C'est Hibernate que va charger les collections , normalement tu n'a pas a ecrire la requete à la main.
    Dans chaque Objet tu devrait y retrouver une liste correspondant aux objets liés. Lors de l'insertion Hibernate va recuperer le contenu de la liste et insérer les éléments dans la table de jointure.

    Bon courage avec le tuto

Discussions similaires

  1. Incrémentation avec une clef composée
    Par JaimeLannister dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 08/03/2013, 02h25
  2. Insertion avec une clé composée
    Par Palsajicoco dans le forum Hibernate
    Réponses: 1
    Dernier message: 08/08/2011, 13h10
  3. Hibernate - connexion avec une base sqlite
    Par Lebas dans le forum Hibernate
    Réponses: 0
    Dernier message: 11/10/2010, 16h15
  4. Utiliser Not In avec une clé composée
    Par smail21 dans le forum Bases de données
    Réponses: 10
    Dernier message: 14/01/2008, 16h25
  5. [Hibernate] Set avec une seule valeur
    Par neuromencien dans le forum Hibernate
    Réponses: 6
    Dernier message: 15/05/2006, 16h49

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