Foo a:
@ManyToMany(mappedBy = "foos")
private Set<Bar> bars
et Bar a:
@ManyToMany
private Set<Foo> foos
Quelle différence la localisation de l'attribut mappedBy fait-elle pour une relation bidirectionnelle, si ce n'est que la table s'appelle foo_bar ou bar_foo; et sans l'attribut mappedBy, j'obtiens deux tables de jointure, à la fois foo_bar et bar_foo.
La documentation dit:
Si l'association est bidirectionnelle, un côté doit être le propriétaire et un côté doit être l'extrémité inverse (c'est-à-dire qu'il sera ignoré lors de la mise à jour des valeurs de relation dans la table d'association):
Ainsi, le côté qui a l'attribut mappedBy
est le côté inverse. Le côté qui n'a pas l'attribut mappedBy
est le propriétaire.
Le côté propriétaire est le côté qu'Hibernate regarde pour savoir quelle association existe. Ainsi, par exemple, si vous ajoutez un Foo dans l'ensemble des foos d'une barre, une nouvelle ligne sera insérée par Hibernate dans la table de jointure. Si, au contraire, vous ajoutez une Barre à l'ensemble des barres d'un Foo, rien ne sera modifié dans la base de données.
mappedBy
indique à Hibernate de quel côté de la relation "possède" le lien. Dans OneToMany
ou OneToOne
, l'utilisation de mappyedBy
indique à Hibernate qu'il y aura une clé étrangère dans l'autre table qui sera utilisée pour stocker le lien.
Quand il s'agit de ManyToMany
, il y a une table de jointure, donc aucune n'a directement le lien vers l'autre objet. Cependant, hibernate doit toujours savoir quel est le côté "propriétaire" qui sait comment mettre en cascade les opérations.