Встречается на собеседованиях • сегодня

Какая проблема возникнет при выполнении UserRepository.findById() и User.getEmails().forEach(), если getUsers() является @Transactional, а поле email - @OneToMany

Возможна LazyInitializationException, так как коллекция emails загружается лениво, а транзакция закрывается после выхода из метода getUsers(). При попытке доступа к emails вне транзакции возникнет ошибка.

Решение:

  1. Использовать FetchType.EAGER (не всегда оптимально)
  2. Инициализировать коллекцию в транзакции:
java
@Transactional
public User getUsers() {
    User user = userRepository.findById(id);
    user.getEmails().size(); // force initialization
    return user;
}
  1. Использовать JOIN FETCH в запросе:
java
@Query("SELECT u FROM User u LEFT JOIN FETCH u.emails WHERE u.id = :id")
User findByIdWithEmails(Long id);
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы