Cybermonk
Cybermonk

Reputation: 524

Many to One Mapping in Hibernate

The following mapping is giving an error of

A Foreign key refering db.KarateInvoice from db.KarateInvoiceDetail has the wrong number of column. should be 1

Invoice Entity:

@Id
@Column(name = "id")
private long                      id;
@OneToOne
@JoinColumn(name = "companyid")
@Id
private Company                   company;
@Id
private short                     fiscalYear;
@OneToMany(mappedBy = "karateInvoiceDetails")
private List<KarateInvoiceDetail> karateInvoiceDetails;

Invoice Detail:

@Id
private short         seqNo;
@ManyToOne
@JoinColumns({ @JoinColumn(name = "karateInvoiceId"),
        @JoinColumn(name = "karateInvoiceCompanyId"),
        @JoinColumn(name = "karateInvoiceFiscalYear") })
private KarateInvoice invoice;
@Id
@OneToOne
@JoinColumns({ @JoinColumn(name = "studentId"),
        @JoinColumn(name = "studentCompanyId") })
private KarateStudent student;

Company Entity:

@Id
private long        id;

Idea is to have an Invoice table with a composite of (id, fiscalyear, and companyId) and InvoiceDetail with a composite key of (seqNo, InvoiceId, InvoiceFiscalYear, and InvoiceCompanyId).

Upvotes: 1

Views: 410

Answers (1)

Maciej Kowalski
Maciej Kowalski

Reputation: 26492

I think you should explicitly reference the Invoice columns on the @JoinColumn annotations:

@ManyToOne
@JoinColumns({ @JoinColumn(name = "karateInvoiceId"
                  , referencedColumnName="id"),
        @JoinColumn(name = "karateInvoiceCompanyId"
               , referencedColumnName="companyId"),
        @JoinColumn(name = "karateInvoiceFiscalYear"
               , referencedColumnName="fiscalYear") })
private KarateInvoice invoice;

Upvotes: 1

Related Questions