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 :

Cascade et Relation Unidirectionnelle


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Cascade et Relation Unidirectionnelle
    Bonjour à tous,

    Ma question est assez simple, est-ce qu'on peut utiliser la fonctionnalité "cascade" avec une relation unidirectionnelle?

    A vrai dire je l'ai testé et ça ne semblait pas marcher : j'ai une entité Entreprise qui possède plusieurs Adresse.

    Entreprise(id_entreprise, nom,...)
    Adressse(id_adresse, numero, ville,..., fk_entreprise)

    en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    entreprise.addAdresse(adresse) 
    session.save(entreprise)
    en activant le "show sql" je vois les requetes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Hibernate: insert into projet_template.Entreprise (raisonSociale, enseigne, id_entreprise) values (?, ?, ?)
    Hibernate: insert into projet_template.Adresse(numero,rue,ville, id_adresse) values (?, ?, ?, ?, ?, ?, ?)
    on voit nettement qu'il ne rajoute pas le fk_entreprise dans la liste des champs à insérer pour Adresse, du coup je reçois une exception de vioaltion de contrainte, ce qui est logique vu que j'ai mis une contrainte de not nullité sur la colonne fk_entreprise.

    en utilisant une relation bidirectionnelle je n'ai pas ce problème là!

    Est-ce que quelqu'un sait comment résoudre ce problème?

    Merci beaucoup.

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    bonjour,

    non le cascade sur une association unidirectionnelle fonctionne et heureusement.

    quel est ton code et ton mapping ?

  3. #3
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Peut on en effet voir le mapping, et notamment les associations entre les deux entités. On peut, par ailleurs voir qu'il gère la cascade dans la mesure où tu n'as sauvegarder QUE l'entreprise et qu'il insère l'entreprise ET l'adresse ... il doit peut être y avoir quelque chose d'autre...

    As tu vérifié ces propos en base ?!?
    See you, space cowboy... and if you're satisfied, click on

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Effectivement, il prend bien en compte la cascade mais il doit manquer quelque chose qui m'echappe voici les mappings :

    Entité Entreprise :
    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="Entreprise">
    	<id name="id" column="id_entreprise" type="integer">
    		<generator class="increment"></generator>
    	</id>
     
    	<property name="raisonSociale" type="string" length="30"></property>
    	<property name="enseigne" type="string" length="30"></property>
            <set name="adresses" table="adresse" cascade="all">
    	        <key column="fk_entreprise"/>
        	    <one-to-many class="Adresse"/>
        	</set>	
    </class>

    Entité Adresse :
    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="Adresse">
    	<id name="id" type="integer" column="id_adresse">
    		<generator class="increment"></generator>
    	</id>
     
    	<property name="numero" type="string" length="5"></property>
    	<property name="rue" type="string" length="50"></property>
    	<property name="ville" type="string" length="30"></property>
    	<property name="codePostal" type="string" length="10"></property>
    	<property name="pays" type="string" length="30"></property>
    	<property name="principal" type="boolean"></property>
    </class>

  5. #5
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Dans la mesure où tu n'utilises pas de table de jointures ... est-ce possible plutôt de faire ton set ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="adresses" cascade="all">
         <key column="fk_entreprise" />
         <one-to-many class="Adresse" />
    </set>
    Par contre, ca ne te coutera rien sinon un attribut Entreprise à l'objet Adresse mais passe en association Bidirectionnelle, Hibernate le conseille d'une part (cf. bests practises de la documentation) et cela te facilitera les choses pour d'éventuelles requetes pour plus tard
    See you, space cowboy... and if you're satisfied, click on

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    le fait de ne pas indiquer la table adresse ne change rien.
    J'avais lu les bonnes pratiques Hibernate (à vrai dire je fais une méthodologie dessus, donc j'ai bien été obligé de le faire ), mais je me suis rendu compte que je n'avais pas toujours besoin de bidirectionnalité...je continue mon investigation et je vous tiens au courant...

    a+

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    J'ai peut être oublié de préciser que je suis en version 3.1 d'Hibernate.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Après avoir décrypté les requêtes exécutées par Hibernate, j'ai pu constaté que dans le cas d'une relation :

    Unidirectionnelle :
    • il insére le père (dans mon exemple l'entité entreprise),
    • puis le fils (c'est-à-dire l'entité Adresse) sans la clé étrangère,
    • et qu'il faisait une mise à jour sur la clé étrangère (qui était à NULL auparavant) du fils.


    Ayant mis une contrainte d'intégrité sur ma clé étrangère, ma base renvoie une exception au moment de la tentative d’insertion du fils !

    Bidirectionnelle :
    • il insère le père (Entreprise),
    • puis le fils (Adresse) mais cette fois-ci avec la clé étrangère.


    Au total il ne fait que deux requêtes à la place des trois pour l'unidirectionnelle. A moins que je me sois trompé

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/04/2012, 14h51
  2. [EJB3] Problème de cascade en relation Manytomany
    Par mommsse dans le forum Java EE
    Réponses: 3
    Dernier message: 22/12/2010, 07h57
  3. Réponses: 2
    Dernier message: 18/02/2010, 13h57
  4. Relation unidirectionnel - ManyToOne
    Par jsebfranck dans le forum JPA
    Réponses: 9
    Dernier message: 25/06/2009, 10h22
  5. table liée et relations avec MAJ en cascade
    Par LE VIEUX dans le forum Access
    Réponses: 1
    Dernier message: 11/09/2006, 22h21

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