Bonjour à tous !

J'ai un souci en ce moment avec Hibernate. Pour une table en particulier il se plante en créant des clés étrangères erronnées.

Dans mon application j'ai notamment des "utilisateurs" et des "opportunités" (le sens n'a pas d'importante).

Comme il s'agit d'une relation many-to-many qui doit porter une information j'ai décidé de passer par un objet intermédiaire que j'ai appellé "OppUser" et qui contient un entier.

Cet objet "OppUser" porte une référence à l'opportunité et une référence à un utilisateur.

Voici son mapping :

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
<?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 package="fr.habipro.crm.models">
  <class name="OppUser">
    <id name="id">
        <generator class="native"></generator>
    </id>
 
 
    <property name="nbsocs" type="integer"></property>
 
    <many-to-one name="opp" column="id_opp"></many-to-one>
    <many-to-one name="u" column="id_user"></many-to-one>
 
  </class>
</hibernate-mapping>
Et voici les foreign keys qu'il génère :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
  ADD CONSTRAINT `FK187DB6FACF3199EB` FOREIGN KEY (`id_user`) REFERENCES `user` (`id`),
  ADD CONSTRAINT `FK187DB6FA2D0EC05D` FOREIGN KEY (`id_user`) REFERENCES `opportunite` (`id`),
  ADD CONSTRAINT `FK187DB6FA83651579` FOREIGN KEY (`id_opp`) REFERENCES `opportunite` (`id`);
Comme vous pouvez le constater, j'ai deux clé étrangères sur mon champ id_user. L'une est correcte et fait référence à la table utilisateur, l'autre est fausse et fait référence à la table opportunité.

Donc en gros c'est le bordel dès que je fait un enregistrement dans cette table parce que dès que j'insère une valeur dans "id_user" j'ai une violation de contrainte de clé étrangère.

Je vous met également ma classe OppUser au cas où :

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
public class OppUser {
	private long id;
	private Opportunite opp;
	private User u;
	private Integer nbsocs;
 
	public OppUser() {
		super();
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public Opportunite getOpp() {
		return opp;
	}
	public void setOpp(Opportunite opp) {
		this.opp = opp;
	}
	public User getU() {
		return u;
	}
	public void setU(User u) {
		this.u = u;
	}
	public Integer getNbsocs() {
		return nbsocs;
	}
	public void setNbsocs(Integer nbsocs) {
		this.nbsocs = nbsocs;
	}
}
Avez-vous déjà rencontré un problème similaire ?
En attendant je désactive l'update du schéma à chaque lancement mais comme je suis encore en phase de développement j'ajoute régulièrement de nouvelles tables et ça commence à devenir problématique.

Je vous remercie d'avance pour votre aide !