Hibernate: как спроектировать связь между клиентами и их заказами

Создайте Customer и OrderEntity с отношением one-to-many/many-to-one. Заказы клиента загружайте LAZY, а для сценария «клиент с заказами» используйте отдельный fetch join или entity graph.

Короткий ответ

Что ответить на собеседовании

Создайте Customer и OrderEntity с отношением one-to-many/many-to-one. Заказы клиента загружайте LAZY, а для сценария «клиент с заказами» используйте отдельный fetch join или entity graph.

Подробный разбор

Ответ с пояснениями

Условие

Имеются две таблицы — customer (клиенты) и order (заказы). В большинстве случаев (около 80%) требуется получить только данные о клиентах, а в оставшихся 20% — одновременно клиентские данные и связанные с ними заказы. Необходимо реализовать эту схему в Hibernate, определив какие сущности создать, какие аннотации применить и какой тип загрузки (eager/lazy) использовать.

Ответ

Создайте Customer и OrderEntity с отношением one-to-many/many-to-one. Заказы клиента загружайте LAZY, а для сценария «клиент с заказами» используйте отдельный fetch join или entity graph.

У Customer: @OneToMany(mappedBy="customer", fetch=LAZY). У OrderEntity: @ManyToOne(fetch=LAZY) и @JoinColumn(name="customer_id"). Обе сущности имеют @Entity и @Id. Для чтения вместе подходит JPQL: select distinct c from Customer c left join fetch c.orders where c.id = :id. Данные преобразуют в DTO внутри транзакции. Имя SQL-таблицы order требует экранирования либо переименования; каскадное удаление нельзя включать без бизнес-требования.

Источник: jakarta.ee.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее