我正面临着一个问题,即数据以递归形式出现。我想避免孩子获取父数据。这导致递归问题。 我已经提到了下面的代码
Pojo结构
class Parent {
..
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private List<Child> childs;
..
}
class Child {
..
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentId")
private Parent parent;
..
}
像这样获取数据
` em = EMF.get().createEntityManager();
Query q = em.createQuery("Select p from Parent p", Parent.class);
List<Parent> parents = q.getResultList();
// Till this point all looks good but when the code gets executed
parent.getChilds();
`
它正在获取这样的数据:
Parent
child1
Parent
child2
Parent
child2
Parent
..
..
child2
..
我不需要我只想要这样的数据:
Parent1
child1
child2
Parent2
child1
child2
child3
答案 0 :(得分:3)
虽然FetchType.EAGER
是合同,但FetchType.LAZY
只是提示,因为延迟提取并非总是可行。这可能取决于例如您使用的JPA提供程序及其配置。对于一对一的关系,延迟提取尤其成问题。
如果每个Child
都有Parent
,请尝试将optional=false
添加到@ManyToOne
。此可能启用延迟抓取。
由于Parent
实体已加载到持久性上下文中,因此填充Children.parent
不应触发对数据库的查询。你真的看到正在执行查询吗?你怎么知道Children.parent
被加载了?如果您正在访问该值以检查该事实,那么您实际上可能实际上是在触发按需加载。
答案 1 :(得分:0)
它将用作大量数据的无限循环。最佳实践是在子类列中提及@JsonIgnore。 稍后谢谢我
答案 2 :(得分:0)
为避免此问题,请在下面的注释中声明“父级和子级”吸气剂方法
@JsonBackReference
public Parent getParent() {
return parent;
}
@JsonManagedReference
public List<Child> getChilds() {
return childs;
}
答案 3 :(得分:0)
为了避免循环引用的这个问题,我使用了 Mapper 和 MapStruct(请参阅 official documentation 以获取快速设置):
然后我可以轻松地编写一个映射器来忽略这样的属性:
public interface SecondaryObjectMapper {
@Mapping(target = "primaryObject.secondaries", ignore=true),
SecondaryObjectDto toSecondaryObjectDto(SecondaryObject source);
}
并像这样使用它,例如:
repository.findAll(pageable).map(secondaryObjectMapper::toSecondaryObjectDto)