需要org.hibernate.NonUniqueObjectException

时间:2019-05-24 13:31:02

标签: java sql database hibernate one-to-many

基本上,我需要一种方法来更新 休眠 中的映射对象。

为简洁起见,

我有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,我希望表会自动更新它(由于映射)。

你们有解决方案吗?

0 个答案:

没有答案