Hibernate - 两个类之间多个多对多关联

3

我有两个实体,称它们为AB。这些实体可能处于三种不同的多对多关系之一。

我该如何在Hibernate中建模?思路是类A将具有以下字段:

Set<B> relationX;
Set<B> relationY;
Set<B> relationZ;

类B同样会有字段:

Set<A> relationX;
Set<A> relationY;
Set<A> relationZ;

两个类都拥有所有三个字段,因为我希望这个关联是双向的。
使用“标准”的Hibernate多对多注解,就像这样...
@JoinTable(name = "A_relX_B",
        joinColumns = {@JoinColumn(name = "A_ID")},
        inverseJoinColumns = {@JoinColumn(name = "B_ID")}
)

使用这种方法是行不通的,因为没有办法区分这三个独立的关系。我该如何实现呢?还是我需要手动分解m到n的关系?


你现在的做法是正确的。 - Dragan Bozanovic
我这样做?我不明白我给出的例子怎么能起作用,因为我没有在任何地方指定关系。 - Martin Melka
请看下面我的回答。 - Dragan Bozanovic
2个回答

4

你已经在正确的道路上了:

public class A {
  @ManyToMany
  @JoinTable(name = "A_relX_B",
    joinColumns = {@JoinColumn(name = "A_ID")},
    inverseJoinColumns = {@JoinColumn(name = "B_ID")}
  )
  Set<B> relationX;

  @ManyToMany
  @JoinTable(name = "A_relY_B",
    joinColumns = {@JoinColumn(name = "A_ID")},
    inverseJoinColumns = {@JoinColumn(name = "B_ID")}
  )
  Set<B> relationY;

  @ManyToMany
  @JoinTable(name = "A_relZ_B",
    joinColumns = {@JoinColumn(name = "A_ID")},
    inverseJoinColumns = {@JoinColumn(name = "B_ID")}
  )
  Set<B> relationZ;
}

基本上,这些是独立的关联,你可以拥有一个(最常见的情况)或一百个,只要每个都映射到单独的关系表中。
B端也是如此(不要忘记mappedBy在每个关联上选择反向端)。

真的吗?它就能这样工作吗?看来我低估了Hibernate。谢谢。 - Martin Melka

0

我不知道是否有一种简单的方法可以在不将多对多关系规范化为表格的情况下完成此操作。在关系型数据库中拥有多对多关系通常被认为是不可取的,需要使用交叉引用表来管理它们。


是的,在关系型数据库中,多对多关系通常不被推荐使用。然而,Hibernate 提供了一定程度的抽象,因此可以通过它来映射多对多关系。这可以通过 @JoinTable 注解来完成,它会帮助我们分解多对多关系。 - Martin Melka
我从未完全探索过Hibernate,因此对其所有功能都不熟悉,但在这种情况下,我会说:仅仅因为你可以做某些事情,并不意味着你应该这么做。如果你规范化了你的表,你根本不必开始就解决这个问题,对吧?但是,德拉甘似乎比我更好地掌握了这一点,所以我会点赞他的答案。 - NAMS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接