这个错误似乎很常见,很多人似乎都遇到了这个错误。但不幸的是,我的问题似乎与他们的不同。在我的情况下,似乎hibernate无法找到主键作为复合,而是它认为主键中只有一列。
我有两个实体: -
1.)DocWemPrimary.java - 在列上具有复合主键的主表(doc_id,prod_stage)。 2.)DocWemSecondary.java - 列上具有复合主键的子表(doc_id,prod_stage,file_name)。
我为上述每个实体都有两个主键类。
1)DocWemPrimaryId.java 2.)DocWemSecondaryId.java
以下是上述类别的相关定义: - 1.)DocWemPrimary.java
@SuppressWarnings("serial")
@Entity
@Table(name = "DOC_WEM_PRIMARY")
public class DocWemPrimary {
@EmbeddedId
private DocWemPrimaryId docWemPrimaryId ;
@OneToMany(fetch=FetchType.LAZY,mappedBy="docId")
@Cascade({ CascadeType.SAVE_UPDATE, CascadeType.DELETE })
private Set<DocWemSecondary> docWemSecondary;
/**Other columns **/
}
2.)DocWemSecondary.java
@SuppressWarnings("serial")
@Entity
@Table(name = "DOC_WEM_SECONDARY")
@IdClass(DocWemSecondaryId.class)
public class DocWemSecondary {
@Id
@ManyToOne(fetch=FetchType.LAZY)
private DocWemPrimary docId ;
@Id
@Column(name = "FILE_NAME" )
private String fileName ;
}
3.)DocWemPrimaryId.java
@Embeddable
public class DocWemPrimaryId implements Serializable{
@Column(name = "DOC_ID",nullable=false)
private String docId ;
@Column(name = "PROD_STAGE",nullable=false)
private String prodStage ;
}
4.)DocWemSecondaryId.java
@Embeddable
public class DocWemSecondaryId implements Serializable
{
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "DOC_ID", referencedColumnName="DOC_ID" ,nullable = false,insertable=false, updatable=false),
@JoinColumn(name = "PROD_STAGE", referencedColumnName="PROD_STAGE",nullable = false,insertable=false, updatable=false)})
private DocWemPrimary docId ;
@Column(name = "FILE_NAME", insertable=false, updatable=false)
private String fileName ;
}
我得到的错误信息是: -
org.hibernate.MappingException: Foreign key
(FK_l3fmo38mh9t2j69fpesabyegp:DOC_WEM_SECONDARY [DOC_ID,PROD_STAGE]))
must have same number of columns as the referenced primary key (DOC_WEM_PRIMARY [DOC_ID])
如您所见,DocWemPrimary有两列作为主键。那么为什么hibernate认为它只有docId作为主键 - 这部分对我来说非常令人费解。
感谢您的帮助。
答案 0 :(得分:0)
似乎存在复制/粘贴错误,因为其中一些其他实体使用相同的表映射 - DOC_WEM_PRIMARY。 Hibernate在预期的实体之前发现了这个实体。 由于该实体只有一列作为主键,因此Hibernate抱怨这一点。 更正表名修复了问题。