另一个hibernate问题…:P
使用Hibernate的Annotations框架,我有一个User实体。每个人都User可以有一个朋友的集合:其他User的集合。但是,我还无法弄清楚如何在User由Users 列表组成的类中创建多对多关联(使用用户友好中间表)。
User
这是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)。
uid
tbl_users
personId
friendId
问题是,即使我已经预先填充了Friends表,使得系统中的所有用户都是与所有其他用户的朋友,“ friends”字段仍然保持为空。我什至尝试将关系切换为@OneToMany,但仍然显示为空(尽管Hibernate调试输出显示SELECT * FROM tbl_friends WHERE personId = ? AND friendId = ?查询,但没有其他内容)。
@OneToMany
SELECT * FROM tbl_friends WHERE personId = ? AND friendId = ?
关于如何填充此列表的任何想法?谢谢!
@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状态。