映射属性属于同一类型的jpa关系

时间:2013-10-22 21:34:44

标签: java hibernate jpa

我有一个名为person的类,它映射到person表。一个人有一组人物对象作为属性,代表他们的孩子,以及一组代表他们父母的人物对象。

他们是一个链接表,通过他们的ID保存子/父关系。这就是我所拥有的:

@ManyToMany(mappedBy = "id")
@JoinTable(name = "PARENT_TO_CHILD_LINK_TABLE", joinColumns = @JoinColumn(name = "CHILD_ID"), inverseJoinColumns = @JoinColumn(name = "PARENT_ID"))
private List<Person> parents;

@ManyToMany(mappedBy = "id")
@JoinTable(name = "PARENT_TO_CHILD_LINK_TABLE", joinColumns = @JoinColumn(name = "PARENT_ID"), inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
private ArrayList<Person> children;

我收到一条错误消息,指出标记为映射的注释不应包含@JoinColumn@JoinTable注释。

这种关系看起来像是多种多样的吗?

1 个答案:

答案 0 :(得分:2)

要映射两端都有集合的关系,例如父子关系,您需要@ManyToMany。你不能在两个方向都有@OneToMany的关系!

使用@ManyToMany,您只能在一边@JoinTable,而在另一边只需要mappedBy。这一次,在javadoc中非常清楚地列出:

  

每个多对多关联都有两个方面,即拥有方和非拥有方,或反方。连接表是在拥有方指定的。如果关联是双向的,则任何一方都可以被指定为拥有方。如果关系是双向的,则非拥有方必须使用ManyToMany批注的mappedBy元素来指定拥有方的关系字段或属性。

请记住,mappedBy 始终是指关系另一端的实体中的属性。在同一实体的实例之间存在关系的情况下,它指的是声明它的同一实体中的属性。这可能看起来很奇怪,但它是正常规则的应用。

以下是一些适合您的代码:

@ManyToMany
@JoinTable(name = "PARENT_TO_CHILD_LINK_TABLE",
           joinColumns = @JoinColumn(name = "PARENT_ID"),
           inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
private List<Person> children;

@ManyToMany(mappedBy = "children")
private List<Person> parents;

您实际上并不需要@JoinTable注释;如果您将其遗漏,JPA提供程序将为表和列生成默认名称。