(我检查了该区域的问题-他们问的不一样)。
我在'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查询。
在第一种情况下,为什么懒惰提取被忽略?