【问题标题】:@JoinTable to use Imported Key instead of primary key@JoinTable 使用导入键而不是主键
【发布时间】:2012-06-16 02:18:43
【问题描述】:

使用 JPA/Hibernate 3.6/DB2。

我遇到了以下异常: 原因:org.hibernate.AnnotationException:SecondaryTable JoinColumn 不能引用非主键

原因:

public class XRequest {
  @ManyToOne
  @JoinTable(
    name = "RequestBatch",
    joinColumns = @JoinColumn(name = "requestBatchID", referencedColumnName="requestBatchID"),
    inverseJoinColumns = @JoinColumn(name = "requestVersionID")
  )
  private Requestversion requestversion;
}

requestBatchID 不是主键,而是从 RequestBatch 表中导入的键(在那里,它确实是主键)。为什么 JoinTable 必须使用主键?我的意思是,我不是刚刚定义这是一个多对一关联吗? 为什么它必须是主键?

指定:这就是表格的样子。

XRequest (
requestId int (primary)
requestBatchId int (imported key from RequestBatch)
)

RequestBatch (
requestBatchId int (primary)
requestVersionId int 
)

RequestVersion (
requestVersionId int (primary)
)

想要的结果是 Hibernate 为我构建的这个 SQL 查询:

select xr, rv 
from XRequest xr
left outer join RequestBatch rb on rb.requestBatchId = xr.requestBatchId 
inner join RequestVersion rv on rb.requestVersionId = rv.requestVersionId

【问题讨论】:

    标签: java hibernate jpa annotations jointable


    【解决方案1】:

    如果您阅读JPA Documentation on @JoinTable,您会看到joinColumnsinverseJoinColumns 的描述提及:

    引用主表的连接表的外键列 实体表...

    我想这足以理解约束。

    【讨论】:

    • 您没有正确阅读问题...该表确实有一个主键。我只是没有将它用于@JoinTable,因为连接表(RequestBatch)不使用它。
    • 关联不能引用非主键..利用主键,或者你想完成什么?
    • 很多请求属于一个requestbatch,而一个requestbatch只有一个requestversion(我把这些名字从原来的改了,可能听起来很奇怪)。由于所有请求中都没有 requestversionID(因为它可能会更改),因此我想使用 requestBatchId 将其加入,将 requestbatch 用作 JoinTable。
    • requestBatchId确实是RequestBatch表的主键!但它不在 Request 表中,因为这会破坏 ManyToOne 关联。
    • 那么,如果不使用 JoinTable,您知道我该怎么做吗?我理解约束,但是,约束是完全愚蠢的。如果约束不存在,我可以构建 Hibernate 将构建的查询,并且它运行良好。 (在第一篇文章中编辑)
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多