반응형
지연 로딩으로 설정된 필드는 실제로 사용되는 시점에 로딩되는데, 영속성 컨텍스트에서 관리되지 않는 영역에서 사용될 때는 지연 로딩을 할 수 없기 때문에 LazyInitializationException 예외가 발생하는 것이다.
즉, 트랜잭션 영역 안에서 지연 로딩이 이루어지도록 하면 이 예외는 발생하지 않을 것이다.
Hibernate.initialize() 메소드를 사용하면 지연 로딩으로 설정된 필드값을 강제로 로딩시킬 수 있다.
User 엔티티에 있는 progress 필드를 강제 로딩 시킨다고 해보자.
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 생성을 데이터베이스에 위임
private long id;
...
@Column(name="progress")
@ElementCollection(targetClass=Boolean.class)
private List<Boolean> progress;
...
}
그럼 아래와 같이 progress 필드를 로딩할 수 있다.
@Service
@Transactional("userTransactionManager")
public class EagerService {
@Autowired
UserRepository userRepository;
public User getUserWithEagerProgress(String userId) {
User user = userRepository.findByUserId(userId).get(0);
Hibernate.initialize(user.getProgress());
return user;
}
}
반응형
'Spring 사전 준비 > JPA Hibernate' 카테고리의 다른 글
[JPA] 2차 캐시 (0) | 2022.08.30 |
---|---|
[JPA] 트랜잭션과 Lock (0) | 2022.08.29 |
[JPA] 성능 최적화 (0) | 2022.08.27 |
[JPA] JPA 예외 처리 (0) | 2022.08.25 |
[JPA] 엔티티 그래프 (0) | 2022.08.25 |
댓글