Bonjour, je suis en train de devenir fou car j'ai un problème incompréhensible avec des contraintes de clés étrangères, même problème que ce soit avec Mysql ou SQL Server. J'ai une table employe_metier qui contient un champ employe_id lié au champ id de la table employe, et un autre champ metier_id lié au champ id de la table metier. Voici les fichiers de mapping correspondants :
metier.hbm.xml :
Code:
<?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 16 ao?t 2012 11:30:52 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
<class name="com.menehould.interventions.bean.Metier" table="metier" schema="dbo" catalog="interventions">
<id name="id" type="int">
<column name="id" />
<generator class="assigned" />
</id>
<property name="libelle" type="string">
<column name="libelle" />
</property>
<set name="employes" inverse="false" 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>
employe.hbm.xml :
Code:
<?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 16 ao?t 2012 11:30:52 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
<class name="com.menehould.interventions.bean.Employe" table="employe" schema="dbo" catalog="interventions">
<id name="id" type="int">
<column name="id" />
<generator class="assigned" />
</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="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>
Lorsque je mets à jour l'intitulé d'un métier, par le biais d'un formulaire, hibernate exécute une requête pour supprimer l'enregistrement correspondant dans la table employe_metier :
Quote:
INFO: Hibernate:
select
metier_.id,
metier_.libelle as libelle2_
from
interventions.dbo.metier metier_
where
metier_.id=?
INFO: Hibernate:
update
interventions.dbo.metier
set
libelle=?
where
id=?
INFO: Hibernate:
delete
from
employe_metier
where
id_metier=?
INFO: Hibernate:
select
metier0_.id as id2_,
metier0_.libelle as libelle2_
from
interventions.dbo.metier metier0_
order by
metier0_.libelle
Voici la méthode correspondante : (struts 2)
Code:
public String saveOrUpdate()
{
try
{
Session session = HibernateUtil.getSession();
session.saveOrUpdate(metier);
Transaction tx = session.beginTransaction();
try
{
tx.commit();
}
catch(HibernateException e)
{
addActionError(e.getMessage());
tx.rollback();
}
}
catch(HibernateException e)
{
addActionError(e.getMessage());
}
catch(Exception e)
{
addActionError(e.getMessage());
}
if(hasFieldErrors())
{
return ERROR;
}
return SUCCESS;
}
Vraiment rien de compliqué, mais pourquoi la requête "delete" ? Je ne comprends pas d'où elle vient, pourquoi elle est générée et ça me rend vraiment dingue. J'ai tout essayé au niveau de la bdd : du "no action" et du "cascade" en update sur les clés étrangères, désactivation des contraintes etc... mais rien ne change. Merci par avance pour votre aide.