(я проверил вопросы для этой области - они не задают то же самое).
У меня есть стандартный класс Person с FetchType.LAZY в поле «адреса».
@Entity
public class Person {
@Id
@GeneratedValue
private int id;
private String firstName;
private String lastName;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "person_id")
private List<Address> addresses;
//...constructors, getters and setters
}
Следующий метод генерирует два SQL-запроса к таблицам Address и Person BEFORE , инициализирующих адреса методом getAddresses (). Я не понимаю почему, потому что использовать FetchType.LAZY .
@Transactional
public void testLazyLoadingTransactional() throws Exception {
Optional<Person> person = personRepository.findById(1);
System.out.println(""); //here I set a breakpoint
// here I see two SQL queries in a console
// "select person ..." and "select address ..."
if (person.isPresent()) {
System.out.println(person.get().getAddresses());
} else {
throw new NotFoundException("Person not found");
}
}
Также я выяснил, что если в теле метода я не не использую getAddresses (), то я получил только один SQL-запрос к таблице Person.
Если так
@Transactional
public void testLazyLoadingTransactional() throws Exception {
Optional<Person> person = personRepository.findById(1);
}
тогда я вижу ОДИН SQL-запрос в консоли "выберите человека ...".
Почему в первом случае Lazy fetch игнорируется?