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 :

Delete dans une table de jointure


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Points : 48
    Points
    48
    Par défaut Delete dans une table de jointure
    Bonjour à tous ,


    J'ai un petit problème avec mon fichier de mapping. La situation est la suivante :

    Je possède 3 tables : Expense , PartialNote , NoteExpense.

    NoteExpense possède une collection d'Expense , pour cela , la table de jointure PartialNote rentre en jeu

    Lorsque j'ajoute des expenses à une note , et que je sauvegarde cette note , pas de problèmes , tout s'insère bien dans la base de données. Mais quand je supprime une note , il me delete bien dans la table Expense toutes les expenses de la note par contre , la table PartialNote contient toujours les références vers NoteExpense et Expense.

    Je vous donne les fichiers de mapping d'expense et noteExpense :

    Expense :

    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
    35
    36
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
      <class name="model.classes.Expense" table="EXPENSE" catalog="GestionConge">
      	<id name="idExpense" type="short">
                <column name="IDExpense"/>
                <generator class="increment" />
        </id>
            <property name="nature" type="string">
                <column name="Nature" not-null="true" />
            </property>
            <property name="date" type="date">
                <column name="Date" not-null="true" />
            </property>
                <property name="amount" type="short">
                <column name="Amount" not-null="true" />
            </property>
            <join table="OCCUPATIONEXPENSE" 
            inverse="true" 
            optional="true">
            <key column="idExpense" on-delete="cascade" />
            <many-to-one name="occupation" 
                column="refOccupation" 
                not-null="true" class="model.classes.occupation.Occupation" />
            </join>
            <join table="PARTIALNOTE" 
            optional="true" inverse="true">
            <key column="idExpense"/>
            <many-to-one name="note" 
                column="idNote" 
                not-null="true" class="model.classes.NoteExpenses" />
            </join>
      </class>
    </hibernate-mapping>

    NoteExpense :

    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 22 f?vr. 2008 08:51:49 by Hibernate Tools 3.2.0.CR1 -->
    <hibernate-mapping>
        <class name="model.classes.NoteExpenses" table="NOTEEXPENSES" catalog="GestionConge">
            <id name="idNote" type="short">
                <column name="IDNote" precision="4" scale="0" />
                <generator class="increment" />
            </id>
            <set name="expenses" table="PARTIALNOTE" cascade="all-delete-orphan" >
            	<key column="idNote"  />
           	 	<many-to-many column="idExpense" 
                	class="model.classes.Expense"/>
        	</set>
            <property name="validInf" type="boolean">
                <column name="ValidInf" not-null="true" />
            </property>
            <property name="validSup" type="boolean">
                <column name="ValidSup" not-null="true" />
            </property>
             <property name="title" type="string">
                <column name="Title" not-null="true" />
            </property>
               <property name="idUser" type="short">
                <column name="IDUser" not-null="true" />
                </property>
        </class>
    </hibernate-mapping>

    Si quelqu'un à une idée sur l'origine du problème ^^

  2. #2
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Perso je ne vois pas le problème tout semble correct dans tes mappings. As-tu mis à true hibernate.show_sql afin d'examiner les ordres SQL?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    Oui d'ailleurs c'est bien pratique cette option. En gros je fais un petit test JUnit qui me crée une note qui contient une expense, puis j'essaye de la delete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Save note
    Hibernate: select max(IDNote) from NOTEEXPENSES
    Hibernate: insert into GestionConge.NOTEEXPENSES (ValidInf, ValidSup, Title, IDUser, IDNote) values (?, ?, ?, ?, ?)
    Hibernate: insert into PARTIALNOTE (idNote, idExpense) values (?, ?)
    Hibernate: select this_.IDNote as IDNote8_0_, this_.ValidInf as ValidInf8_0_, this_.ValidSup as ValidSup8_0_, this_.Title as Title8_0_, this_.IDUser as IDUser8_0_ from GestionConge.NOTEEXPENSES this_ where this_.ValidInf like ? and this_.ValidSup like ?
    Hibernate: select expense0_.IDExpense as IDExpense6_0_, expense0_.Nature as Nature6_0_, expense0_.Date as Date6_0_, expense0_.Amount as Amount6_0_, expense0_1_.refOccupation as refOccup2_3_0_, expense0_2_.idNote as idNote7_0_ from GestionConge.EXPENSE expense0_ left outer join OCCUPATIONEXPENSE expense0_1_ on expense0_.IDExpense=expense0_1_.idExpense left outer join PARTIALNOTE expense0_2_ on expense0_.IDExpense=expense0_2_.idExpense where expense0_.IDExpense=?
    Hibernate: select noteexpens0_.IDNote as IDNote8_1_, noteexpens0_.ValidInf as ValidInf8_1_, noteexpens0_.ValidSup as ValidSup8_1_, noteexpens0_.Title as Title8_1_, noteexpens0_.IDUser as IDUser8_1_, expenses1_.idNote as idNote3_, expense2_.IDExpense as idExpense3_, expense2_.IDExpense as IDExpense6_0_, expense2_.Nature as Nature6_0_, expense2_.Date as Date6_0_, expense2_.Amount as Amount6_0_, expense2_1_.refOccupation as refOccup2_3_0_, expense2_2_.idNote as idNote7_0_ from GestionConge.NOTEEXPENSES noteexpens0_ left outer join PARTIALNOTE expenses1_ on noteexpens0_.IDNote=expenses1_.idNote left outer join GestionConge.EXPENSE expense2_ on expenses1_.idExpense=expense2_.IDExpense left outer join OCCUPATIONEXPENSE expense2_1_ on expense2_.IDExpense=expense2_1_.idExpense left outer join PARTIALNOTE expense2_2_ on expense2_.IDExpense=expense2_2_.idExpense where noteexpens0_.IDNote=?
    Hibernate: delete from GestionConge.EXPENSE where IDExpense=?
    Hibernate: delete from GestionConge.NOTEEXPENSES where IDNote=?

    Et aucune trace d'un delete from PartialNote :'(

  4. #4
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    T'arrives juste m'expliquer ton choix pour l'élément <join>?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    Etant donné qu'une NoteExpense peut contenir un à plusieurs Expense , ça me semble être la meilleure solution pour modéliser tout ça au niveau base de données non?

  6. #6
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Du côté NoteExpense je suis d'accord avec toi, c'est plus sur Expense que je me pose des questions. Pourquoi le:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <join table="PARTIALNOTE" 
            optional="true" inverse="true">
            <key column="idExpense"/>
            <many-to-one name="note" 
                column="idNote" 
                not-null="true" class="model.classes.NoteExpenses" />
            </join>

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    Si je veux utiliser une table de jointure , je dois bien aussi indiquer à Expense où est cette table non? ou alors je ne comprend pas un truc.

    D'après la documentation d'hibernate , il faut bien faire comme ça :

    http://www.hibernate.org/hib_docs/v3...rectional-join


    EDIT : Par un heureux hasard , j'ai résolu le problème. J'ai enlevé le "inverse="true"" du côté de Expense. Du coup, aucun côté n'a de inverse. Or j'ai lu dans la documentation qu'il fallait un des deux côté marqué inverse pour que tout puisse fonctionner (histoire qu'hibernate sache bien faire les liens). Donc là je me pose la question suivante : à quoi sert réellement le inverse? Et aussi pourquoi dans mon cas il n'en faut pas?

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 108
    Points : 65
    Points
    65
    Par défaut
    inverse="true" signifie que sur un persist ou un save le set n'est pas géré.

    Tu peux ajouter autant d'objet que tu veut à une collection qui est sur inverse="true", la liaison ne sera pas persistée.

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

Discussions similaires

  1. delete sur une table avec jointure
    Par Jarod51 dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/09/2011, 10h26
  2. Hibernate/JPA: ManyToMany, mise à jour dans une table de jointure.
    Par PhilippeGibault dans le forum Hibernate
    Réponses: 1
    Dernier message: 19/04/2011, 14h40
  3. Delete dans une table sans id
    Par mister3957 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/08/2010, 19h24
  4. delete dans une table contenant des primary key
    Par bracket dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/11/2008, 17h41
  5. PB Lock sur delete dans une table
    Par greatmaster1971 dans le forum DB2
    Réponses: 10
    Dernier message: 06/07/2008, 20h49

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