@oneToMany 和 @JoinTable 在 jpa 中具有唯一约束?
Posted
技术标签:
【中文标题】@oneToMany 和 @JoinTable 在 jpa 中具有唯一约束?【英文标题】:@oneToMany with @JoinTable have unique constraint in jpa? 【发布时间】:2016-11-21 00:41:45 【问题描述】:我有两个表是 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,您可能会看到 如果在不同级别存在重复条目,则此消息。 *操作:要么删除唯一限制,要么不插入密钥。
【问题讨论】:
似乎是多对多...你不需要角色/用户和用户角色吗? 【参考方案1】:您的映射设置不正确,因为您似乎打算建立一个使用关系表的双向关系,但却设置了两个独立的关系。第一个,User.roles 使用的是关系表,但是另一边
@ManyToOne
private User user;
告诉 JPA 设置使用角色表中的外键的角色-用户关系。这似乎不是您的问题的根源,但会导致您出现其他问题并且与您的要求不匹配 - 您的角色只能引用单个用户,但您要求为角色分配多个用户.试试:
@ManyTooMany
@JoinTable(name="user_roles")
private List<Role> roles;
.. 在角色实体中:
@ManyTooMany(mappedby"roles")
private List<User> users;
还要确保删除数据库架构并让 JPA 使用这些新映射重新创建数据库。
【讨论】:
【参考方案2】:我认为错误是由使用@ManyToOne
/@OneToMany
引起的,而您的关系是@ManyToMany
。之所以如此,是因为在示例中,您给出的 USER_RECORD_ID
的值为 800001
有多个 ROLE_RECORD_ID
,而 ROLE_RECORD_ID
的值为 10001
有多个 USER_RECORD_ID
。
因此请尝试使用@ManyToMany
,这应该可以解决您的问题。
以下是您需要时的参考:https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany
【讨论】:
以上是关于@oneToMany 和 @JoinTable 在 jpa 中具有唯一约束?的主要内容,如果未能解决你的问题,请参考以下文章
删除元素时使用 JoinTable 和 OrderColumn 的 Hibernate 单向 OneToMany 映射中的约束冲突
JPA 2.0 (Hibernate) 使用 @JoinTable 为 @OneToMany 生成不正确的连接表 PK
码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable