3

我正在尝试执行以下操作(非常人为的示例):

我有两个表 A 和 B,它们形成了一个多对多关系,为此我创建了一个映射表 A_B。然后我有一个表 C,它与映射表 A_B 形成一对多的关系。

tableA
------
a_id [pk]

然后

tableB
------
b_id [pk]

然后

tableA_B
-------
a_id [pk]
b_id [pk]

然后

tableC
------
c_id [pk]

然后

tableC_AB
---------
c_id [pk]
a_id [pk]
b_id [pk]

因此,在 Hibernate 中,我为 A、B 和 C 创建了实体...

ClassA {
    ....
    @JoinTable(
        name="A_B",
        joinColumns={@JoinColumn(name="a_id")},
        inverseJoinColumns={@JoinColumn(name="b_id")}
    )
    @ManyToMany(cascade = {CascadeType.ALL})
    private Set<B> bset = new HashSet<B>();
}

那么(反比关系)

ClassB {
    @ManyToMany(mappedBy="bset")
    private Set<A> subjects = new HashSet<A>();
}

这会创建第一个映射 A_B 但是我不确定如何在休眠中创建映射 C_AB。我什至没有 A_B 的实体(仅存在于数据库中)所以我该怎么做呢?

任何帮助表示赞赏。

干杯,

4

1 回答 1

0

我想建议应该使用独立的关联/加入/链接实体类,而不是隐式的多对多表。因为现实世界中不存在没有创建时间、创建者、协议和雇佣合同等附加字段的连接表。

所以我的意思是:

  • tableA_B 应该映射到独立的实体,当两个东西链接在一起时,必须有一些额外的字段。
  • tableC_AB 也应该映射到独立实体。
  • 当我们要查找集合字段时,我们可以通过 HQL 的顺序查找和获取集合字段。
  • 多对多是错误的,关联表不能有额外的字段,但它应该有
于 2013-03-11T15:30:17.980 回答