Мы используем hibernate envers для аудита изменений в сущностях.
У нас есть следующие две сущности
UserRole
public class UserRole {
private String id;
@Audited
@Column(name = "name")
private String name;
@EqualsAndHashCode.Exclude
@ToString.Exclude
@ManyToMany(mappedBy = "userRoles", cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@Audited
private Set<UserGroup> userGroups;
}
UserGroup
public class UserGroup {
private String id;
@Audited
@Column(name = "name")
private String name;
@EqualsAndHashCode.Exclude
@ToString.Exclude
@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(
name = "role_user_group_mapping",
joinColumns = {@JoinColumn(name = "user_group_id")},
inverseJoinColumns = {@JoinColumn(name = "user_role_id")}
)
@Audited
private Set<UserRole> userRoles;
}
Ниже приведен сценарий:
если мы попытаемся присвоить роль какой-либо из существующих групп пользователей, envers запишет все другие роли, которые уже назначены группе пользователей, как измененные, даже если их не было изменения в этих ролях.
например. Предположим, у нас есть группа пользователей «Группа пользователей-администраторов»
, и ей уже назначены «Роль1» и «Роль2».
Теперь, если я попытаюсь присвоить этой группе новую роль «Роль3», я получу дополнительную аудит существующих ролей «Role1» и «Role2» с изменениями, но в этих ролях не было никаких изменений.
Аудит должен проводиться только для группы пользователей «Группа пользователей-администраторов», поскольку ей была назначена новая роль, и для «Роли3», поскольку этой роли была назначена новая группа пользователей.
Как избежать проверки уже существующих ролей ("Role1", "Role2") и проверять только фактически измененные объекты?