首页 > 解决方案 > 具有 OneToMany 关系的休眠重复条目

问题描述

例如,我在休眠中有一个用户实体,其中包含以下 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'"错误。
MySQL 工作台中的表
似乎 want_to_match_id 不允许重复。如何解决这个问题?

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

标签: javadatabasehibernatespring-bootjpa

解决方案


您正在使用该列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

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


推荐阅读