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

时间:2019-03-26 06:30:53

标签: hibernate spring-orm

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

@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,但是当我添加具有角色admin的userA,然后添加具有角色user的userB时,记录userB-用户覆盖记录userA-用户。有人可以指出我的错误吗?

我正在使用休眠5 +春季5

2 个答案:

答案 0 :(得分:0)

如果您在UserRole和CascadeType.ALL中为User映射时保存了userB的角色,则在保存后将覆盖数据库中角色user的USERNAME。您是否真的需要在UserRole中映射到User?如果不需要,我认为您应该将其从UserRole实体中删除,并仅使用角色名称。例如,可以像这样在用户中映射角色

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

答案 1 :(得分:0)

根据定义,ID是唯一的。这就是唯一标识实体的内容。