我有两个表是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,您可能会看到 如果重复条目存在于不同级别,则显示此消息。 *操作:删除唯一限制或不插入密钥。
答案 0 :(得分:2)
我认为错误是由使用@ManyToOne
/ @OneToMany
引起的,而您的关系是@ManyToMany
。这样做是因为在示例中,您为USER_RECORD_ID
的值800001
提供了多个ROLE_RECORD_ID
而ROLE_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使用这些新映射重新创建数据库。