Подтвердить что ты не робот

@ManyToMany(mappedBy = "foo" )

Foo имеет:

@ManyToMany(mappedBy = "foos")
private Set<Bar> bars

и Bar имеет:

@ManyToMany
private Set<Foo> foos

Чем отличается расположение атрибута mappedBy с двунаправленным отношением, отличным от того, называется ли таблица foo_bar или bar_foo; и без атрибута mappedBy я получаю две таблицы соединений, как foo_bar, так и bar_foo.

4b9b3361

Ответ 1

В документации говорится:

Если ассоциация двунаправленная, одна сторона должна быть владельцем, а одна сторона должна быть обратным концом (т.е. она будет игнорироваться при обновлении значений отношений в таблице ассоциаций):

Итак, сторона, которая имеет атрибут mappedBy, является обратной стороной. Сторона, у которой нет атрибута mappedBy, является владельцем.

Сторона владельца - это сторона, с которой Hibernate смотрит, какая ассоциация существует. Так, например, если вы добавите Foo в набор foos бара, новая строка будет вставлена ​​Hibernate в таблицу соединений. Если, наоборот, вы добавите Bar в набор баров Foo, в базе данных ничего не будет изменено.

Ответ 2

mappedBy сообщает Hibernate, какая сторона отношения "владеет" ссылкой. В OneToMany или OneToOne использование mappyedBy сообщает Hibernate, что в другой таблице будет внешний ключ, который будет использоваться для хранения ссылки.

Когда дело доходит до ManyToMany, есть таблица соединений, поэтому ни одна из них не имеет ссылку на другой объект. Тем не менее, hibernate все еще должен знать, что является "владеющей" стороной, которая знает, как выполнять каскадные операции.