我有一个名为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
注释。
这种关系看起来像是多种多样的吗?
答案 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提供程序将为表和列生成默认名称。