2017-05-24 1 views
4

데이터가 재귀 적으로 발생하는 문제가 있습니다. 아이가 부모 데이터를 가져 오지 않도록하고 싶었습니다. 어떤 재귀 문제가 발생합니다. 내가 그나마부모 - JPA 가져 오기를 건너 뛰기

Parent 
child1 
    Parent 
     child2 
      Parent 
       child2 
        Parent 
       .. 
     .. 
child2 
.. 

: 나는이

` 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(); 
` 

그것은이 같은 데이터를 가져 오는 것처럼 데이터를 가져 오기

뽀조 구조

class Parent { 
    .. 
    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) 
    private List<Child> childs; 

    .. 
    } 

class Child { 
    .. 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "parentId") 
    private Parent parent; 
    .. 
    } 

아래의 코드를 언급 한 필요한 데이터는 다음과 같습니다.

FetchType.EAGER 동안
Parent1 
    child1 
    child2 
Parent2 
    child1 
    child2 
    child3 
+0

기본적으로 기본 가져 오기 모드는 기본적으로 느슨한 – soorapadman

+0

입니다. @soorapadman은 대다수의 경우 페치가 지연되고 일대일 관계가 열망하는 경우 – crizzis

+0

어떤 공급 업체입니까? OneToOne/ManyToOne의 Lazy 페칭은 공급자에 따라 다르며 환경에 따라 더 많은 것을 요구할 수 있습니다. 예를 들어, EclipseLink는 weaving을 요구합니다. https://www.eclipse.org/eclipselink/documentation/2.5/concepts/app_dev007.htm – Chris

답변

3

은 lazy 페칭이 항상 가능하지 않기 때문에 FetchType.LAZY는 단지 힌트이다하는 계약입니다. 이는 예를 들어 JPA 공급자의 구성과 함께 사용합니다. Lazy 페칭은 특히 to-one 관계에서 문제가됩니다.

ChildParent이있는 경우 @ManyToOneoptional=false을 추가하십시오. 이 게으른 인출 가능.

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' 엔티티가 이미 영속 컨텍스트에 존재하기 때문에 이것은 성능상의 문제가 아니기 때문에 아이들을위한'부모 ​​'룩업은 데이터베이스에 도달하지 않습니다. 그럼에도 불구하고 게으른 로딩을 원하면 Java SE 또는 Java EE에서 JPA를 사용하고 있습니까? 게으름 로딩이 1 대 1 관계에서 작동하려면 제직을 활성화해야합니다 (http://www.eclipse.org/eclipselink/documentation/2.6/concepts/mappingintro002.htm#CEGCJEHD 및 바로 위 단락 참조) – crizzis

+0

우리는 Java EE와 EclipseLink 버전을 가지고 있습니다 : Eclipse Persistence Services - 2.0.2.v20100323-r6872. 예 성능은 아니지만 응용 프로그램이 멈추고 있습니다. 그 이유는 자식을 가져 오는 동안 부모를 가져 오는 양방향 관계이기 때문에 그 내부에 부모가있는 자식을 다시 설정하기 때문입니다. 순환 값 때문에 서버가 중지됩니다. – AShk

관련 문제