我知道这个主题已在很多时候讨论过,但我仍然坚持异常: 外键必须与引用的主键具有相同的列数。
(我正在使用spring数据和休眠)
我的ID类:
@Embeddable
public class ProxyDienstRelationPK implements Serializable{
private static final long serialVersionUID = 1L;
@Column
private String parentDienstId;
@Column
private String subDienstId;
public ProxyDienstRelationPK(){}
public ProxyDienstRelationPK(ProxyDienst parentDienst, ProxyDienst subDienst){
this.parentDienstId = parentDienst.getId();
this.subDienstId = subDienst.getId();
}
//Getter and Setter , HashCode and Equals
}
我的实体:
@Entity
public class ProxyDienstRelation {
@EmbeddedId
private ProxyDienstRelationPK pdId;
private ProxyDienst subDienst;
private ProxyDienst parentDienst;
private boolean modul;
//Getter and Setter
}
我为此构造获得以下异常:
引起:org.hibernate.MappingException:外键(FK_ad3h9gu4labg6ix34bei3poxt:proxy_dienst_relation [parent_dienst_id,sub_dienst_id]))必须与引用的主键具有相同的列数(proxy_dienst [id]) 在org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110) 在org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:93) 在org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1816) 在org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1739) 在org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1424) 在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) 在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl $ 4.perform(EntityManagerFactoryBuilderImpl.java:850) ......还有23个
希望有人可以提供帮助。感谢
答案 0 :(得分:4)
@MapsId("subDienstId")
@ManyToOne
private ProxyDienst subDienst;
@MapsId("parentDienstId")
@ManyToOne
private ProxyDienst parentDienst;
在你的情况下,parentDienstId
是PK的一部分,但也扮演着FK的角色。这被称为“派生身份”。在Pro JPA 2书中有一个很好的章节。