基本上,我需要一种方法来更新 休眠 中的映射对象。
为简洁起见,
我有class A
,其中有List<B>
作为@OneToMany
映射。
我有一个B类,它有一个对象A和@ManyToOne
映射。
映射正常,
现在,当我尝试使用条件更新A时,我传递了一个UpdateRequest对象,该对象具有与A
类似的字段,并且还具有一个List<B>
因此,这个新的List<B>
被直接添加到B的数据库表中,而不是替换先前的条目。
我明白为什么。
现在,一种方法是首先获取要更新的A
条目并在列表上循环,然后执行“软删除”并设置“ isDeleted = true” 所有B条目,然后从UpdateRequest保存新的List<B>
。
但这不是一个选择,因为database
的存储空间有限且至关重要,并且万一任何地方都有exception
且删除发生但更新没有发生,这将是不一致的。 / p>
因此,我编写了此函数
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;
}
})
)
);
这会导致异常,因为我要覆盖对象属性,如果我保持相同的ID,我希望表会自动更新它(由于映射)。
你们有解决方案吗?