Java Spring引导如何处理Hibernate会话?

Java Spring引导如何处理Hibernate会话?,java,hibernate,spring-boot,jpa,spring-data-jpa,Java,Hibernate,Spring Boot,Jpa,Spring Data Jpa,我看到,使用Spring引导,您不需要打开和关闭hibernate会话 但是为了理解它是如何在内部工作的,它在哪一层打开hibernate会话以及何时关闭会话 我创建了一个POC。 我有一个Spring boot应用程序,它有两个实体,一个是客户,另一个是地址,在客户和地址之间有一对多的关系 我有两个API,一个是添加记录,另一个是获取所有记录。 这些API位于CustomerEndpoint中,并用 @RestController @RequestMapping(value="/custome

我看到,使用Spring引导,您不需要打开和关闭hibernate会话

但是为了理解它是如何在内部工作的,它在哪一层打开hibernate会话以及何时关闭会话

我创建了一个POC。 我有一个Spring boot应用程序,它有两个实体,一个是
客户
,另一个是
地址
,在
客户
地址
之间有一对多的关系

我有两个API,一个是添加记录,另一个是获取所有记录。 这些API位于CustomerEndpoint中,并用

@RestController
@RequestMapping(value="/customer").
还创建了
CustomerRepository
,它扩展了
crudepository
,用于保存和获取
Customer
记录

因此,根据我的理解,在使用
CustomerRepository
内部
CustomerEndpoint
类获取客户时,当我们说
Customer.getAddress
时,类应该抛出LazyInitialization错误(因为它的获取类型是惰性的)。 但它没有抛出任何错误,它工作正常

我想hibernate会话不在
CustomerEndpoint
类中

谁能帮助我如何通过Spring boot维护这个Hibernate会话


因为每个人都认为这是另一个问题的重复,但我的问题并不是他们解释的重点,因为根据他们的说法,会话在存储库之前是有效的,所以根据这一点,我应该在CustomerEndpoint内说customer.getAddress时得到LazyInitialization异常,因为它不是存储库,但我没有得到任何异常

我认为,如果您的客户.getAddress在交易中,它仍然有效

我认为,如果您的客户.getAddress在事务中,它仍然有效。首先,在您的
表示层中使用
存储库层
不是一个好的做法

OSIV(视图中的开放会话)在Spring Boot中默认启用,OSIV从性能和可伸缩性的角度来看确实是个坏主意

因此,您不会遇到异常,也无法在表示层中工作。 通过将以下内容放入application.properties文件进行检查

spring.jpa.open-in-view=false

您可以参考更多详细信息

首先,在
表示层
中使用
存储库层
不是一个好做法

OSIV(视图中的开放会话)在Spring Boot中默认启用,OSIV从性能和可伸缩性的角度来看确实是个坏主意

因此,您不会遇到异常,也无法在表示层中工作。 通过将以下内容放入application.properties文件进行检查

spring.jpa.open-in-view=false

您可以参考更多详细信息

可能您正在寻找答案:@deepakkhille的可能副本我已经读过那篇文章,但他们无法回答我的问题,即如果会话在存储库级别,那么我如何能够获取CustomerEndpoint内的惰性初始化地址实体,为什么我没有得到LazyInitialization Exception为实体添加源代码(如果使用了注释)。尽管你认为它是延迟加载的,但它可能已经急切地加载了。可能你正在寻找这个答案:@deepakkhille的可能副本我已经看过了那篇文章,但他们无法回答我的问题,即如果会话在存储库级别,那么我如何能够获取里面的延迟初始化地址实体CustomerEndpoint,为什么我没有得到LazyInitialization,除了为实体添加源代码(如果使用了注释)。尽管您认为它是延迟加载的,但它可能已经急切地加载了。因此,我如何知道它是否在事务中,因为我没有明确添加任何事务注释,并且根据上面共享的链接,他们解释说会话在存储库之前是有效的,但我在CustomerEndpoint类中。所以根据那篇文章,我应该得到LazyInitialization异常。那么我如何知道它是否在事务中,因为我没有明确添加任何事务注释,并且根据上面共享的链接,他们解释说会话在存储库之前是有效的,但我在CustomerEndpoint类中。所以根据那个帖子,我应该得到LazyInitialization异常。谢谢,这是正确的,这就是我要找的。如果我错了,请纠正我,因此在spring boot中,如果此标志为false,则hibernate会话仅在存储库中打开,无论您将@Transactional放在何处。哪种做法?使用spring.jpa.open in view=true还是将@Transactional放在哪里?是的,现在我明白了,谢谢Hanks,这是正确的,这就是我正在寻找的。如果我错了,请纠正我,因此在spring boot中,如果此标志为false,则hibernate会话仅在存储库中打开,无论您将@Transactional放在哪里,都不会打开。哪种做法?使用spring.jpa.open in view=true还是将@Transactional放在哪里?是的,现在我明白了,谢谢