我想在父实体中建立单向关系,子实体有父实体的FK。
class Person {
@Id
@Column(name = "id")
String id;
@OneToOne
@JoinColumn(name = "id", referencedColumnName = "person_id")
Name name;
}
class Name {
@Id
@Column(name = "person_id")
String personId;
String name;
}
Name表有来自person表的FK。但我只想在个人实体中定义关系。我使用@JoinColumn进行映射,并将名称设置为person表
中的id
。在下一个例子中,我有一对多关系例如
class Parent {
@Id
@Column(name = "id")
String id;
@OneToMany
@JoinColumn(name = "parent_id", referencedColumnName = "id")
List<Child> childs;
// fields...
}
class Child {
@Id
@Column(name = "Id")
String id;
@Column(name = "parent_id)
String parentId;
}
在@JoinColumn的一对多关系中,我从子表中设置了名称,并从父表中设置了引用列。但是,当我在上面的person类中使用@OneToOne定义相同的单向关系时,我必须从person表而不是从name表中设置@joincolumn名称。
我的问题是为什么这两个连接条件中的定义名称不同,在一个示例中,我必须将名称设置为来自同一表的PK列名的名称,而在第二个示例中,我必须设置来自子表的列名。
原因是join列只能出现在ToOne
端。如文档中所述:
公共抽象java.lang.String name
(可选)外键列的名称。它所在的表取决于上下文。
- 如果连接是针对使用外键映射策略的OneToOne或ManyToOne映射,则外键列位于源实体或可嵌入的表中。
- 如果连接是针对使用外键映射策略的单向OneToMany映射,则外键在目标实体的表中。
- 如果连接是针对多多映射,或者使用连接表的OneToOne或双向ManyToOne/OneToMany映射,则外键在连接表中。
- 如果连接是针对元素集合的,则外键在集合表中。
请注意,单向使用@OneToMany
和@JoinColumn
的能力仅在JPA 2.0中添加
@OneToMany
@JoinColumn(name = "parent_id")
List<Child> childs;
当你使用单向@OneToMany
没有@JoinColumn
:
@OneToMany
List<Child> childs;
例如,hibernate在两个连接实体之间使用链接表。