一尘不染

Hibernate / JPA通过联接表和组合键实现多对多关系,Unique Constraint问题

hibernate

所以我昨天问了这个问题,但是目标职位已经改变,问题有所不同:

Hibernate /JPA元素集合具有多对多关系吗?

我想知道是否可以创建将对所需关系进行建模的实体,以便Hibernate在启动应用程序时创建我的架构。

关键是Join表实际上可以包含不链接到任何Elements的行。该结构表示基于“类型”和“值”对的元素分类,并输入到此特定应用程序之外的系统中。

我想做的是通过映射将我的元素hibernate实体设置为包含类别列表,这样我才能实际看到元素属于的类别,以便hibernate为我创建表。

到目前为止,这是我的东西:将其映射到我的Element Entity类中:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "ELEMENT_ELEMENTCATOGORY", joinColumns = {
        @JoinColumn(name = "type", referencedColumnName = "type"),
        @JoinColumn(name = "value", referencedColumnName = "value") })
@Column(name = "category")
public List<ElementCategory> getCategories() {
    return categories;
}

这完成了我想要的大部分工作,它如上所述创建了我的表,正是我希望它们阻止一件事,在(类型,值)对的元素表中添加了唯一约束。我不希望这样,因为多个元素可以具有相同的类型和值对,我需要能够从开始创建时就停止唯一约束,但是无法弄清楚当前映射的方式,我可以这样做吗?我是否错过了多对多关系的意义?


阅读 259

收藏
2020-06-20

共1个答案

一尘不染

实际上,Hibernate对type和value列施加唯一约束似乎很合逻辑。

您在@ManyToMany映射中说,在可联接的联接列中是type和value列。因此,基本上,您说hibernate应该通过value和type属性确定哪个元素与ElementCategory耦合。因此,这两个属性的组合应该是唯一的。否则hibernate将不知道哪个元素属于哪个ElementType

如果希望将多个Element实体耦合到多个ElementType实体,并且类型和值的组合并不总是唯一的,则不能将这些属性用作联接列

2020-06-20