具有 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 关系导致重复条目