2016-01-06 107 views
0

由于MySQLIntegrityConstraintViolation异常,我不打算在表列中插入重复条目。防止hibernate向mysql表中添加唯一索引

我有一个如下表结构: -

CREATE TABLE USER_ROLES ( 
    USER_ID BIGINT NOT NULL, 
    ROLE_ID BIGINT NOT NULL, 
    KEY USER (USER_ID), 
    KEY ROLE (ROLE_ID), 
    CONSTRAINT pk_user_roles PRIMARY KEY (USER_ID, ROLE_ID), 
    CONSTRAINT fk_users_user_roles FOREIGN KEY (USER_ID) REFERENCES USERS (ID) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT fk_roles_user_roles FOREIGN KEY (ROLE_ID) REFERENCES ROLES (ID) ON DELETE CASCADE ON UPDATE CASCADE 
) COLLATE='utf8_general_ci' ENGINE=InnoDB; 

我具有以下在上表2点的行。

USER_ROLES

2行表的创建和insetion后右表上的索引为: -

show index from user_roles; 

USER_ROLES indexes before

在这个阶段,下面的INSERT语句可与另外3日排成一排。

insert into user_roles values (1, 2); 

当通过休眠完成时,相同插入失败。 我有一个spring mvc应用程序,其中包含具有以下映射的User.java和Role.java域类。

@Table(name="USERS") 
public class User { 
    @OneToMany(fetch = FetchType.EAGER) 
     @JoinTable(name = "user_roles", 
     joinColumns  = {@JoinColumn(name = "user_id", referencedColumnName = "id")}, 
     inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")} 
     ) 
     private Set<Role> roles; 
} 

@Entity 
@Table(name = "ROLES") 
public class Role { 
    @OneToMany(fetch = FetchType.EAGER) 
     @JoinTable(name = "user_roles", 
     joinColumns  = {@JoinColumn(name = "role_id", referencedColumnName = "id")}, 
     inverseJoinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")} 
     ) 
     private Set<User> users; 
} 

当我开始了我的Spring MVC应用程序,然后查询此表的索引数据库,它提供了以下的输出: -

show index from user_roles; 

USER_ROLES indexes after

上面插入查询(插入user_roles values(1,2))通过应用程序执行失败时出现错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '2' for key 'UK_5q4rc4fh1on6567qk69uesvyf' 

我不能在USER_ID和ROLE_ID列中添加重复条目。 请指点我正确的方向。谢谢

+0

取决于你想要达到可能你愿意在为'USER_ROLES'重复的条目是什么:同一用户可以有多个角色相关联。在这种情况下,你应该使用多对多的关系,而不是一对多关系。 – Paizo

+0

谢谢Paizo。是的,这正是我想要实现的;用户可以有多个角色。我尝试了多对多的关系,并且按预期工作。请发表评论作为答案,以便我可以接受它。 – ivish

+0

已被其他人拍摄XD – Paizo

回答

1

我相信@OneToMany应该是@ManyToMany,因为你想让多个用户拥有多个角色,反之亦然。

(您需要休眠的更新模式后,手动删除唯一索引)

+0

谢谢Marius。是的,它的工作原理 – ivish

+0

非常好!很高兴听到。 – Marius