Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 映射属性为相同类型的jpa关系_Java_Hibernate_Jpa - Fatal编程技术网

Java 映射属性为相同类型的jpa关系

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

我有一个名为person的类,它映射到person表。一个人有一组表示其子女的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;
@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,并将其与您需要的进行比较。