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

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

При lazy-инициализации коллекции emails вне транзакции возникнет LazyInitializationException. Решения: 1. **Fetch Join в запросе**: ```java @Query("SELECT u FROM User u LEFT JOIN FETCH u.emails WHERE u.id = :id") User findByIdWithEmails(Long id); ``` 2. **@EntityGraph**: ```java @EntityGraph(attributePaths = "emails") User findById(Long id); ``` 3. **Изменить fetch type на EAGER** (не рекомендуется): ```java @OneToMany(fetch = FetchType.EAGER) private List emails; ``` 4. **Инициализировать коллекцию в транзакции**: ```java @Transactional public User getUserWithEmails(Long id) { User user = userRepository.findById(id); user.getEmails().size(); // force initialization return user; } ``` Лучший подход - первый или второй, так как они загружают данные одним запросом. EAGER может вызвать N+1 проблему.
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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