跳过孩子取得父母 - JPA

时间:2017-05-24 14:48:18

标签: java jpa entity-relationship fetching-strategy

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

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 个答案:

答案 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)

为了避免循环引用的这个问题,我使用了 MapperMapStruct(请参阅 official documentation 以获取快速设置):

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

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

并像这样使用它,例如:

repository.findAll(pageable).map(secondaryObjectMapper::toSecondaryObjectDto)