2

我有两个表是 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 - “违反唯一约束 (%s.%s)” *原因:UPDATE 或 INSERT 语句试图插入重复键。对于在 DBMS MAC 模式下配置的 Trusted Oracle,如果在不同级别存在重复条目,您可能会看到此消息。*操作:要么删除唯一限制,要么不插入密钥。

4

2 回答 2

4

我认为该错误是由于使用@ManyToOne/@OneToMany而您拥有的关系是@ManyToMany. 之所以如此,是因为在示例中,您给出的USER_RECORD_IDwith 值800001有多个ROLE_RECORD_ID,而ROLE_RECORD_IDwith 的值10001有多个USER_RECORD_ID

因此尝试@ManyToMany改用,这应该可以解决您的问题。以下是您需要时的参考:https ://en.wikibooks.org/wiki/Java_Persistence/ManyToMany

于 2016-07-18T12:16:02.320 回答
2

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

@ManyToOne
private User user;

告诉 JPA 设置使用角色表中的外键的角色-用户关系。这似乎不是您的问题的根源,但会导致您出现其他问题并且与您的要求不匹配 - 您的角色只能引用单个用户,但您要求为角色分配多个用户. 尝试:

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

.. 在角色实体中:

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

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

于 2016-07-18T18:05:10.440 回答