0

我有一个名为 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注释。

这种关系看起来像多对多吗?

4

1 回答 1

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 提供程序将为表和列生成默认名称。

于 2013-10-23T08:18:09.893 回答