Использовать JSONB для хранения — это не самый лучший вариант. Поскольку не позволяет делать выборки тех же продуктов с помощью Hibernate. С другой стороны можно использовать Hibernate для мапинга коллекции продуктов в таблице, которая их использует. Для этого нужно
Использование @MapKeyColumn
Допустим, у нас есть сущность Order
, и мы хотим отслеживать название и количество всех товаров в заказе. Итак, мы хотим ввести Map<Long, Integer>
для Order
, который будет сопоставлять product_id
товара с его количеством:
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue
@Column(name = "id")
private Long id;
@ElementCollection
@CollectionTable(name = "order_product_mapping",
joinColumns = {@JoinColumn(name = "order_id", referencedColumnName = "id")})
@MapKeyColumn(name = "product_id")
@Column(name = "qty")
private Map<Long, Integer> productQtyMap;
// стандартные геттеры и сеттеры
}
Вам нужно указать Hibernate, где получить ключ и значение. Для ключа мы использовали @MapKeyColumn
, указывая, что ключ Map
— это столбец product_id
нашей таблицы соединений order_product_mapping
. Аналогично, @Column
указывает, что значение Map
соответствует столбцу qty
таблицы соединений.
Кроме того, объект productQtyMap
является мапой типа ключ-значение, поэтому мы должны использовать аннотацию @ElementCollection
.
Помимо базовых объектов ключа-значения, объекты @Embeddable
также могут использоваться в качестве значений Map
аналогичным образом.