【问题标题】:Many to One Mapping in HibernateHibernate 中的多对一映射
【发布时间】:2017-06-24 04:20:48
【问题描述】:

以下映射给出错误

从 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 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;

公司实体:

@Id
private long        id;

想法是有一个 Invoice 表,其中包含(id、会计年度和 companyId)的组合和 InvoiceDetail 的组合键(seqNo、InvoiceId、InvoiceFiscalYear 和 InvoiceCompanyId)。

【问题讨论】:

  • 您使用的是什么版本的 Hibernate?我刚刚在 5.2.7 上测试了映射,我认为这没有问题。
  • 我使用的是休眠 5.1

标签: java hibernate jpa orm


【解决方案1】:

我认为您应该明确引用 @JoinColumn 注释上的 Invoice 列:

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

【讨论】:

  • 我认为这应该可行。将对其进行测试并接受答案。
  • 稍后再做一些测试。错误是一样的吗?
  • 一件关键的事情..请为有问题的表添加 DDL 语句..这可能会对事情有所帮助
  • 会这样做的。它在这里说我应该使用 IdClass 或嵌入的 id。也会尝试的.. stackoverflow.com/questions/13032948/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2014-06-02
  • 1970-01-01
相关资源
最近更新 更多