Jpa orphanRemoval = true сначала удалить?

У меня есть такие объекты, как показано ниже:

@Entity
@Table(uniqueConstraints = {
        @UniqueConstraint(columnNames = {“user_member_id", “address_id”})
})
Public class User(){

    private Long id;
    private String name;
    private String surname;

    @OneToMany(mappedBy = “user”, cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<UserMember> userMembers;

    @OneToMany(mappedBy = “user”, cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<Address> addresses;

    //… getters setters

    public void setRoles(List<UserMembers> userMembers) {
      this.userMembers.clear();

      List<UserMembers> userMembers = userMembers.stream()
                    .map(operatorRole -> new OperatorRoleMember(this, operatorRole))
                    .collect(Collectors.toList());
      this.roleMembers.addAll(roleMembers);
    }

}


@Entity
Public class UserMember(){

    private Long id;
    private name;

    @ManyToOne
    private User user;

    //getters and setters...

}

Когда я запускаю setRoles (List userMembers) в транзакции, он сначала пытается вставить новых членов списка, а затем удаляет старые данные.

Проблема в том, что моя таблица имеет уникальное ограничение, старые и новые данные конфликтуют друг с другом.

он будет работать нормально, если сначала попытается удалить старые, а затем вставить новые. Есть ли выход из этой ситуации?

перенести вашу базу данных.

K.Nicholas 08.10.2018 23:18

@ K.Nicholas почему?

sam 08.10.2018 23:21

Старые данные не будут работать с новой схемой = вам необходимо «перенести базу данных». Вам нужно сделать такие вещи, как сначала удалить несовместимые строки, прежде чем применять индекс или копировать в новую таблицу, или что-то еще, что сработает.

K.Nicholas 08.10.2018 23:26

@ K.Nicholas Нет старой схемы и таблицы, также все данные совместимы, я просто хочу попробовать массовое обновление. Удалите существующих userMembers для этого пользователя и добавьте новости. Но удаление сирот привело к тому, что сначала добавлялись новые, а затем удалялись старые. Но он должен сначала запустить удаление, а затем добавить для меня новые.

sam 08.10.2018 23:52

Итак, что означает «удалить старые данные»? Какие старые данные? Нет старой схемы, тогда нет старых данных.

K.Nicholas 08.10.2018 23:56

Выложите пожалуйста актуальный код setRoles. В настоящее время он не компилируется, потому что userMembers объявлен как параметр и как локальная переменная. Также он копирует roleMembers на себя, что может быть ошибкой в ​​вашей публикации или реальной проблемой, с которой вы столкнулись.

Jens Schauder 09.10.2018 11:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
276
0

Другие вопросы по теме