2016-08-18 5 views
0
  1. FetchType.EAGER을 기권해야하는 경우 몇 가지 규칙이 있습니까?JPA : 언제 eager fetching하면 StackOverflowError가 발생합니까?

  2. JPA 프레임 워크 중 일부 (예 : 최대 절전 모드)가 주기적 종속성을 해결해야한다고 들었습니다.

    • 프레임 워크에서 릴레이하는 것이 위험 할 때 어떤 조언이 있습니까?
    • FetchType.EAGER과 함께 StackOverflowError을 수행하면 항상 프레임 워크에서 버그가 발생합니다 (두 개의 테이블에 3 개의 행이있는 경우). FetchType.EAGER을 피하기 위해
+1

모든 JPA 제공 업체는 주기적 관계를 열심히로드 할 수 있어야합니다. 어떤 문제라도 JPA 공급자에 대한 버그를 제기해야합니다. –

+0

@ NeeStockStock, 감사합니다! 여기에 귀하의 답변을 참조 : http://stackoverflow.com/a/39015294/3014866 –

답변

1

하나의 이유는 항상 열망 (JOIN FETCH과) JPQL에서 수동으로 가져 오는 사용할 수 있습니다,하지만 당신은 FetchType.EAGER을 설정 한 경우 lazy 페칭을 사용하지 수 있다는 것입니다. EAGER

1

: 편리한

  • 하지만 느린

  • 사용하여 부모 클래스는 항상 연관 클래스를 필요로 할 때 열망.

LAZY는 :

  • 더 코딩,하지만 훨씬 더 효율적

  • 기본적으로 게으른 로딩은 더 열망 대안에 비해 혜택 (성능, 자원의 사용)가 있습니다. 특정 문제가 발생하지 않는 한 일반적으로 eager fetching을 위해 구성하지 않아야합니다.

  • 당신이 확신하는 경우 - 도메인 인스턴스를 공유

    • . (예 : 사용자로 HTTP 세션 범위에 도메인 클래스 인스턴스를 넣어 그것에서 속성을 액세스 할 때 예를 들어) 다른 최대 절전 모드 세션을 건너 인스턴스가 페치 될 때마다 (또는 대부분의 시간에) 특정 관계 속성에 액세스 할 것이므로 eager fetching에 대해이 관계를 구성하는 것이 좋습니다.

예 : 관계 사람과 난 사람 개체를로드 할 때 난 당신이 게으른 유지할 수 있도록 모든 시간을 주소 가져 오기 위해 필요, 여기에 그 필요하지를 주소.

결론

열망 가져 오는 전략은 코드 냄새입니다. 가장 자주 그것은 장기적인 성능 벌칙을 고려하지 않고 단순함을 위해 사용됩니다. 가져 오기 전략은 엔티티 매핑 책임이 될 수 없습니다. 각 비즈니스 유스 케이스는 서로 다른 엔티티로드 요구 사항을 가지므로 페칭 전략을 각 개별 쿼리에 위임해야합니다. 글로벌 페치 계획은 쿼리 단위로 가져 오는 LAZY 연결 만 정의해야합니다. 항상 생성 된 쿼리 생성 전략과 함께 쿼리 기반 페치 계획은 애플리케이션 성능을 향상시키고 비용을 절감 할 수 있습니다.

+0

답변 주셔서 감사합니다, upvoited! 그러나 질문은'StackOverflowError'에 관한 것입니다. 너는 그걸 언급하지 않았어. –

+0

여기에서 답을 참조하십시오 : http://stackoverflow.com/a/39015294/3014866 –

+0

ok thanx buddy .. – Gokul

관련 문제