Java Hibernate/JPA多对多关系通过一个联接表和一个复合键,唯一约束问题

Java Hibernate/JPA多对多关系通过一个联接表和一个复合键,唯一约束问题,java,hibernate,many-to-many,composite-key,unique-constraint,Java,Hibernate,Many To Many,Composite Key,Unique Constraint,所以我昨天问了这个问题,但目标岗位发生了变化,问题有所不同: 我想知道是否有可能创建实体来为我所需的关系建模,以便Hibernate在我启动应用程序时创建我的模式 我想要的关系如下所示: @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "ELEMENT_ELEMENTCATOGORY", joinColumns = { @JoinColumn(name = "type", referencedColumnName =

所以我昨天问了这个问题,但目标岗位发生了变化,问题有所不同:

我想知道是否有可能创建实体来为我所需的关系建模,以便Hibernate在我启动应用程序时创建我的模式

我想要的关系如下所示:

@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;
}

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

我希望能够通过映射将我的元素Hibernate实体设置为包含类别列表,这样我就可以实际看到元素所属的类别,这样Hibernate就可以为我创建表

到目前为止,我得到的是:在我的元素实体类中映射如下:

@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;
}
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“ELEMENT\u ELEMENTCATOGORY”,JointColumns={
@JoinColumn(name=“type”,referencedColumnName=“type”),
@JoinColumn(name=“value”,referencedColumnName=“value”)})
@列(name=“category”)
公共列表getCategories(){
退货类别;
}

这就完成了我想要的大部分工作,它如上所述创建了我的表,这正是我想要它们的方式。除了一件事,在元素表的(类型,值)对中添加了一个唯一的约束。我不想这样做,因为多个元素可以有相同的类型和值对,我需要能够从begin created开始停止唯一约束,但不知道如何使用当前映射,可以这样做吗?我是否遗漏了多对多关系的要点?

实际上,Hibernate在类型和值列上设置了一个唯一的约束,这似乎很合乎逻辑

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


如果希望多个图元图元可以耦合到多个ElementType图元,并且类型和值的组合并不总是唯一的,那么您就不能将这些属性用作joincolumns了

我仍然认为您需要一个inverseJoinColumn来将ElementCategory的id包含在您的联接表中。类型和值是一个实体听起来是否更符合逻辑?因此,这种类型的id,value实体是jointable的一个joincolumn,id隐含在我有一组元素类别的事实中,就像任何集合一样。正如我所说的,表的设置是正确的,这包括联接表中的“category”和ElementCategory表中的“id”之间的链接。您认为反向联接会从元素表中删除唯一约束吗?我会试试看。我只是想大声说:)你也是对的,将类型和值对建模为一个实体更符合逻辑,但我不能更改元素表,因为有一个前端我无法控制访问它。但是这样就没有办法让元素类包含一个类别列表了吗?这是因为它需要更好的设计,所以运气不好吗?它可以包含一个类别列表,但不基于类型和值,如果这两个值对于每个元素不是唯一的,那么就不完全一样了。但是在我的模型中,类别基于类型和值的组合,多个元素可以有相同的一对,所以我不可能让hibernate管理这个?我能做的最好的事情就是在我的服务中实现一些单独处理类别的功能,并使列表暂时化。