Java 为什么@Transactional在某些情况下会忽略延迟获取

Java 为什么@Transactional在某些情况下会忽略延迟获取,java,hibernate,jpa,transactions,lazy-loading,Java,Hibernate,Jpa,Transactions,Lazy Loading,(我检查了这方面的问题——他们问的问题不一样) 我有一个在“地址”字段上具有FetchType.LAZY的标准类Person @Entity public class Person { @Id @GeneratedValue private int id; private String firstName; private String lastName; @OneToMany(fetch = FetchType.LAZY, cascade

(我检查了这方面的问题——他们问的问题不一样)

我有一个在“地址”字段上具有FetchType.LAZY的标准类Person

@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

}
@实体
公共阶层人士{
@身份证
@生成值
私有int-id;
私有字符串名;
私有字符串lastName;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name=“person\u id”)
私人名单地址;
//…构造函数、getter和setter
}
下面的方法在通过getAddresses()方法初始化地址之前,对地址表和人员表生成两个SQL查询。我不明白为什么,因为我使用FetchType.LAZY

@Transactional
public void testLazyLoadingTransactional()引发异常{
可选person=personRepository.findById(1);
System.out.println(“”;//这里我设置了一个断点
//这里我在控制台中看到两个SQL查询
//“选择人员…”和“选择地址…”
if(person.isPresent()){
System.out.println(person.get().getAddresses());
}否则{
抛出new NotFoundException(“未找到人员”);
}
}

我还发现,如果在方法体中我使用getAddresses(),那么我只得到一个对Person表的SQL查询

如果是的话

@Transactional
public void testLazyLoadingTransactional() throws Exception {
    Optional<Person> person = personRepository.findById(1);  
}
@Transactional
public void testLazyLoadingTransactional()引发异常{
可选person=personRepository.findById(1);
}
然后我在控制台中看到一个SQL查询“SelectPerson…”


为什么在第一种情况下会忽略延迟提取?

您如何知道在调用getAddresses()之前执行了查询(顺便说一句,这不是初始化集合并生成查询的原因)?发布说明实际获得的代码和输出,并发布预期结果。设置断点并在控制台中查看生成的Hibernate查询,这些查询的属性位于application.properties:logging.level.org.Hibernate.SQL=DEBUG logging.level.org.Hibernate.type.descriptor.SQL.BasicBinder=TRACEYour方法打印地址。要打印地址,需要加载地址。看到查询在日志中加载地址有什么令人惊讶的?令人惊讶的是,对地址表的SQL查询是在调用addresses进行打印之前完成的。同样,在调用getAddresses()之前,您如何知道查询是执行的?生成输出、预期输出和实际输出的后代码。
@Transactional
public void testLazyLoadingTransactional() throws Exception {
    Optional<Person> person = personRepository.findById(1);  
}