foreign key must have same number of columns as referenced primary key

3k Views Asked by At

This error seems to be very common and many people seem to have gotten this error. But unfortunately my problem seems to be different from theirs. In my case it seems hibernate cannot find primary key as composite but rather it thinks there is only one column in primary key.

I have two entities :-

1.)DocWemPrimary.java - Master table having composite primary key on columns (doc_id,prod_stage). 2.)DocWemSecondary.java - Child table having composite primary key on columns (doc_id,prod_stage,file_name).

I have two primary key classes for each of the above entities.

1.)DocWemPrimaryId.java 2.)DocWemSecondaryId.java

Here are relevant definitions of above classes :- 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 ;

  }

The error message that I get is :-

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

As you can see clearly , DocWemPrimary has two columns as primary key. Then why hibernate thinks it only has docId as primary key - that part has been very puzzling to me.

Thanks for your help.

2

There are 2 best solutions below

0
On BEST ANSWER

It seems there was a copy/paste error due to which some other entity was mapped with same table - DOC_WEM_PRIMARY . Hibernate was finding that entity before the intended enity. Since that entity only had one column as primary key , Hibernate was complaining about that. Correcting table name fixed the issue.

0
On

I have solved the issue with another simple approach.

I had two entities named as (Fault & Evidence)

There was the necessity of ManyToMany relationships between them.

Failed Attempt

Fault Entity

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "fault_evidence",
        joinColumns = {
                @JoinColumn(name = "fault_id")
        },
        inverseJoinColumns = {
                @JoinColumn(name = "evidence_id") })
private Set<FaultEvidence> faultEvidences;

After changing the @JoinTable name from @JoinTable(fault_evidence) to @JoinTable(evidence_fault) it worked as expected

Solved Attempt Fault entity

  @ManyToMany
@JoinTable(
        name = "evidence_fault",
        joinColumns = @JoinColumn(name = "fault_id"),
        inverseJoinColumns = @JoinColumn(name = "evidence_id"))
Set<FaultEvidence> faultEvidences;

Evidence entity

   @ManyToMany(mappedBy = "faultEvidences")
Set<Faults> faults;