即使 unique 为 false,Hibernate 也不允许不唯一的记录

Hibernate doesn't allow not unique records even when unique is false

我有一个包含用户及其密码的数据库。 当我启动我的应用程序时,我创建了一些具有角色的用户并将它们存储到数据库中。 我的用户实体:

@Entity
@Table(name = "USERS")
public class User {
    @Id
    @Column(name = "USERNAME",  nullable = false,  unique = true)
    private String username;

    @Column(name = "PASSWORD", nullable = false)
    private String password;

    @Column(name = "ENABLED", nullable = false)
    private boolean enabled = true;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)
    private Set<UserRole> userRole = new HashSet<>();
...getters and setters

和 userRole 实体

@Entity
@Table(name = "user_roles")
public class UserRole {


    @Id
    @Column(name = "ROLE")
    private String role;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "USERNAME")
    private User user;

默认情况下,列角色是 unique=false,但是当我添加具有角色的 userA:管理员、用户,然后添加具有角色的 userB:用户,记录 userB - 用户覆盖记录 userA - 用户。有人可以指出我的错误吗?

我正在使用休眠 5 + spring 5

如果您为 userB 保存角色,因为您在 UserRole 和 CascadeType.ALL 中映射了 User,保存后它会覆盖数据库中角色 user 的用户名。您真的需要映射到 UserRole 中的 User 吗?如果不需要,我认为您应该将其从 UserRole 实体中删除并仅保留角色名称。例如,可以将角色映射到用户 like

    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "username"))
    @Column(name = "role")
    @ElementCollection(fetch = FetchType.EAGER)
    private Set<Role> roles;

根据定义,ID 是唯一的。这就是唯一标识一个实体的东西。