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 possible ou trigger nécessaire


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut mapping possible ou trigger nécessaire
    Bonjour, je n'arrive pas à savoir si mon problème est résolvable par le mapping ou si je vais devoir écrire un trigger...

    J'ai 4 tables :
    - Tournee est composée de Trajets
    - Trajet est un chemin entre deux site : siteDepart et siteArrivee qui sotn des clef etrangères sur la table Site
    - Composer qui est en fait le résultat du lien entre Tournee et Trajet
    - Site

    Mon problème : Lorsque je supprime un site,
    1. si le site n'appartient à aucun trajet, pas de soucis
    2. si le site appartient à des trajets mais que ceux-ci n'appartiennent pas à des tournées, fonctionne en mettant un ON DELETE CASCADE sur les deux contraintes étrangères siteDepart et siteArrivee
    3. si le site appartient à des trajets et qu'au moins un de ces trajets appartient à une tournée, je ne dois pas pouvoir supprimer ce site.... : hors cela est possible après l'ajout du on delete cascade mentionné ci-dessus.

    voilou, donc j'ai pas mal lu la doc hibernate, mais je ne sais même pas si ce controle est faisable à partir du mapping ou si je dois me tourner vers un trigger ou autre...?

    les bouts de fichiers de mapping :
    tournee.hbm.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <list name="trajets" table="Composer" cascade="persist,merge,save-update">
       <key column="Tournee_Id" />
       <list-index column="Ordre" />        	
       <many-to-many column="Trajet_Id" class="org.geo.Trajet" />                
    </list>
    trajet.hbm.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <many-to-one name="depart" class="org.data.Site" column="SITE_DEPART"/>
    <many-to-one name="arrivee" class="org.data.Site" column="SITE_ARRIVEE"/>
    merci d'avance,

    cordialement, tatia34

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Si tu fais des relations bidirectionnelles, c'est facile de savoir si tu peux supprimer le site :

    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
     
    List<Trajet> trajets = session.createQuery("from Trajet where siteDepart = :site or siteArrivee = :site").setEntity("site", site).list();
     
    for (Trajet trajet : trajets) {
      if (!trajet.getTournees().isEmpty()) {
        return;
      }
    }
     
     
    for (Trajet trajet : trajets) {
      session.delete(trajet);
    }
     
    session.delete(site);

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    merci beaucoup, je comprends le principe, par contre je suis pas sure de comment le mettre en oeuvre avec la table composer "au milieu"...

    il faut donc rajouter dans le mapping de la table trajet une tournée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <join table="Composer" inverse="true" optional="true">
        <key column="Trajet_id"/>
        <many-to-one name="tournee" column="Tournee_Id" />
    </join>
    sauf que ça me fait une erreur, il veut pas me le mapper... si je rajoute ça au mapping de ma classe trajet, sous Netbeans ça me donne cette erreur là :
    The content of element type "class" must match "(meta*,subselect?,cache?,synchronize*,comment?,tuplizer*,(id|composite-id),discriminator?,natural-id?, (version|timestamp)?,(property|many-to-one|one-to-one|component|dynamic-component|properties|any|map|set|list|bag|idbag|array|primitive-array)*, ((join*,subclass*)|joined-subclass*|union-subclass*),loader?,sql-insert?,sql-update?,sql-delete?,filter*,resultset*,(query|sql-query)*)". [55]

    pourtant c'est tiré de la doc d'Hibernate : http://www.hibernate.org/hib_docs/re...rectional-join chap 7.5.1

    une idée.... ?

    cordialement, tatia34

    edit : l'erreur précédente été dûe au placement du <join> qui apparement doit être à la fin de la classe... ou disons que certain éléments doivent être avant..
    par contre j'obtiens une nouvelle erreur lorsque je tente de générer ma classe (par l'intermédiaire du plugin d'Eclipse) : org.hibernate.MappingException: Could not read mapping document from file: .../src-mapping/org/geo/Trajet.hbm.xml
    org.hibernate.PropertyNotFoundException: field not found: tournee
    org.hibernate.PropertyNotFoundException: field not found: tournee

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    je viens de voir dans la doc d'hibernate :
    " Notez qu'Hibernate ne supporte pas les associations bidirectionnelles avec une collection indexée (list, map or array), vous devez utiliser un mapping set ou bag. "

    la question qui se pose alors, est-ce également le cas avec une table de jointure entre les deux... ?

    cordialement, tatia34

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    C'est une association bidirectionnelle many-to-many, la partie 7.5.3 de la doc.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    un trajet ne peut appartenir qu'à une seule tournée ou à aucune.. il s'agit donc d'une association bidirectionnelle many-to-one (partie 7.5.1. de la doc)

    problème résolu en changeant un petit peu le bout de mapping donné dans la doc hibernate (en gras dans le code ci-dessous):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <join table="Composer" inverse="true" optional="false">
        <key column="Trajet_id"/>
        <many-to-one name="tournee" column="Tournee_Id" />
    </join>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Print et Select pour afficher resultat pas possible en Trigger
    Par facilus68 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/12/2012, 08h02
  2. Modif d'une base sans modif du mapping possible ?
    Par pathfinder06 dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/01/2010, 15h20
  3. Réponses: 2
    Dernier message: 08/06/2007, 11h11
  4. Trigger after insert, sans each row, possible ??
    Par veenie dans le forum Oracle
    Réponses: 5
    Dernier message: 16/02/2006, 15h18
  5. Réponses: 12
    Dernier message: 21/06/2004, 10h44

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