gpt4 book ai didi

java - Hibernate与同一实体的递归多对多关联

转载 作者:行者123 更新时间:2023-12-02 01:30:40 25 4
gpt4 key购买 nike

另一个 Hibernate 问题...:P

使用 Hibernate 的注释框架,我有一个 User实体。每个User可以 Collection 的 friend : Collection 其他User s。但是,我一直无法弄清楚如何在 User 内创建多对多关联。类由 User 列表组成s(使用用户 friend 中间表)。

这是 User 类及其注释:

@Entity
@Table(name="tbl_users")
public class User {

@Id
@GeneratedValue
@Column(name="uid")
private Integer uid;

...

@ManyToMany(
cascade={CascadeType.PERSIST, CascadeType.MERGE},
targetEntity=org.beans.User.class
)
@JoinTable(
name="tbl_friends",
joinColumns=@JoinColumn(name="personId"),
inverseJoinColumns=@JoinColumn(name="friendId")
)
private List<User> friends;
}

用户- friend 映射表只有两列,这两列都是uid的外键。 tbl_users栏目 table 。两列分别是personId (应映射到当前用户)和 friendId (指定当前用户好友的id)。

问题是,“ friend ”字段始终为空,即使我已经预先填充了 friend 表,以便系统中的所有用户都是所有其他用户的 friend 。我什至尝试将关系切换到 @OneToMany ,并且它仍然为 null(尽管 Hibernate 调试输出显示 SELECT * FROM tbl_friends WHERE personId = ? AND friendId = ? 查询,但没有其他内容)。

关于如何填充此列表有什么想法吗?谢谢!

最佳答案

@ManyToMany to self 相当令人困惑,因为您通常对此进行建模的方式与“Hibernate”方式不同。您的问题是您缺少另一个集合。

这样想 - 如果您将“作者”/“书籍”映射为多对多,则需要书籍上的“作者”集合和作者上的“书籍”集合。在这种情况下,您的“用户”实体代表关系的两端;所以你需要“我的 friend ”和“ friend 的”集合:

@ManyToMany
@JoinTable(name="tbl_friends",
joinColumns=@JoinColumn(name="personId"),
inverseJoinColumns=@JoinColumn(name="friendId")
)
private List<User> friends;

@ManyToMany
@JoinTable(name="tbl_friends",
joinColumns=@JoinColumn(name="friendId"),
inverseJoinColumns=@JoinColumn(name="personId")
)
private List<User> friendOf;

您仍然可以使用相同的关联表,但请注意 join/inverseJon 列在集合上交换。

“friends”和“friendOf”集合可能匹配也可能不匹配(取决于您的“友谊”是否始终是相互的),当然,您不必在 API 中以这种方式公开它们,但这就是在 Hibernate 中映射它的方法。

关于java - Hibernate与同一实体的递归多对多关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57555432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com