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 :
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
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 :

Méthode 1:
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;
}
Méthode 2:
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
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;
        }
}
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
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 |
----------------------------
Avez vous une idée d'où peut venir mon problème ? Quelle méthode (corrigé ) des deux préconisez vous ?

Merci d'avance