鉴于以下两个实体:
class Parent {
@OneToMany(cascade=CascadeType.ALL)
private Set<Child> children;
(...)
}
class Child {
@ManyToOne
private Parent parent;
(...)
}
我想在数据库中有两个表。一张桌子供父母使用,另一张供儿童使用。但是Hibernate创建了三个表:一个用于父项,一个用于子项,一个用于连接它们(带有两个字段的表)。
即使我将@OneToOne
放在Child类的parent属性上,我仍然得到相同的结果。
我错过了什么?
答案 0 :(得分:3)
将mappedBy
属性添加到@OneToMany
课程中的Parent
。这使得Child
成为拥有者。
在Child
中,将@JoinColumn
注释添加到parent
字段,以便在子表中声明外键列名称。
来自@OneToMany#mappedBy
上的JavaDoc:
拥有这种关系的领域。除非关系是单向的,否则是必需的。
单向关系需要一个连接表,但在你的情况下它是双向的,因此它是必需的。
答案 1 :(得分:2)
构建双向关联时缺少注释中的 mappedBy =“parent”属性。
class Parent {
@OneToMany(mappedBy="parent",cascade=CascadeType.ALL)
private Set<Child> children;
(...)
}
class Child {
@ManyToOne
private Parent parent;
(...)
}
答案 2 :(得分:2)
如果子表中的外键列名为“parent_id”,请尝试
@OneToMany(mappedBy="parent")
private Set<Child> children;
和
@ManyToOne
@JoinColumn(name="parent_id")
private Parent parent;