Java 映射属性为相同类型的jpa关系
我有一个名为person的类,它映射到person表。一个人有一组表示其子女的person对象作为属性,还有一组表示其父母的person对象 它们是一个链接表,通过其ID保存子/父关系。以下是我所拥有的:Java 映射属性为相同类型的jpa关系,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个名为person的类,它映射到person表。一个人有一组表示其子女的person对象作为属性,还有一组表示其父母的person对象 它们是一个链接表,通过其ID保存子/父关系。以下是我所拥有的: @ManyToMany(mappedBy = "id") @JoinTable(name = "PARENT_TO_CHILD_LINK_TABLE", joinColumns = @JoinColumn(name = "CHILD_ID"), inverseJoinColumns = @Jo
@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;
@ManyToMany(mappedBy=“id”)
@JoinTable(name=“PARENT\u TO\u CHILD\u LINK\u TABLE”,joinColumns=@JoinColumn(name=“CHILD\u ID”),inverseJoinColumns=@JoinColumn(name=“PARENT\u ID”))
私人名单父母;
@许多(mappedBy=“id”)
@JoinTable(name=“PARENT\u TO\u CHILD\u LINK\u TABLE”,joinColumns=@JoinColumn(name=“PARENT\u ID”),inverseJoinColumns=@JoinColumn(name=“CHILD\u ID”))
私人ArrayList儿童;
我得到一个错误,即标记为映射的注释不应具有@JoinColumn
或@JoinTable
注释
这个关系看起来像是多个吗?要映射两端都有集合的关系,如父子关系,您需要。你不能在两个方向上都有一个
@OneToMany
的关系
使用@manytomy
,您可以仅在一侧使用@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;
@manytomy
@JoinTable(name=“父项到子项链接表”,
joinColumns=@JoinColumn(name=“PARENT_ID”),
inverseJoinColumns=@JoinColumn(name=“CHILD_ID”))
私人名单儿童;
@许多(mappedBy=“儿童”)
私人名单父母;
实际上,您不需要
@JoinTable
注释;如果不使用,JPA提供者将为表和列生成默认名称。首先,您需要@manytomy
。你不能在两个方向上都有一个@OneToMany
的关系!所以当我建立多对多的关系时,映射的对象就消失了,对吗?你需要它在一边。这是第一次在以下文件中非常清楚地阐述:“每个多对多关联都有两个方面,拥有方和非拥有方,或相反。联接表是在拥有方指定的。如果关联是双向的,则任何一方都可以被指定为拥有方。如果关系是双向的,则非拥有方必须使用ManyToMany注释的mappedBy元素来指定拥有方的关系字段或属性。“。但这是否被视为特殊情况,因为该属性与类/实体的类型相同?我不确定mapped by属性会是什么,这不是特例。该是我回答这个问题的时候了……我有一个db系统,必须事先创建表,不能让JPA触及模式。对于这个用例,createtable.sql如何?您能编辑显示示例表结构和外键的答案吗?啊,在这种情况下,您几乎肯定需要一个@JoinTable
注释。如果您想查看使用注释和不使用注释生成的SQL,最好是自己尝试—更改代码,在本地生成SQL,并将其与您需要的进行比较。