У меня есть 2 объекта: Role
и Privilege
.Одна роль имеет много привилегий.Сущности выглядят так:
@Entity
public class Role {
private Integer id;
private String code;
@OneToMany(mappedBy = "role", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Privilege> privileges;
}
@Entity
public class Privilege {
private Integer id;
private String code;
@ManyToOne
@JoinColumn(name = "role_id")
private Role role;
}
Таблица privilege
имеет уникальное ограничение U__ROLE_ID__CODE__PRIVILEGE
для столбцов role_id
и code
.
У меня есть конечная точка REST, котораяобновляет роли.Обновление также включает изменение привилегий, назначенных роли:
private static void setPrivileges(Set<Privilege> existing, Set<Privilege> privileges) {
existing.clear();
existing.addAll(privileges);
}
По какой-то причине, когда я выполняю обновление роли, Hibernate first вставляет новые привилегии в таблицу привилегий , итолько тогда удаляет потерянные права .В результате происходит сбой обновления с нарушением ограничения U__ROLE_ID__CODE__PRIVILEGE
в случае, если новый список привилегий содержит хотя бы одну привилегию из старого списка.
Без ограничения все работает нормально.Однако удаление ограничения не выглядит идеальным решением.
Можно ли изменить порядок, в котором Hibernate обрабатывает обновление отношения ролей-привилегий, так что сначала удаляются потерянные привилегии, и только затем новыевставлен?
Проект репродукции доступен здесь .