外键必须与引用的主键具有相同的列数

时间:2014-11-26 01:46:48

标签: hibernate composite

这个错误似乎很常见,很多人似乎都遇到了这个错误。但不幸的是,我的问题似乎与他们的不同。在我的情况下,似乎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作为主键 - 这部分对我来说非常令人费解。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

似乎存在复制/粘贴错误,因为其中一些其他实体使用相同的表映射 - DOC_WEM_PRIMARY。 Hibernate在预期的实体之前发现了这个实体。 由于该实体只有一列作为主键,因此Hibernate抱怨这一点。 更正表名修复了问题。