В основном мне требуется способ обновления отображаемых объектов в Hibernate .
Чтобы быть кратким,
У меня есть class A
, которыйимеет List<B>
как отображение @OneToMany
.У меня есть класс B, у которого есть объект A и сопоставление @ManyToOne
.
Отображение работает нормально,
Теперь, когда я пытаюсь обновить A с помощью критерия, я передаю UpdateRequestобъект, который имеет поля, аналогичные A
, а также имеет List<B>
Следовательно, этот новый List<B>
добавляется непосредственно в таблицу базы данных B вместо замены предыдущих записей.
Я понимаю, почему.
Теперь, один из способов - сначала получить записи A
, которые я хочу обновить, перебрать по списку, выполнить "мягкое удаление" и установить "isDeleted =true " для всех записей B, а затем сохраните новый List<B>
из UpdateRequest.
Но это не вариант, так как хранилище database
ограничено и критично, и в случае, если exception
в любом месте, и удаление происходит, но обновление не происходит, оно будет несовместимым.
Следовательно, я написал эту функцию
public <T,U> List<T> updateHandler(List<T> stored, List<U> normal, BiFunction<T, U, T> handler) {
try {
List<T> storedList = new ArrayList<>();
int maxSize = Math.max(stored.size(), normal.size());
for (int i = 0; i < maxSize; i++)
storedList.add(handler.apply(
i <= stored.size() - 1
? stored.get(i)
: null
,
i <= normal.size() - 1
? normal.get(i)
: null
));
return storedList;
}
catch(Exception e){
// something
}
}
, которая должна была использоваться следующим образом:
obj.setParameters(
updateHandler(
obj.getParameters(),
someOtherobj.getParameters(),
((storedParameter, parameter) -> {
if(storedParameter == null)
return StoredParameter.builder()
.mappingClass(mapClassObj)
.attribute(parameter.getAttribute())
.build();
else if(parameter == null)
{
storedParameter.setDeleted(true);
return storedParameter;
}
else
{
storedParameter.setAttribute(parameter.getAttribute());
return storedParameter;
}
})
)
);
Что приводит к исключению, так какЯ перезаписываю атрибуты объекта. Я ожидал, что таблица обновит его сама (из-за сопоставления), если я сохраню тот же идентификатор.
У вас, ребята, есть решения?