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")