При обновлении поля JPA сущности оно не обновляется, а в нем оказывается старое значение
У меня очень странное поведение программы.
Предметная область стоит из комбо в ресторане, товаров и блюд. Данные комбо надо отобразить на фронте. В сущности комбо хранится массив товаров (goods) и блюд (products). У каждого товара или блюда есть поле count, в котором указано, в каком количестве товар или блюдо добавлено в комбо. Кроме того, в самой сущности комбо есть поле counts со счетчиками: эти счетчики указывают, в каком количестве товар или блюдо добавлены в комбо и содержит такие поля как id (идентификатор блюда или товара) и count (количество этого блюда или товара).
У меня проблема с заполнением поля products.count и goods.count, эти данные надо отдавать на фронт. Дело в том, что товары и блюда вместе с полем count хранятся в базе и получается так, что для одного товара (который может быть включен в разные комбо) указан счетчик, какой он был в последнем созданном комбо, а предыдущие значения счетчика затираются. А надо отдавать на фронт актуальное значение этого счетчика.
Для этого я написал такой код:
for (Combo combo : comboService.findByCli(us.getClientLegalInformation().getId())) {
if (combo.getId() == 10145)
{
System.out.println("break");
}
var counts = combo.getCounts().stream().collect(toMap(Count::getId, Count::getCount, (a, b) -> a));
combo.getProducts().forEach(it -> {
if (counts.containsKey(it.getId()))
{
it.setCount(Long.valueOf(counts.get(it.getId())));
}
});
combo.getGoods().forEach(it -> {
if (counts.containsKey(it.getId()))
{
it.setCount(Long.valueOf(counts.get(it.getId())));
}
});
list.add(combo);
}
Я извлекаю список комбо из сервиса (из JPA репозитория) и прохожу по ним в цикле. Для каждого комбо я создаю мапу, которая идентификатору товара или блюда ставит в соответствие его количество в этом комбо. Далее прохожу по спискам товаров и блюд и у каждого товара или блюда заполняю поле count из этой мапы.
Перед добавлением обновленного комбо в список list значения счетчиков правильные. Но перед возвращением списка list из апи на фронт оказывается, что у товаров и блюд оказался старый счетчик! Как будто я его не менял! Хотя я сделал это.
Почему программа так себя ведет? Может быть дело в том, что на фронт мы отправляем @Entity, а не DTO, а энтити управляется хибернейтом и находится в кэше. Может это хибернейт не дает обновить товарам и блюдам поле count?
Подскажите, пожалуйста, это какая-то мистика.
Дополнение. Значение в предыдущем элементе списка почему-то заменяется при обработке товаров текущего элемента списка
combo.getGoods().forEach(it -> {
if (counts.containsKey(it.getId()))
{
it.setCount(Long.valueOf(counts.get(it.getId())));
}
});