@OneToMany의 Default Fetch 전략 : Lazy
@ManyToOne의 Default Fetch 전략 : Eager
@OneToMany
@Getter @Setter
@Entity
public class Account {
@Id @GeneratedValue
private Long id;
@Column(nullable=false, unique=true)
private String username;
private String password;
@OneToMany(mappedBy = "owner", fetch = FetchType.EAGER) //DEFAULT: LAZY
private Set<Study> studies = new HashSet<>();
}
Account result = entityManager.find(Account.class, 1L);
위 코드가 실행 시 id가 1인 Account를 가져오게 되는데, Fetch 전략에 따라 SQL 쿼리가 달라진다.
FetchType.LAZY
// Account 테이블에서 Account 가져옴.
select
account0_.id as id1_0_0_,
account0_.password as password2_0_0_,
account0_.username as username3_0_0_
from
account account0_
where
account0_.id=?
// 위의 계정에 맞는 STUDY 가져오는 쿼리
select
studies0_.owner_id as owner_id3_1_0_,
studies0_.id as id1_1_0_,
studies0_.id as id1_1_1_,
studies0_.name as name2_1_1_,
studies0_.owner_id as owner_id3_1_1_
from
study studies0_
where
studies0_.owner_id=?
FetchType.EAGER
// 조인해서 한번에 가져옴
select
account0_.id as id1_0_0_,
account0_.password as password2_0_0_,
account0_.username as username3_0_0_,
studies1_.owner_id as owner_id3_1_1_,
studies1_.id as id1_1_1_,
studies1_.id as id1_1_2_,
studies1_.name as name2_1_2_,
studies1_.owner_id as owner_id3_1_2_
from
account account0_
left outer join
study studies1_
on account0_.id=studies1_.owner_id
where
account0_.id=?
近期评论