Java 使用@IdClass复合主键时如何命名@ForeignKey?

Java 使用@IdClass复合主键时如何命名@ForeignKey?,java,hibernate,Java,Hibernate,原因:org.hibernate.AnnotationException:引用父实体子实体的外键的列数错误。应为2 由于@JoinColumn注释,此操作失败。但是我要如何为复合PK编写它呢?在自动生成期间,我必须使用此注释来设置foreignkey约束名称。对于复合键,您应该使用@JoinColumns @Entity @IdClass(MyPK.class) public class SubEntity { @Id private int id; @Id private St

原因:org.hibernate.AnnotationException:引用父实体子实体的外键的列数错误。应为2


由于
@JoinColumn
注释,此操作失败。但是我要如何为复合PK编写它呢?在自动生成期间,我必须使用此注释来设置foreignkey约束名称。

对于复合键,您应该使用@JoinColumns

@Entity
@IdClass(MyPK.class)
public class SubEntity {
    @Id private int id;
    @Id private String name;
}

@Entity
public class ParentEntity {
    @OneToOne(cascade = ALL)
    @JoinColumn(name="fk_sub_id", foreignKey = @ForeignKey(name="fk_sub"))
    private SubEntity sub;
}
更新:

在本例中,Hibernate似乎没有遵循JPA2.1规范。您还需要包括hibernates自己的注释,该注释已被弃用,但仍具有功能。应添加如下内容:

@JoinColumns(value = {
    @JoinColumn(name = "fk_sub_id", referencedColumnName = "id"),
    @JoinColumn(name = "fk_name", referencedColumnName = "name")},
    foreignKey = @ForeignKey(name = "fk_sub"))

我尝试了它,但它仍然生成了一个随机约束名称:
ks1hyry3g2fxi2dvd8l9xv0外键的约束fk_(fk_sub_id,fk_name)
您是正确的,在这个实例中,hibernate似乎没有遵循JPA2.1规范。我已经更新了我的答案,为hibernate提供了一个解决方案。
@JoinColumns(value = {
    @JoinColumn(name = "fk_sub_id", referencedColumnName = "id"),
    @JoinColumn(name = "fk_name", referencedColumnName = "name")},
    foreignKey = @ForeignKey(name = "fk_sub"))
@org.hibernate.annotations.ForeignKey(name = "fk_sub")