2017-05-24 74 views
4

我正面临一个问题,即数据正在递归调整。我想避免孩子获取父母的数据。这是造成递归问题。 我已经提到下面跳过孩子获取父级 - JPA

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

默认情况下,默认的获取模式是懒惰的 – soorapadman

+0

@soorapadman默认情况下,获取对于多对象是懒惰的,并且渴望对一个关系 – crizzis

+0

什么提供者? OneToOne/ManyToOne的延迟获取是提供程序特定的,可能需要更多取决于您的环境的内容。例如,EclipseLink需要编织https://www.eclipse.org/eclipselink/documentation/2.5/concepts/app_dev007.htm – Chris

回答

3

虽然FetchType.EAGER是合同一个FetchType.LAZY只是提示,因为懒抓取是不可能的。这可能取决于例如在您使用的JPA提供程序上以及在其配置上。对于一对一的关系,懒惰抓取尤其成问题。

如果每个Child都有Parent,请尝试将optional=false添加到@ManyToOne。这可能启用延迟抓取。

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

+0

如果每个孩子都有父母,请尝试向@ManyToOne添加optional = false。这可能会启用延迟抓取。 它没有工作 你怎么知道Children.parent正在被加载? 我需要执行parent.getChilds();当我这样做时,我可以看到父对象,并且在这个父对象中有一个子对象。 您可以通过以下网址查看:https://drive.google.com/file/d/0B_A6oOU92Jt8M2pGZlpaQ3RuQTA/view?usp=sharing – AShk

+0

好的。正如我所说的,这不是一个性能问题,因为'Parent'实体已经存在于持久化上下文中,所以儿童的'Parent'查找不会触及数据库。如果你想延迟加载,你是否在Java SE或Java EE中使用JPA?对于惰性加载以使用一对一关系,您需要启用编织(请参阅:http://www.eclipse.org/eclipselink/documentation/2.6/concepts/mappingintro002.htm#CEGCJEHD以及其上方的段落) – crizzis

+0

我们正在使用Java EE和EclipseLink版本:Eclipse持久性服务 - 2.0.2.v20100323-r6872。 是的,它不是一个性能,但应用程序越来越挂。 原因是,因为它是一个双向关系,当我们取得孩子时,它也获取了父母,并再次设置孩子有一个父母在里面。 这是由于循环值导致服务器挂起。 – AShk