Встречается на собеседованиях • сегодня
Какие знаешь способы решения проблемы при выполнении 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 проблему.

Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
офферы быстрее!
Попробовать бесплатно
Следующий вопрос
Это единственный вопрос по вашему фильтру
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы