具有 OneToMany 关系的休眠重复条目

Posted

技术标签:

【中文标题】具有 OneToMany 关系的休眠重复条目【英文标题】:Hibernate duplicate entry with OneToMany relation 【发布时间】:2020-02-18 01:55:38 【问题描述】:

例如,我有一个处于休眠状态的用户实体,其中包含以下 2 个字段:

@Entity
@Table(name = "user")
public class User 
    @OneToMany(fetch = FetchType.LAZY)
    @JsonIgnore
    private Set<User> addedUsers;

    @OneToMany(fetch = FetchType.LAZY)
    @JsonIgnore
    private Set<User> wantToAdd;

addedUsers 适用于同意彼此匹配的 2 个人,而 wantToAdd 适用于向其他用户发送好友请求但尚未收到回复的用户。 这是我使用的一系列查询:(假设有 3 个用户 a、b、c)

a add b -> good  
a add c -> good   
b add c -> failed

现在它给出了 "java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'UK_4l1fmdm138stci88r2ht2ggff'" 错误。Table in mysql workbench 似乎 want_to_match_id 不允许重复。如何解决这个问题?

我也认为它不利于用户引用自身,但我不知道我该怎么做。

【问题讨论】:

那么为什么在同一个实体类中使用实体类作为列? -- 不行! 【参考方案1】:

您正在使用列 want_to_match_id 将用户 ID 与与该人匹配的用户 ID 匹配。但是您在 want_to_match_id 列上添加了唯一键约束,这导致了问题。当您将唯一键约束添加到此列时,这意味着您无法将相同的用户 ID 匹配到多个人。假设我有一个用户 A 的用户 ID 1 并且必须将它与用户 B 和用户 C 的用户 ID 2 和 3 匹配。但我也想将 Person B 与 Person C 匹配,所以表格条目最终看起来像(根据有问题的细节):

user_id | want_to_match_id
1           2
1           3
2           3

但是您在列上有一个唯一键约束,不允许此条目导致问题。您应该考虑重新设计表结构以更好地反映您的要求。

【讨论】:

那么我还应该在我的 User 类中保留一个 User 列表吗?或者我应该重新设计它并创建另一个名为 Friend 的类,并添加一个 Friend 列表而不是 User?

以上是关于具有 OneToMany 关系的休眠重复条目的主要内容,如果未能解决你的问题,请参考以下文章

休眠。如何将条目添加到具有来自 Hibernate 中 2 个不同表的 2 个外键的表中?

JPA 与同一实体的两个单向 @OneToMany 关系导致重复条目

无法在休眠中删除 OneToMany 关系的实例

非主键之间的休眠关系OneToMany

Hibernate @OneToMany 错误:键 'PRIMARY' 的重复条目 '0'

@OneToMany 在休眠中