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 중국어 웹사이트의 기타 관련 기사를 참조하세요!