带@JoinTable的@oneToMany在jpa中有独特的约束吗?

时间:2016-07-18 12:00:00

标签: mysql oracle hibernate jpa jpa-annotations

我有两个表是USER实体

@OneToMany
@JoinTable(name="user_roles")
private List<Role> roles;

角色实体拥有用户

@ManyToOne
private User user;

表user_role的描述是

Name                     Null     
USER_RECORD_ID  NOT NULL NUMBER(19) 
ROLE_RECORD_ID NOT NULL NUMBER(19)  

注意:用户可以拥有多个角色,我已经通过脚本创建了角色,拥有Id:10001,10002,10003等

在user_role角色表中,我插入一个具有所有角色的用户800001,因此该表看起来像

USER_RECORD_ID  ROLE_RECORD_ID
800001          10001
800001          10002
800001          10003
800002          10001   ///This record will through me unique constraint error

因此,如果我尝试为新用户赋予角色预定义角色,那么我就会遇到此错误

INSERT INTO USER_ROLE(USER_RECORD_ID,ROLE_RECORD_ID) VALUES(800002,10001)

错误报告 - SQL错误:ORA-00001:违反了唯一约束(SYSTEM.UK_LPLHY51JOJA1LP4465QK2E0AF) 00001. 00000 - &#34;违反了唯一约束(%s。%s)&#34; *原因:UPDATE或INSERT语句尝试插入重复键。            对于在DBMS MAC模式下配置的Trusted Oracle,您可能会看到            如果重复条目存在于不同级别,则显示此消息。 *操作:删除唯一限制或不插入密钥。

2 个答案:

答案 0 :(得分:2)

我认为错误是由使用@ManyToOne / @OneToMany引起的,而您的关系是@ManyToMany。这样做是因为在示例中,您为USER_RECORD_ID的值800001提供了多个ROLE_RECORD_IDROLE_RECORD_ID的值为10001的多个{{1} }}

因此,请尝试使用USER_RECORD_ID,这应该可以解决您的问题。 如果您需要,可以参考以下内容:https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany

答案 1 :(得分:0)

您已经错误地设置了映射,因为您似乎打算使用关系表的双向关系,而是设置两个独立的关系。第一个,User.roles使用关系表,但其他的

@ManyToOne
private User user;

告诉JPA设置一个在Role表中使用外键的Role-User关系。这似乎不是您问题的根源,但会导致您遇到其他问题并且不符合您的要求 - 您的角色只能引用单个用户,但您要求角色被分配多个用户。尝试:

@ManyTooMany
@JoinTable(name="user_roles")
private List<Role> roles;

..并且在角色实体中:

@ManyTooMany(mappedby"roles")
private List<User> users;

还要确保删除数据库架构并让JPA使用这些新映射重新创建数据库。