1. @Transactional
LazyInitializationException
이 발생하는 주요 원인은 JPA에서 관리하는 세션이 종료 된 후(정확하게는 persistence context가 종료 된 후) 관계가 설정된 엔티티를 참조하려고 할 때 발생.
- 이것에서 착안해
DAO레이어(Spring data에서 Repository)
상위에서 세션을 시작해 DAO 계층 밖에서도 세션이 종료되지 않도록 트랜잭션을 거는 방법.
2. @EntityGraph
EntityGraph
어노테이션 사용.
- 간단하고 쉬움.
@Entity
public class User {
@Id
...
@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders;
}
...
public interface UserRepository extends JpaRepository<User, Long> {
// 불러올 데이터의 변수명을 설정해준다. 배열로 한번에 여러 값을 설정 할 수 있다.
@EntityGraph(attributePaths = { "orders" })
Optional<List<User>> fetchUsers();
}
...
public List<User> getUsers {
var user = this.userRepository.findByUsername(username);
// @EntityGraph 없다면 orders를 불러 올 수 없어 LazyInitializationException 이 발생한다.
var orders = users.getOrders();
...
return users;
}