Modélisation et mapping d'un réseau en JPA
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:
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:
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:
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:
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