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单向OneToMany产生的结果太多_Java_Hibernate_Spring Boot_Spring Data Jpa_One To Many - Fatal编程技术网

Java JPA单向OneToMany产生的结果太多

Java JPA单向OneToMany产生的结果太多,java,hibernate,spring-boot,spring-data-jpa,one-to-many,Java,Hibernate,Spring Boot,Spring Data Jpa,One To Many,我很难使用没有连接表的单向的OneToMany JPA映射 包括嵌套实体在内的完整实体基本上如下所示: Parent └ ChildLvl1 └ ChildLvl2 └ Attribute 问题是我可以很好地插入一个复杂的实体,当我使用repository.findAll()检索它时,它可以很好地工作,并且生成的对象与预期的一样,但是当我使用api方法repository.getOne(Long)时,它返回的实体太多了。次数过多的次数取决于我插入的属性数 因此,如

我很难使用没有连接表的单向的OneToMany JPA映射

包括嵌套实体在内的完整实体基本上如下所示:

Parent
  └ ChildLvl1
     └ ChildLvl2
        └ Attribute
问题是我可以很好地插入一个复杂的实体,当我使用
repository.findAll()
检索它时,它可以很好地工作,并且生成的对象与预期的一样,但是当我使用api方法
repository.getOne(Long)
时,它返回的实体太多了。次数过多的次数取决于我插入的属性数

因此,如果我插入一个具有一个属性的childLvl2的父对象,两种方法都会产生相同的结果。 但是假设我插入一个具有两个属性的childLvl2,
repository.findAll()
返回以下结果:

parent
  └ childLvl1
     └ childLvl2
        ├ attribute_1
        └ attribute_1
parent  (id=1)
  ├ childLvl1   (id=1)
  │  ├ childLvl2   (id=1)
  │  │  ├ attribute_1   (id=1)
  │  │  └ attribute_2   (id=2)
  │  └ childLvl2   (id=1)
  │     ├ attribute_1   (id=1)
  │     └ attribute_2   (id=2)
  └ childLvl1   (id=1)
     ├ childLvl2   (id=1)
     │  ├ attribute_1   (id=1)
     │  └ attribute_2   (id=2)
     └ childLvl2   (id=1)
        ├ attribute_1   (id=1)
        └ attribute_2   (id=2)
repository.getOne(Long)
返回以下结果:

parent
  └ childLvl1
     └ childLvl2
        ├ attribute_1
        └ attribute_1
parent  (id=1)
  ├ childLvl1   (id=1)
  │  ├ childLvl2   (id=1)
  │  │  ├ attribute_1   (id=1)
  │  │  └ attribute_2   (id=2)
  │  └ childLvl2   (id=1)
  │     ├ attribute_1   (id=1)
  │     └ attribute_2   (id=2)
  └ childLvl1   (id=1)
     ├ childLvl2   (id=1)
     │  ├ attribute_1   (id=1)
     │  └ attribute_2   (id=2)
     └ childLvl2   (id=1)
        ├ attribute_1   (id=1)
        └ attribute_2   (id=2)
(id=1)在这里表示数据库表中实体的内部id。事实上,如果我直接查看数据库,它包含我期望的数据,例如,对于ChildLvl1:

SELECT * FROM CHILD_LVL1;

ID    | NAME  | PARENT_ID  
------|-------|-----------
    1 |  TEST |         1
这表明数据库中的一切似乎都如预期的那样,但是来自hibernate的
repository.getOne(Long)
的映射似乎无法正常工作

我也用
@OneToMany(mappedBy=“xxx”)
而不是
@JoinColumn
尝试了这个方法,但是我得到了相同的结果:-/,所以我猜错误在其他地方

查看hibernate执行的SQL,我发现这两个方法使用不同的查询,
findAll()
执行多个查询,然后构建实体,而
getOne
只执行一个带有连接的select,但我真的希望得到相同的结果对象

我的实体设置如下:

Parent
  └ ChildLvl1
     └ ChildLvl2
        └ Attribute
@Transactional
@实体
@XmlRootElement
公共类父类{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
长id;
字符串名;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphan=true)
@JoinColumn(name=“PARENT\u ID”,referencedColumnName=“ID”)
列表
...
}
@Transactional
@实体
@XmlType
公营儿童1级{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
长id;
字符串名;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphan=true)
@JoinColumn(name=“C\u LVL1\u ID”,referencedColumnName=“ID”)
列出12级儿童;
...
}
@Transactional
@实体
@XmlType
公共类儿童lVL2{
@身份证
@列(name=“C_LVL2_ID”)
@GeneratedValue(策略=GenerationType.AUTO)
长id;
字符串名;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphan=true)
@JoinColumn(name=“C_LVL2_ID”)

列表,包括一个以可复制的方式演示问题的测试用例。

不幸的是,我在两周后没有收到任何响应-我已经在官方跟踪器中创建了一个错误报告-让我们看看项目说明: