【发布时间】:2017-01-12 20:47:39
【问题描述】:
我需要在父子之间创建一对多映射。父母有一个嵌入的 id。我采用了这种方法,我得到:
编辑: 父表包含 3 列,它们是来自 3 个不同子表的外键。
org.hibernate.AnnotationException:从 com.Child 引用 com.Parent 的外键具有 列数错误。应该是 3Parent {
@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