当前位置: 首页 > 面试题库 >

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

曾宏毅
2023-03-14
问题内容

另一个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 = ?查询,但没有其他内容)。

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


问题答案:

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



 类似资料:
  • 当我有用户并且他们有其他用户作为朋友时,我想让应用程序类似于facebook。因此,我创建了一个实体

  • 当我映射同一个实体时,就像这里回答的那样: Hibernate与同一实体的多对多关联 在“tbl_friends”表中,我有相同含义的行。例如,我有id=1的用户和id=2的用户。在“tbl_friends”表中,当他们作为朋友链接时,我有两行 使用Hibernate或JPA引用是否可以在一行(1-2或2-1)中建立这种关系?

  • 问题内容: 问题在标题中: 如何将多对多关系表作为实体? 问题答案: 我会说,你的问题很合理。看看这个文档部分:第24章最佳实践。摘录: 不要使用外来关联映射: 真正的多对多关联的实际测试案例很少见。大多数时候,您需要存储在“链接表”中的其他信息。在这种情况下,最好将两个一对多关联用于中间链接类。实际上,大多数关联是一对多和多对一的。因此,在使用任何其他关联样式时,您应谨慎进行。 我们正在处理的方

  • 我有两个表,ComputerNode和Connection。ComputerNode有一个主键< code>nodeid,但连接没有主键。我无法修改表模式。如果它们有一对多的关系,我应该如何创建java POJO?基本上我的目标是做一个像这样的内部连接: 下面是 SQL 表架构。计算机节点表: 连接表: 表之间的关系是一对多的。一个计算机节点可以有多个连接 我已经创建了两个Java的POJO类,但

  • 我有实体FooDetails,它有两个字段:客户和位置列表。Customer有Address(@onetoone单向映射),而Location也有带有@onetoone映射的Address。 碰巧在客户中的地址和在位置中的地址是相同的。所有这些对象都来自远程服务,在保存之前,我手动将远程对象的ID放入实体中。映射如下所示:

  • 我在hibernate中搜索建立关系的各种可能性,遇到了下面的代码片段