小编典典

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

hibernate

另一个hibernate问题…:P

使用Hibernate的Annotations框架,我有一个User实体。每个人都User可以有一个朋友的集合:其他User的集合。但是,我还无法弄清楚如何在UserUsers
列表组成的类中创建多对多关联(使用用户友好中间表)。

这是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;
}

用户-
朋友映射表只有两列,这两uid列都是该tbl_users表列的外键。两列是personId(应映射到当前用户)和friendId(指定当前用户的朋友的ID)。

问题是,即使我已经预先填充了Friends表,使得系统中的所有用户都是与所有其他用户的朋友,“
friends”字段仍然保持为空。我什至尝试将关系切换为@OneToMany,但仍然显示为空(尽管Hibernate调试输出显示SELECT * FROM tbl_friends WHERE personId = ? AND friendId = ?查询,但没有其他内容)。

关于如何填充此列表的任何想法?谢谢!


阅读 343

收藏
2020-06-20

共1个答案

小编典典

@ManyToMany对自己来说相当令人困惑,因为您通常的建模方式与“hibernate”方式不同。您的问题是您缺少另一个收藏夹。

可以这样考虑-如果要“多对多”映射“作者”
/“书”,则需要“书”上的“作者”集合和“作者”上的“书”集合。在这种情况下,您的“用户”实体代表关系的两端。因此您需要“我的朋友”和“朋友的”收藏集:

@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状态。

2020-06-20