LINUX.ORG.RU

Отображение двух Map в одну таблицу

 , ,


0

1

Начал изучать JPA, и при реализации примерного проекта возникли сложности. Имеются сущности Product и Supplier. Необходимо для каждого продукта иметь цену и остаток по каждому поставщику. Задача состоит в отображении двух свойств сущности Product в одну физическую таблицу, которую назовем SUPPLIER_PRODUCT. Структура таблицы видится такой:

PRODUCT_ID | SUPPLIER_ID | PRICE | QUANTITY
с ходу попытался описать сущность соответствующих свойств продукта, сославшись на одну таблицу и столбец-ключ:
@ElementCollection
@CollectionTable(name = "SUPPLIER_PRODUCT")
@MapKeyColumn(name = "supplier_id")
@Column(name = "price")
private Map<Long, Long>	prices = new HashMap<Long, Long>();

@ElementCollection
@CollectionTable(name = "SUPPLIER_PRODUCT")
@MapKeyColumn(name = "supplier_id")
@Column(name = "quantity")
private Map<Long, Integer> qtys = new HashMap<Long, Integer>();
Ключ Long карт - это фактически @Id сущности Supplier (почему Long, а не сам Supplier, это тема для отдельного вопроса, но я надеюсь, что к моей проблеме отношения не имеет). И вот, при попытке заполнить эти поля и сохранить:
product.getPrices().put(supplier.getId(), product_price);
product.getQtys().put(supplier.getId(), product_qty);
products.save(product); // products - это Spring JpaRepository
бросается исключение:
Caused by: org.h2.jdbc.JdbcSQLException: Нарушение уникального индекса или первичного ключа: "PRIMARY_KEY_CE ON PUBLIC.SUPPLIER_PRODUCT(PRODUCT_ID, SUPPLIER_ID) VALUES (1830, 2, 3)"
Unique index or primary key violation: "PRIMARY_KEY_CE ON PUBLIC.SUPPLIER_PRODUCT(PRODUCT_ID, SUPPLIER_ID) VALUES (1830, 2, 3)"; SQL statement:
insert into supplier_product (product_id, supplier_id, quantity) values (?, ?, ?) [23505-193]
Насколько я понял, фреймворк делает insert при записи Quantities, хотя стоило бы делать update уже существующей строки.

Я понимаю, что можно обойтись одной картой, а два свойства вынести в отдельный Embedded класс, вероятно это решит проблему. Но не упускаю ли я способ, позволяющий избежать создания нового класса?

@ElementCollection

Эту штуку так и не удалось мне в свое время заставить работать нормально (особенно с SELECT'ами по ключу и значению map'a там танцы с бубнами будут).

Я б создал отдельный объект Stocks с полями product, price, quantity.

alchemist
()
Ответ на: комментарий от xmichael

Можно и так. главное уйти от @ElementCollection, там очень много подводных камней. Имхо, возможно я просто его неосилил)

alchemist
()
31 августа 2017 г.

JdbcSQLException

у меня была аналогичная ситуация - бросало JdbcSQLException но у меня было изза того что я в базу запихивал строку с уникальным ключом, который я сам же в эту строку и прописывал

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.