>Java >java지도 시간 >## FetchType.EAGER를 사용한 최대 절전 모드 기준으로 인해 중복 주문 개체가 발생하는 이유는 무엇입니까?

## FetchType.EAGER를 사용한 최대 절전 모드 기준으로 인해 중복 주문 개체가 발생하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-26 03:50:28589검색

## Why Does Hibernate Criteria with FetchType.EAGER Result in Duplicate Order Objects?

Hibernate 기준이 FetchType.EAGER를 사용하여 여러 반복 주문을 반환합니다

문제:

사용 시 일대다 관계에 대한 FetchType.EAGER를 사용하는 Hibernate 기준, 결과 목록에는 동일한 Order 객체의 여러 복사본이 포함됩니다.

원본 코드:

<code class="java">public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}</code>

FetchType.EAGER로 수정된 코드:

<code class="java">public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}</code>

질문:

FetchType.EAGER로 수정된 코드가 여러 결과를 초래하는 이유는 무엇입니까? Order 개체의 복사본이 있습니까?

답변:

이 동작은 Eager 가져오기를 활성화할 때 예상됩니다. Order 테이블과 OrderTransaction 테이블 사이에 조인이 수행되어 일반 SQL 조인과 동일한 행 수가 생성됩니다. 따라서 각 Order 객체는 관련 OrderTransaction 레코드 수에 따라 여러 번 나타납니다.

설명:

FetchType.EAGER로 데이터를 가져올 때 외부 조인이 사용됩니다. . 즉, 주문에 관련 OrderTransaction 레코드가 없더라도 결과 집합에는 계속 포함됩니다. 결과는 Order 개체 목록이며, 각 개체는 잠재적으로 여러 OrderTransaction 개체와 연결됩니다.

해결책:

Order 개체의 여러 복사본을 방지하려면 집합 사용을 고려하세요. 중복을 방지하기 위해 목록 대신. 또는 반환할 고유 Order 개체를 명시적으로 지정하는 Criteria 쿼리에서 DistinctRootEntity를 사용합니다.

예:

<code class="java">Criteria criteria = getHibernateSession()
        .createCriteria(Order.class)
        .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
        .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));</code>

위 내용은 ## FetchType.EAGER를 사용한 최대 절전 모드 기준으로 인해 중복 주문 개체가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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