【问题标题】:Unidirectional one to many, parent has composite key单向一对多,父级有复合键
【发布时间】:2017-01-12 20:47:39
【问题描述】:

我需要在父子之间创建一对多映射。父母有一个嵌入的 id。我采用了这种方法,我得到:

编辑: 父表包含 3 列,它们是来自 3 个不同子表的外键。

org.hibernate.AnnotationException:从 com.Child 引用 com.Parent 的外键具有 列数错误。应该是 3
Parent {
    @EmbeddedId
    private ParentEmbeddedId id;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Child",
               joinColumns = {
                   @JoinColumn(name="childId2"),
                   @JoinColumn(name="childId3")
               },
               inverseJoinColumns={
                   @JoinColumn(name="childId1")
               })
    private Collection<Child> children;

}

ParentEmbeddedId {
    private long childId1;
    private long childId2;
    private long childId3;
}

Child {
    private long childId1;
}

第二种方法:

使用下面的映射也会产生与上述相同的异常:

@OneToMany
@JoinColumn(name = "childId1")
private Collection<Child> children;

第三种方法:

@OneToMany
@JoinColumns({
    @JoinColumn(name="childId1", referencedColumnName="childId1"),
    @JoinColumn(name="childId2", referencedColumnName="childId2"),
    @JoinColumn(name="childId3", referencedColumnName="childId3"),
})
private Collection<Child> Children

这会导致

java.sql.SQLSyntaxErrorException: ORA-00904: "Child2_"."childId3": invalid identifier;

基本上,hibernate 生成的查询正在尝试使用“child”表中不存在的“childId3”列运行查询。

【问题讨论】:

  • 为什么要使用 inverseJoinColumns?
  • @chomnoue 我的方法 2 没有反列不起作用,所以我尝试了第一种方法
  • 为什么要嵌入 id?父母总是有3个孩子吗?对 3 列进行连接是低效的。如果您发布您想要的表结构,那么说明您需要什么映射会更容易。

标签: java database spring hibernate jpa


【解决方案1】:

试试

 Child {
    private long childId1;
    private long childId2;
    private long childId3;
}

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2021-06-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多