Java Hibernate中的多对一映射

Java Hibernate中的多对一映射,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,以下映射给出的错误为 从db.KarateInvoiceDetail引用db.KarateInvoice的外键 列的编号错误。应该是1 发票实体: @Id @Column(name = "id") private long id; @OneToOne @JoinColumn(name = "companyid") @Id private Company company; @Id private short

以下映射给出的错误为

从db.KarateInvoiceDetail引用db.KarateInvoice的外键 列的编号错误。应该是1

发票实体:

@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;
公司实体:

@Id
private long        id;

想法是让一个
Invoice
表具有(id、fiscalyear和companyId)的组合和
InvoiceDetail
的组合键(seqNo、InvoiceId、InvoiceFiscalYear和InvoiceCompanyId)。

我认为您应该在@JoinColumn注释中显式引用Invoice列:

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

您使用的是什么版本的Hibernate?我刚刚在5.2.7上测试了映射,我不认为这有问题。我使用的是hibernate 5.1,我认为这应该可以工作。我将对它进行测试,如果答案是肯定的,我会接受的。错误是一样的吗?一件至关重要的事情。。请为有问题的表添加DDL语句。。这可能会给我们提供一些线索。这里说我应该使用IdClass或嵌入式id。我也会尝试。。
@ManyToOne
@JoinColumns({ @JoinColumn(name = "karateInvoiceId"
                  , referencedColumnName="id"),
        @JoinColumn(name = "karateInvoiceCompanyId"
               , referencedColumnName="companyId"),
        @JoinColumn(name = "karateInvoiceFiscalYear"
               , referencedColumnName="fiscalYear") })
private KarateInvoice invoice;