Требовать решения для org.hibernate.NonUniqueObjectException - PullRequest
0 голосов
/ 24 мая 2019

В основном мне требуется способ обновления отображаемых объектов в 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;
                 }
              })
             )
         );

Что приводит к исключению, так какЯ перезаписываю атрибуты объекта. Я ожидал, что таблица обновит его сама (из-за сопоставления), если я сохраню тот же идентификатор.

У вас, ребята, есть решения?

...