具有OneToMany关系的休眠重复项

时间:2019-10-21 23:39:42

标签: java database hibernate spring-boot jpa

例如,我在休眠中有一个用户实体,其中包含以下两个字段:

@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 个答案:

答案 0 :(得分:0)

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

但是您对该列有唯一的键约束,不允许该条目引起问题。您应该考虑重新设计表结构以更好地反映您的需求。