В моем приложении Spring Boot у меня есть класс сущностей, подобный следующему:
public class MyEntity {
String id;
Map<String,String> paramsMap;
//Many members omitted
}
И соответствующий фрагмент JPA ORM XML:
<entity class="MyEntity" access="FIELD">
<table name="myentity">
<!--couple of unique-constraints-->
</table>
<attributes>
<element-collection name="paramsMap" fetch="EAGER">
<collection-table name="my_entity_params">
<join-column name="id" />
</collection-table>
</element-collection>
</attributes>
</entity>
Это приблизительно соответствует ответу этот вопрос
У меня проблема в том, что сущности класса MyEntity
должны быть обновлены, включая содержимое params
-карты.Когда это происходит, БД Oracle возвращает исключение, указывающее, что ограничение уникального первичного ключа таблицы my_entity_params
было нарушено (PostgreSQL молча не может обновить некоторые параметры).
Пример аппроксимации::
public void updateParam(String id, String paramName, String paramValue){
MyEntity old=repository.findById(id)
old.getParamsMap().put(paramName, paramValue);
repository.save(old);
}
Где repository
реализует интерфейс PagingAndSortingRepository .
Если paramsMap
не был изменен до вызова save
, обновление выполнено успешно.Я попытался сначала установить paramsMap
, сохранив и затем сохранив фактическую карту, что привело к той же ошибке.
Использование one-to-many
не будет работать, потому что карта не указывает на комплекстип.В том же духе, в вики Eclipse Foundation Как отобразить коллекции значений Basic или Emeddable с помощью сопоставления ElementCollection не проливает свет на то, как использовать коллекцию элементов с картой.
Вставка элемента map-key-column
в element-collection
, похоже, решает проблему в Postgres, но проблема остается при подключении к базе данных Oracle.
Как получить Hibernate для корректного обновления содержимого карты?