web-dev-qa-db-fra.com

@ManyToMany (mappedBy = "foo")

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.

35
NimChimpsky

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.

44
JB Nizet

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.

0
John Farrelly