为什么@Transactional在某些情况下会忽略懒惰获取

时间:2019-07-05 22:27:51

标签: java hibernate jpa transactions lazy-loading

(我检查了该区域的问题-他们问的不一样)。

我在'addresses'字段上有一个标准类 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查询,同时通过getAddresses()方法对Address和Person表之前进行初始化。我不明白为什么,因为使用 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(),那么我只能对Person表进行一个SQL查询。

如果是

@Transactional
public void testLazyLoadingTransactional() throws Exception {
    Optional<Person> person = personRepository.findById(1);  
}

然后我在控制台“ select person ...”中看到一个SQL查询。

在第一种情况下,为什么懒惰提取被忽略?

0 个答案:

没有答案