我正在使用springboot和hibernate,

我的实体类如下所示:

@Entity
@Table(name="tbl_user")
public class User {

    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="user_Id")
    private long userId;

    @Column(name="userName")
    private String userName;

    @Column(name="passWord")
    private String passWord;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name="user_role")

 private Collection<Role> roleList;


我的第二个实体如下所示:

@Entity
@Table(name="tbl_role")
public class Role {

    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="role_Id")
    private long roleId;

    @Column(name="roleName")
    private String roleName;


当我插入角色为manager(pkid=1), admin(pkid=2)的第一个用户时成功,但是当我尝试插入角色为Manager*pkid=1, admin(pkid=2, serviceUser(pkid=3)的第二个用户时,不允许我插入具有以下异常的第二个用户


  com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:键'UK_ixctfj5iq0enl7iktlpo7wxct'的条目'2'重复


有人可以帮我为什么在生成表时会创建此约束吗,如何将第二个用户插入数据库?

最佳答案

如果在OnetoMany上使用role_list,则实际上是在说一个User将指向许多Roles,而Role将仅指向一个User。这将通过unique上的join table键约束来强制执行。如果已打印出SQL语句,则在创建schema时将看到它。类似于以下内容:

alter table user_role add constraint UK_ixctfj5iq0enl7iktlpo7wxct unique (role_id)


根据您的要求,您还可以有一个由许多Role使用的单个Users。您的管理员角色primary key是2,并且您希望能够将其分配给多个用户。您的关系是role_list的ManyToMany

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="user_role")
private Collection<Role> roleList;


更改批注时,您仍将具有join table,但不会添加任何约束。

10-06 14:11