2017-03-14 3 views
0

Je suis nouveau à JPA et je me demandais si JPA contient une solution à mon problème. Els je vais juste besoin de créer une relation ManyToMany.JPA Beaucoup à deux relation

Mon application contient des routes et des caméras. Une route commence et se termine avec une caméra. J'ai créé ceci en créant une propriété cameraPointA et cameraPointB dans la classe RoadSegment. Cela a créé une relation de plusieurs à deux. J'ai pensé que je pourrais définir cela comme deux à plusieurs relations, mais cela ne semble pas possible.

CameraPoint.java

@Entity 
public class CameraPoint implements Serializable { 

    @Id @GeneratedValue 
    private long id; 

    @OneToMany (mappedBy = "cameraPointA or cameraPointA") //<== The Problem 
    private List<RoadSegment> roads; 

    //... 
} 

RoadSegment.java

@Entity 
public class RoadSegment implements Serializable { 

    @Id @GeneratedValue 
    private long id; 

    @ManyToOne(cascade = CascadeType.ALL) 
    private Region region; 

    @ManyToOne(optional=false) 
    private CameraPoint cameraPointA; 
    @ManyToOne(optional=false) 
    private CameraPoint cameraPointB; 

    //... 
} 
+4

Que diriez-vous de deux champs, 'one mappedBy =" cameraPointA "', un 'mappedBy =" cameraPointB "', plus un getter qui combine ces deux champs? EDIT: Comme [ici] (http://stackoverflow.com/a/2181003/3890673) – crusy

Répondre

1

Je ne sais pas si cela va fonctionner, mais vous pouvez peut-être essayer d'ajouter à CameraPoint une autre liste de RoadSegments, qui indiquent la caméra a une liste de routes où la caméra est le début et l'autre liste indique que la caméra est la dernière.

@Entity 
public class CameraPoint implements Serializable { 

@Id @GeneratedValue 
private long id; 

@OneToMany (mappedBy = "cameraPointA") 
private List<RoadSegment> roadsA; 

@OneToMany (mappedBy = "cameraPointB") 
private List<RoadSegment> roadsB; 

//... 
} 

Est-il vraiment nécessaire d'utiliser une relation bidirectionnelle? Peut-être que ce n'est pas le cas et que votre modèle serait plus facile.

Par exemple, si vous atteignez toujours à la CameraPoint d'un RoadSegment vous n'avez pas besoin de la relation @OneToMany sur CameraPoint.

La même chose s'applique pour le mode inverse, si vous obtenez toujours un RoadSegment d'un précédent CameraPoint, alors la relation @ManyToOne n'est pas nécessaire.