Hibernate Envers аудита, даже если нет никаких изменений - PullRequest
1 голос
/ 01 апреля 2020

Мы используем 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") и проверять только фактически измененные объекты?

...