2017-05-24 72 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