Как обновить сущность с помощью коллекции элементов типа Map? - PullRequest
0 голосов
/ 13 декабря 2018

В моем приложении 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 для корректного обновления содержимого карты?

1 Ответ

0 голосов
/ 14 декабря 2018

Похоже, у меня было две проблемы с похожими симптомами.

Во-первых, мне не хватало элемента map-key-column из-под element-collection, поэтому Spring не смог правильно построить запрос на обновление.Это было исправлено путем изменения элемента следующим образом:

<element-collection name="paramsMap" fetch="EAGER">
  <map-key-column name="my_entity_params_key"/>
  <collection-table name="my_entity_params">
    <join-column name="id" />
  </collection-table>
</element-collection>

Вторая проблема заключается в том, что Oracle обрабатывает пустые строки как ноль , что приводило к дальнейшей путанице в системе и попытке вставить ключпары-значения, где пара ключ-ноль уже существовала.Это было исправлено удалением пустых строковых значений с карты перед вставкой / обновлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...