>  기사  >  Java  >  FetchType.EAGER를 사용할 때 Hibernate 기준이 여러 하위 복사본을 반환하는 이유는 무엇입니까?

FetchType.EAGER를 사용할 때 Hibernate 기준이 여러 하위 복사본을 반환하는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-27 04:29:29412검색

Why Does Hibernate Criteria Return Multiple Copies of Children When Using FetchType.EAGER?

Hibernate 기준은 FetchType.EAGER를 사용하여 하위 항목의 여러 복사본을 반환합니다.

다음과 같이 Hibernate에서 일대다 관계를 매핑할 때 OrderTransactions 목록이 있는 Order 클래스에서는 FetchType.EAGER 설정을 사용하여 상위 항목을 초기화하는 동안 하위 항목을 적극적으로 가져오는 것이 일반적입니다. 그러나 이 설정을 Hibernate Criteria와 함께 사용할 때 이상한 현상이 발생합니다.

Query Results Repeat Orders

다음 시나리오를 고려하십시오. Order 클래스는 다음 목록으로 정의됩니다. OrderTransactions 및 Criteria 쿼리는 orderStatus를 기준으로 주문을 필터링하는 데 사용됩니다. 기본 FetchType.LAZY 설정을 사용하면 결과 목록에 예상대로 고유한 Order 인스턴스가 포함됩니다. 그러나 OrderTransaction 매핑에 대해 FetchType.EAGER를 설정하면 Order 인스턴스가 결과에 여러 번 나타나기 시작합니다.

FetchType.EAGER에서 예상되는 동작

FetchType.EAGER를 사용한 반복 주문은 예상치 못한 것처럼 보일 수 있으며 이는 기본 SQL 동작과 일치합니다. FetchType.EAGER로 인해 발생하는 외부 조인이 수행되면 결과 집합에는 상위 및 하위 엔터티의 모든 잠재적 조합이 포함되므로 여러 하위 엔터티가 존재할 때 상위 인스턴스가 중복됩니다.

해결 방법

FetchType.EAGER를 사용해도 고유한 Order 결과를 얻기 위해 Hibernate는 해결 방법을 제공합니다.

<code class="java">Collection result = new LinkedHashSet(session.createCriteria(...).list());</code>

이 코드 조각은 LinkedHashSet을 사용하여 중복된 Order 참조를 필터링하여 결과가 목록에는 고유한 Order 인스턴스만 포함됩니다.

또는 조인 가져오기를 완전히 방지하고 지연 로딩을 유지하는 것이 목표라면 FetchType 설정을 FetchType.LAZY로 다시 되돌리면 됩니다.

위 내용은 FetchType.EAGER를 사용할 때 Hibernate 기준이 여러 하위 복사본을 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.