Bonjour, j'ai un problème avec l'update de tables relationnelles. j'ai le schéma suivant dans Mysql 5 :

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
CREATE TABLE IF NOT EXISTS `employe` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(20) DEFAULT NULL,
  `prenom` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
 
CREATE TABLE IF NOT EXISTS `employe_metier` (
  `id_employe` int(11) NOT NULL,
  `id_metier` int(11) NOT NULL,
  PRIMARY KEY (`id_employe`,`id_metier`),
  KEY `id_employe` (`id_employe`),
  KEY `id_metier` (`id_metier`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
CREATE TABLE IF NOT EXISTS `metier` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `libelle` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
 
ALTER TABLE `employe_metier`
  ADD CONSTRAINT `employe_metier_ibfk_1` FOREIGN KEY (`id_employe`) REFERENCES `employe` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
  ADD CONSTRAINT `employe_metier_ibfk_2` FOREIGN KEY (`id_metier`) REFERENCES `metier` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE;
Le code Hibernate généré par Netbeans 7.1 :

hibernate.reveng.xml

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
<hibernate-reverse-engineering>
  <schema-selection match-catalog="interventions"/>
  <table-filter match-name="employe_metier"/>
  <table-filter match-name="employe"/>
  <table-filter match-name="typetravaux"/>
  <table-filter match-name="intervention"/>
  <table-filter match-name="intervention_employe"/>
  <table-filter match-name="metier"/>
</hibernate-reverse-engineering>
employe.hbm.xml

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
<?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 26 juin 2012 13:58:33 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="com.menehould.interventions.bean.Employe" table="employe" catalog="interventions">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="nom" type="string">
            <column name="nom" length="20" />
        </property>
        <property name="prenom" type="string">
            <column name="prenom" length="20" />
        </property>
        <set name="interventions" inverse="false" table="intervention_employe">
            <key>
                <column name="id_employe" not-null="true" />
            </key>
            <many-to-many entity-name="com.menehould.interventions.bean.Intervention">
                <column name="id_intervention" not-null="true" />
            </many-to-many>
        </set>
        <set name="metiers" inverse="false" table="employe_metier">
            <key>
                <column name="id_employe" not-null="true" />
            </key>
            <many-to-many entity-name="com.menehould.interventions.bean.Metier">
                <column name="id_metier" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>
metier.hbm.xml

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 26 juin 2012 13:58:33 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="com.menehould.interventions.bean.Metier" table="metier" catalog="interventions">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="libelle" type="string">
            <column name="libelle" />
        </property>
        <set name="interventions" inverse="true">
            <key>
                <column name="metier" not-null="true" />
            </key>
            <one-to-many class="com.menehould.interventions.bean.Intervention" />
        </set>
        <set name="employes" inverse="false" cascade="save-update" table="employe_metier">
            <key>
                <column name="id_metier" not-null="true" />
            </key>
            <many-to-many entity-name="com.menehould.interventions.bean.Employe">
                <column name="id_employe" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>
J'explique le problème : quand je mets à jour l'intitulé d'un métier, il disparaît de la relation employé / métier : l'enregistrement disparaît de la table employe_metier. J'ai vérifié après la mise à jour de l'intitulé du métier, il garde pourtant le même id. Pourquoi l'enregistrement disparaît de la table relationnelle ? Je n'arrive pas à comprendre, un problème dans mon mapping ?