【问题标题】:Using Many-To-Many junction table in another relation在另一个关系中使用多对多联结表
【发布时间】: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)
  • 你可以做独特的约束......

标签: java hibernate jpa orm


【解决方案1】:

我认为您不需要在Group 中与User 关联,因为Group 类似于字典。

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToMany
    @JoinTable(name = "users_groups")
    private Set<Group> groups;

}

@Entity
@Table(name="groups")
public class Group {

    @Id
    @GeneratedValue
    private Long id;

}

并且您需要在Newsletter 中与Group 建立@ManyToMany 关联

@Entity
@Table(name="newsletters")
public class Newsletter {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToMany
    @JoinTable(name="newsletters_groups")
    private Set<Group> groups;
}  

【讨论】:

  • 嗯,我知道我会调用我的表 A、B 和 C,我的例子很糟糕......但从功能的角度来看,你是对的,它更好 ;)
猜你喜欢
  • 2019-04-29
  • 2019-11-07
  • 2013-01-18
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多