CodeGym/Java Course/All lectures for KO purposes/컬렉션 매핑 시 지연 로드

컬렉션 매핑 시 지연 로드

사용 가능

2.1 가져오기 옵션

Hibernate의 개발자들은 오랫동안 자식 엔터티를 로드하는 문제에 대해 알고 있었습니다. 그래서 그들이 한 첫 번째 일은 주석에 특별한 가져오기@OneToMany 매개변수를 추가하는 것이었습니다 .@ManyToMany

이 매개변수는 두 가지 값을 가질 수 있습니다.

  • 열렬한
  • 게으른

예:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")

가져오기 매개변수가 EAGER 와 같으면 상위 엔티티가 로드될 때 모든 하위 엔티티도 로드됩니다. 또한 Hibernate는 하나의 SQL 쿼리에서 이를 수행하려고 시도하여 많은 쿼리를 생성하고 모든 데이터를 한 번에 가져옵니다.

가져오기 매개 변수가 LAZY 값을 사용하면 상위 엔티티가 로드될 때 하위 엔티티가 로드되지 않습니다. 대신 프록시 객체가 생성됩니다.

이 프록시 개체의 도움으로 Hibernate는 이 하위 엔터티에 대한 액세스를 추적하고 처음 액세스할 때 메모리에 로드합니다.

댓글로 상황을 회상하면 다음과 같습니다.

@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
   @JoinColumn(name = "user_id")
   public List<Comment> comments;
}

그런 다음 "세련된 선택"이 있습니다.

이면 fetch = FetchType.EAGERHibernate는 코드의 첫 번째 줄에 모든 주석을 로드합니다.

User user = session.get(User.class, 1);		//load all comments here
List<Comment> comments = user.getComments();

이면 fetch = FetchType.LAZYHibernate는 코드의 두 번째 줄에 모든 주석을 로드합니다.

User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here

이미 짐작할 수 있듯이 모든 댓글을 로드하지 않으면 옵션이 없습니다. :)

2.2 기본값

... 주석 에 대한 가져오기 옵션을 지정하지 않으면 @ManyToHibernate는 기본값을 사용합니다.

주석 유형에 따라 약간 다릅니다. 주석의 경우 @OneToOneand @ManyToOne는 EAGER이고 주석의 경우 @OneToManyand @ManyToMany는 LAZY입니다. 기억하기 쉽습니다. 하나의 객체를 참조하면 완전히 로드됩니다. 컬렉션을 참조하면 처음 액세스할 때 로드됩니다.

2.3 @LazyCollection 주석

이미 본 것처럼 가져오기 매개변수는 컬렉션 작업에 큰 도움이 되지 않습니다. Hibernate의 제작자는 특수 주석을 추가하여 이 문제를 해결하려고 했습니다 @LazyCollection. 일반적으로 다음과 같이 작성됩니다.

@LazyCollection(LazyCollectionOption.TRUE)

컬렉션 필드를 매핑할 때 지정해야 합니다.

@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.TRUE)
   public List<Comment> comments;
}

이 주석에는 다음 세 가지 값 중 하나를 사용할 수 있는 값 매개변수가 있습니다.

  • LazyCollectionOption. 진실
  • LazyCollectionOption. 거짓
  • LazyCollectionOption. 추가의

처음 두 옵션은 가져오기 옵션과 매우 유사합니다.

매개변수를 로 설정하면 상위 사용자 개체가 로드될 때 LazyCollectionOption.TRUE주석 필드의 값이 데이터베이스에서 로드 되지 않음 을 의미합니다. 주석 유형의 개체는 주석 필드에 처음 액세스할 때 로드됩니다. 실제로 이것은 매개변수와 동일합니다.FetchType.LAZY

매개변수를 로 설정하면 LazyCollectionOption.FALSE주석 필드의 값이 상위 사용자 개체를 로드할 때 데이터베이스에서 로드 됨을 의미합니다. 주석 유형의 개체는 주석 필드에 처음 액세스할 때 로드됩니다. 사실 이것은 FetchType.EAGER.

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다