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.EAGER
Hibernate는 코드의 첫 번째 줄에 모든 주석을 로드합니다.
User user = session.get(User.class, 1); //load all comments here
List<Comment> comments = user.getComments();
이면 fetch = FetchType.LAZY
Hibernate는 코드의 두 번째 줄에 모든 주석을 로드합니다.
User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here
이미 짐작할 수 있듯이 모든 댓글을 로드하지 않으면 옵션이 없습니다. :)
2.2 기본값
... 주석 에 대한 가져오기 옵션을 지정하지 않으면 @ManyTo
Hibernate는 기본값을 사용합니다.
주석 유형에 따라 약간 다릅니다. 주석의 경우 @OneToOne
and @ManyToOne
는 EAGER이고 주석의 경우 @OneToMany
and @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
.
GO TO FULL VERSION