4

我面临一个问题,即数据被递归提取。我想避免孩子获取父数据。这导致了递归问题。我已经提到了下面的代码

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
4

4 回答 4

3

WhileFetchType.EAGER是一个合同FetchType.LAZY只是一个提示,因为延迟获取并不总是可能的。这可能取决于例如您使用的 JPA 提供程序及其配置。延迟获取对于一对一关系尤其成问题。

如果每个Child人都有Parent,请尝试添加optional=false到您的@ManyToOne. 这可能会启用延迟获取。

由于Parent实体已加载到持久性上下文中,因此填充Children.parent不应触发对数据库的查询。你真的看到正在执行的查询吗?你怎么知道Children.parent正在加载?如果您正在访问该值以检查该事实,那么您很可能实际上是在自己触发按需加载。

于 2017-05-24T15:13:06.747 回答
1

它将作为大量数据的无限循环工作。最佳做法是在子类列中提及 @JsonIgnore。晚点再谢我

于 2020-04-19T10:27:48.763 回答
0

为了避免循环引用的这个问题,我使用了带有MapStruct的Mapper(请参阅官方文档以进行快速设置):

然后我可以轻松地编写一个映射器来忽略这样的属性:

public interface SecondaryObjectMapper {
  @Mapping(target = "primaryObject.secondaries", ignore=true),
  SecondaryObjectDto toSecondaryObjectDto(SecondaryObject source);
}

并像这样使用它,例如:

repository.findAll(pageable).map(secondaryObjectMapper::toSecondaryObjectDto)
于 2020-12-21T10:28:46.050 回答
0

为避免此问题,请在注释下方声明 Parent & Child getter 方法

   @JsonBackReference
    public Parent getParent() {
        return parent;
    }

@JsonManagedReference
    public List<Child> getChilds() {
    return childs;
    }
于 2020-06-15T13:45:02.700 回答