2009-08-20 8 views
30

Dans ce document (faites défiler jusqu'à la section unidirectionnels):Hibernate unidirectionnel un à plusieurs association - pourquoi une table de jointure est-elle meilleure?

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-association-collections

il dit qu'un one-to-many unidirectionnelle avec une table de jointure est beaucoup préféré juste en utilisant une colonne de clé étrangère dans la entité détenue. Ma question est, pourquoi est-ce beaucoup préféré?

+0

voir http://stackoverflow.com/questions/2092611/why-is-it-recommended-to-avoid-unidirectional-one-to-many-association-on-a-forei –

Répondre

36

Considérons la situation dans laquelle le type d'entité possédée peut également appartenir à un autre type d'entité parent. Mettez-vous des références de clé étrangère dans la table possédée aux deux tables parentes? Que faire si vous avez trois types de parents? Cela ne s'adapte pas aux grands projets.

Une table de jointure découple la jointure, de sorte que la table possédée n'a aucune connaissance de la table parent (s), permettant à la conception d'évoluer élégamment.

+1

voir la différence des opérations SQL internes invoquées dans la table de jointure et la clé étrangère sur http://stackoverflow.com/q/18333198/418439 –

11

Si l'entité enfant n'a qu'un seul type parent, il n'y a pas besoin d'une table de jointure. Je l'ai fait avec JPA (avec une mise en veille prolongée). Avantages: Une table en moins. Peut-être une meilleure performance. Non "à quoi sert cette table?" tapez des questions. Inconvénient: De la perspective OO, il existe une dépendance supplémentaire entre l'enfant et le parent introduit. En pratique, ce n'est probablement pas un gros problème, car la relation est privée chez l'enfant.

 
e.g. 
parent: 
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) 
@MapKey(name = "name") 
private Map children; 

child: 
@ManyToOne(optional = false) 
private Parent parent; 
+0

pouvez-vous en dire plus sur le désavantage –

+0

Inconvénient raffiné. – Conor

+0

Notez simplement qu'avec JPA 2.0 la référence sur l'enfant au parent n'est plus nécessaire. Utilisez simplement l'annotation @JoinColumn sur le parent. –

Questions connexes