Java JPA单向OneToMany产生的结果太多
我很难使用没有连接表的单向的OneToMany JPA映射 包括嵌套实体在内的完整实体基本上如下所示: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)时,它返回的实体太多了。次数过多的次数取决于我插入的属性数 因此,如
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”)
列表,包括一个以可复制的方式演示问题的测试用例。不幸的是,我在两周后没有收到任何响应-我已经在官方跟踪器中创建了一个错误报告-让我们看看项目说明: