@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

从 Hibernate 中的 JoinTable 中检索所有记录

在哪种情况下使用 JPA @JoinTable 注释?

JPQL 用于单向 OneToMany