Почему @Transactional игнорирует Lazy fetch в некоторых случаях - PullRequest
2 голосов
/ 06 июля 2019

(я проверил вопросы для этой области - они не задают то же самое).

У меня есть стандартный класс 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 игнорируется?

...