Отображение таблицы order_details в Hibernate

Поскольку у связи есть собственное поле count, order_details лучше отобразить отдельной сущностью. При уникальной паре order_id/product_id используйте EmbeddedId и две связи с MapsId.

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

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

Поскольку у связи есть собственное поле count, order_details лучше отобразить отдельной сущностью. При уникальной паре order_id/product_id используйте EmbeddedId и две связи с MapsId.

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

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

Условие

В базе данных присутствует таблица order_details(order_id, product_id, count). Требуется реализовать её отображение в Hibernate, используя либо отдельную сущность, либо составной ключ.

Структура базы состоит из трёх таблиц:

User(id, name, sex, birthday)
Product(id, maker, model, type)
Order(user_id, product_id, date, count, code, price, total_sum

Ответ

Поскольку у связи есть собственное поле count, order_details лучше отобразить отдельной сущностью. При уникальной паре order_id/product_id используйте EmbeddedId и две связи с MapsId.

Схематичная разметка:

@Entity
@Table(name = "order_details")
class OrderDetail {
    @EmbeddedId
    private OrderDetailId id;
    @MapsId("orderId")
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    private Order order;
    @MapsId("productId")
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "product_id")
    private Product product;
    @Column(name = "count")
    private int count;
}

OrderDetailId — Embeddable с Long orderId/productId, корректными equals/hashCode, no-arg конструктором и Serializable для совместимости. Схема Order в условии неполная: нужен первичный ключ, на который ссылается order_id. Если один товар может иметь несколько отдельных позиций заказа, вместо пары требуется собственный ID позиции. Обычный ManyToMany потерял бы количество.

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

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

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

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

Подробнее