Выбор ответа Middle Hibernate: N+1, lazy, кеш обновлено

Кто владелец связи

Вопрос

В двунаправленной связи Order.items (@OneToMany(mappedBy = "order")) и Item.order (@ManyToOne) добавили позицию только в коллекцию: order.getItems().add(item), не выставив item.setOrder(order). Что сохранится в колонке item.order_id?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: null: внешний ключ пишет владелец связи, то есть Item.order. mappedBy означает «эта сторона только отражение».

Варианты ответа

  1. id заказа: Hibernate сам синхронизирует обе стороны связи
  2. null: внешний ключ пишет владелец связи, то есть Item.orderправильный ответ
  3. Будет исключение при коммите о несогласованных сторонах связи
  4. Hibernate создаст отдельную таблицу связи order_items

Разбор

mappedBy означает «эта сторона только отражение». Внешний ключ берётся из поля владельца, Item.order, а оно null. Hibernate стороны не синхронизирует и об ошибке не сообщает. Поэтому в сущности пишут вспомогательный метод addItem(item), который выставляет обе стороны. Таблица связи появилась бы при однонаправленном @OneToMany без mappedBy и @JoinColumn.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.