Bonjour,
Je suis en train de modéliser un réseau en utilisant JPA. Mon réseau est non circulaire, il est constitué d'un ensemble d'entités (MonEntite -> table_mes_entites) reliés entre eux avec une relation de type ManyToMany sur la même entité (donc une table de jointure avec deux colonnes source_id et destination_id, les deux constituent la clé primaire de la table de jointure et il n'y a pas de colonnes supplémentaire dans cette table).
Exemple :
J'ai effectué le mapping de deux manières mais les deux ne marchent pas, et mes entités ne sont par reliées en base. Voila un extrait du code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Entité1 -> Entité2 -> Entité3 -> Entité5 -> Entité6 -> Entité4 -> Entité3 -> Entité7
Méthode 1:
Méthode 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @Entity public class Entite { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; @JoinTable(name = "relations_entites", joinColumns = {@JoinColumn(name = "source_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "destination_id", referencedColumnName = "id")}) @ManyToMany private List<Entite> prochainesEntites; }
Cette méthode que j'ai trouvé sur le net, consiste à créer une classe intermédiaire et transformer la relation ManyToMany à ManyToOne puis OneToeMany
Ci-dessous une vue sur ma base :
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 @Entity public class Entite implements Serializable { id .... @OneToMany(mappedBy="entiteSource") private List<RelationEntite> relationsEntite; } @Entity public class RelationEntite implements Serializable { @EmbeddedId private RelationEntiteId id; @ManyToOne @JoinColumn(name="source_id", insertable=false, updatable=false) private Entite entiteSource; @ManyToOne @JoinColumn(name="destination_id", insertable=false, updatable=false) private Entite entiteDestination; @Embeddable public static class RelationEntiteId implements Serializable { @Column(name="source_id", nullable=false, updatable=false) private Integer sourceId; @Column(name="destination_id", nullable=false, updatable=false) private Integer destinationId; @Override public boolean equals(Object o) { if(o == null) { return false; } if(!(o instanceof RelationEntiteId)) { return false; } RelationEntiteId other = (RelationEntiteId) o; if(!(other.sourceId.equals(sourceId))) { return false; } if(!(other.destinationId.equals(destinationId))) { return false; } return true; } }
Avez vous une idée d'où peut venir mon problème ? Quelle méthode (corrigé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Table mes_entites: ------------------------ | id | nom | description | ------------------------ Table de jointure relations_entites (les deux clés étrangères pointent sur la même table mes_entites) ---------------------------- | source_id | destination_id | ----------------------------) des deux préconisez vous ?
Merci d'avance
Partager