수색…


EAGER 가져 오기 유형 사용 안함

Hibernate는 두 엔티티, EAGERLAZY 사이의 관계를 매핑 할 때 두 가지 유형의 가져 오기를 사용할 수 있습니다.

일반적으로 EAGER 가져 오기 유형은 JPA에이 데이터가 필요하지 않은 경우에도 항상 데이터를 가져 오도록 지시하기 때문에 좋은 생각이 아닙니다.

예를 들어 Person 엔티티가 있고 Address 와의 관계가 다음과 같은 경우 :

@Entity
public class Person {

  @OneToMany(mappedBy="address", fetch=FetchType.EAGER)
  private List<Address> addresses;

}

쿼리 언제든지 Person 의 목록 Address 이의 Person 도 반환됩니다.

따라서 엔티티를 다음과 매핑하는 대신

@ManyToMany(mappedBy="address", fetch=FetchType.EAGER)

용도:

@ManyToMany(mappedBy="address", fetch=FetchType.LAZY)

주의해야 할 또 하나의 관계는 @OneToOne@ManyToOne 입니다. 둘 다 기본적으로 EAGER입니다. 따라서 응용 프로그램의 성능에 관심이있는 경우이 유형의 관계에 대한 반입을 설정해야합니다.

@ManyToOne(fetch=FetchType.LAZY)

과:

@OneToOne(fetch=FetchType.LAZY)

상속 대신 컴포지션 사용

Hibernate는 상속 전략을 가지고있다. JOINED 상속 유형은 하위 엔티티와 상위 엔티티 사이에 JOIN을 수행합니다.

이 접근법의 문제점은 Hibernate가 상속에 관련된 모든 테이블의 데이터를 항상 가져 오는 것이다.

예를 들어 JOINED 상속 유형을 사용하는 BicycleMountainBike 엔티티가있는 경우 :

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {

}

과:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {

}

MountainBike 를 친 JPQL 쿼리는 Bicycle 데이터를 가져와 다음과 같은 SQL 쿼리를 생성합니다.

select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...

Bicycle 대한 다른 부모 (예 : Transport 과 같이)가있는 경우이 위 쿼리는이 부모로부터 데이터를 가져 와서 추가 JOIN을 수행합니다.

보시다시피, 이것은 일종의 EAGER 매핑입니다. 이 상속 전략을 사용하여 MountainBike 테이블의 데이터 만 가져올 수있는 선택권이 없습니다.

성능을위한 최선의 방법은 상속 대신 컴포지션 사용입니다.

이를 달성하기 위해 MountainBike 엔티티를 필드 bicycle 로 매핑 할 수 있습니다.

@Entity
public class MountainBike {

    @OneToOne(fetchType = FetchType.LAZY)
    private Bicycle bicycle;

}

그리고 Bicycle :

@Entity
public class Bicycle {

}

모든 쿼리는 기본적으로 MountainBike 데이터 만 가져옵니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow