Я использую репозиторий Spring JPA для работы с некоторыми данными в базе данных.
public List<DHData> editDHData(int id, DHData dhData){
DHEntity e = dhRepository.findById(id).get();
int val = e.findDHData(dhData.getDec1(),dhData.getDec2());
if(val >= 0) {
e.getDHData().get(val).setEval(dhData.getEval());
System.out.println(val);
dhRepository.save(e);
}
return e.getDHData();
}
По сути, я получаю всю сущность, меняю то, что мне нужно изменить, а затем сохраняю используя JPA. По-видимому, когда я получаю очень быстрые запросы на одну и ту же сущность (мы используем Angular внешний интерфейс, который отправляет этот тип запроса один за другим без тайм-аута), кажется, что он не способен обрабатывать и перезаписывать полученную базу данных. сохранил только последний запрос.
Есть ли способ сделать каждый вызов согласованным, чтобы он выполнялся один за другим и не пропускался?
Пример
Мой DHEntity содержит (вместе с другой информацией) следующие данные, к которым я обращаюсь и изменяю с помощью метода editDHData.
{ "dec1": 1,
"dec2": 2,
"eval": 0},
{ "dec1": 1,
"dec2": 3,
"eval": 0},
{ "dec1": 2,
"dec2": 3,
"eval": 0}
Метод, который я опубликовал выше, выполняется три раза для изменения значений
Первый вызов:
{ "dec1": 1,
"dec2": 2,
"eval": 0.5}
Второй вызов:
{ "dec1": 1,
"dec2": 3,
"eval": 1}
Третий вызов:
{ "dec1": 2,
"dec2": 3,
"eval": 8}
После каждого звонка я сохраняю сущность. Сохраняется только последний вызов, поэтому вот что я получаю в итоге:
{ "dec1": 1,
"dec2": 2,
"eval": 0},
{ "dec1": 1,
"dec2": 3,
"eval": 0},
{ "dec1": 2,
"dec2": 3,
"eval": 8}
Видимо, методы вызываются 3 раза, но только последний сохраняется в базе данных. Есть ли что-то, что я могу сделать над сущностью / репозиторием, чтобы убедиться, что она работает и согласована? База данных PostgreSQL, а внешний интерфейс Angular (но я сомневаюсь, что это актуально). Когда я делаю звонки через Почтальон (конечно, на их выполнение уходит больше времени), он отлично работает.
Кроме того, я подумал, что, возможно, это потому, что метод не является "потокобезопасным". Если каждый вызов выполняется другим потоком, я думаю, что он сначала читает объект как неизмененный, а затем, когда сохраняет, перезаписывает. Мне нужно, чтобы все операции были последовательными и чтобы обеспечить постоянство базы данных (чего не происходит)