【发布时间】:2016-08-21 10:16:43
【问题描述】:
我有一个关于 Hibernate ManyToMany 映射的问题。我有两个类 A 和 B,它们之间的映射是由 Hibernate 解析的 ManyToMany 映射:
@Entity
@Table(name="A")
public class A {
@Id
@GeneratedValue
private Long id;
@ManyToMany
@JoinTable(name="A_B", joinColumns=@JoinColumn(name="A_id"), inverseJoinColumns=@JoinColumn(name="B_id"))
private Set Bs;
}
@Entity
@Table(name="B")
public class B {
@Id
@GeneratedValue
private Long id;
@ManyToMany(mappedBy="b")
private Set As;
}
用户和组的外键是“A_id”和“B_id”。连接表称为 A_B。
现在,我想添加 C。我希望 A_B 与 C 有关系,创建与 C 和 A_B 的多对多关系,我可以称之为 A_B_C。
@Entity
@Table(name="C")
public class C {
@Id
@GeneratedValue
private Long id;
@ManyToMany
@JoinTable(name="A_B", joinColumns=@JoinColumn(name="C_id"), inverseJoinColumns=@JoinColumn(name="?????"))
private Set A_Bs; // Don't have any UserGroup entity !
}
编辑:所以我将创建 A_B 实体,A 和 B 以及 A_B 有 2 个 @OneToMany 关系。
问题: A_B 关于主键的最佳解决方案是什么?嵌入式主键或生成的 Id ?我不想重复 (user_id, group_id) :/ 只有唯一约束就足够了?
A_B C 关系呢?我猜不需要任何实体 A_B_C,@ManyToMany 就足够了......
我将不胜感激。
非常感谢!
【问题讨论】:
-
如果您想与 UserGroup 建立关系,则创建一个 UserGroup 实体(并具有 1-N User-UserGroup 和 1-N Group-UserGroup)。您不能对用于其他关系的连接表进行混蛋
-
所以添加UserGroup(现在是A_B)实体,我可以与C建立@ManyToMany关系,但是在A_B上,我需要生成Id或EmbeddedId?
-
您需要任何实体的 ID。无论是由 User.id 和 Group.id(带有 IdClass)还是 EmbeddedId(带有这两个字段)形成的 Id,或者您是否想要一个单独的 Id 仅用于这些对象,这取决于您。
-
假设我在我的 A_B 实体上添加了一个生成的 id。如何确定我在你的功能点上没有重复? (Id 1,用户 A 到组 A,Id 2,用户 A 到组 A)
-
你可以做独特的约束......