Hibernate / JPA ManyToOne vs OneToMany

je suis en train de lire la documentation D'hibernation concernant le les associations d'entités et j'ai un peu de mal à comprendre certaines choses. Il y a à faire, en essence, avec la différence entre ManyToOne et OneToMany associations. Bien que je les ai utilisés dans des projets réels, Je ne peux pas appréhender complètement la différence entre eux. Pour ma compréhension, si une table / une entité a un ManyToOne association avec un autre, alors l'association devrait être de la autre côté OneToMany. Alors, comment devrions-nous décider lequel choisir en fonction du cas et de la façon dont elle affecte la base de données/requêtes/résultats? Est-il partout un bon exemple?

P. S.: je pense qu'il serait utile en raison de sa pertinence à la question, si quelqu'un pouvait en outre expliquer ce qui est le point du propriétaire de l'association et la différence entre l'association bidirectionnelle et unidirectionnelle.

29
demandé sur Ricardo 2013-04-20 14:58:15

2 réponses

supposez que vous avez un ordre et une ligne. Vous pouvez choisir d'avoir une OneToMany unidirectionnelle entre la commande et OrderLine (la commande aurait une collection de OrderLines). Ou vous pouvez choisir d'avoir une association ManyToOne entre OrderLine et L'ordre (OrderLine aurait une référence à son ordre). Ou vous pouvez choisir d'avoir les deux, auquel cas l'association devient une association bidirectionnelle OneToMany/ManyToOne.

La solution que vous choisissez dépend principalement de la situation, et sur le niveau de couplage entre les entités. Par exemple, si un utilisateur, une entreprise, un fournisseur ont tous plusieurs adresses, il serait logique d'avoir un unidirectionnel entre chacun d'eux et L'adresse, et avoir L'adresse ne sait pas au sujet de leur propriétaire.

supposons que vous avez un utilisateur et un Message, où un utilisateur peut avoir des milliers de messages, il pourrait être logique de le modéliser seulement comme un ManyToOne de Message à utilisateur, parce que vous demanderez rarement tous les messages d'un utilisateur de toute façon. Le l'association pourrait être bidirectionnelle seulement pour aider avec les requêtes cependant, puisque les requêtes JPQL se rejoignent entre les entités en naviguant à travers leurs associations.

Dans une association bidirectionnelle, vous pourriez être dans une situation où le graphe d'objets, c'est incohérent. Par exemple, L'ordre A aurait un ensemble vide de lignes de commande, mais certaines lignes de commande auraient une référence à L'ordre A. JPA impose d'avoir toujours un côté de l'association étant le côté propriétaire, et l'autre côté étant l'inverse de ce côté. L'inverse de la côté est ignoré par JPA. Le côté propriétaire est le côté qui décide quelle relation existe. Dans une association bidirectionnelle OneToMany, le côté propriétaire doit être le côté nombreux. Ainsi, dans l'exemple précédent, le côté propriétaire serait OrderLine, et JPA maintiendrait l'association entre les lignes et l'ordre A, puisque les lignes ont une référence à A.

une telle association serait mappée comme ceci:

dans l'Ordre :

@OneToMany(mappedBy = "parentOrder") // mappedBy indicates that this side is the 
   // inverse side, and that the mapping is defined by the attribute parentOrder 
   // at the other side of the association.
private Set<OrderLine> lines;

dans OrderLine:

@ManyToOne
private Order parentOrder;
49
répondu JB Nizet 2017-03-02 15:26:18

Aussi, pour avoir @ManytoOne côté comme le propriétaire ne requerrait que n+1 requêtes lors de la sauvegarde des associations. Où n est le nombre d'associations (plusieurs côtés).

Tandis qu'avoir @OneToMany en tant que propriétaire, tout en insérant l'entité mère (un côté) avec des associations (plusieurs côtés) résulterait en 2*n + 1 requêtes. Dans laquelle une requête serait pour insérer de l'association et une autre requête serait pour mettre à jour la clé étrangère dans l'entité associée.

2
répondu userJ 2017-03-29 13:56:28