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 :
Et voici les foreign keys qu'il génère :
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>
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é.
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`);
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ù :
Avez-vous déjà rencontré un problème similaire ?
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; } }
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 !![]()
Partager