Spring Boot如何处理休眠会话?

时间:2019-05-14 09:28:30

标签: java hibernate spring-boot jpa spring-data-jpa

我发现使用Spring Boot不需要打开和关闭休眠会话。

但是出于理解的目的,它是如何在内部工作的,它在哪一层打开了休眠会话,什么时候关闭了。

我创建了一个POC。 我有一个Spring Boot应用程序,它有两个实体,一个是Customer,另一个是Address,并且CustomerAddress之间存在一对多的关系。

我有两个Apis,一个正在添加记录,另一个正在获取所有记录。 这些APis在CustomerEndpoint中,并带有

注释。
@RestController
@RequestMapping(value="/customer").

并还创建了CustomerRepository,它扩展了CrudRepository,用于保存和提取Customer记录。

根据我的理解,在我们CustomerRepository(因为其提取类型为LAZY)中使用CustomerEndpoint类内的customer.getAddress获取客户时,应该引发LazyInitialization错误。 但是它没有引发任何错误,它工作正常。

我原以为CustomerEndpoint类中没有休眠会话。

有人可以帮助我如何通过Spring Boot维护此Hibernate会话吗?

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

2 个答案:

答案 0 :(得分:2)

首先,在Repository layer中使用Presentation layer不是一个好习惯。

在Spring Boot中默认启用

OSIV (在视图中打开会话),从性能和可伸缩性的角度来看, OSIV 的确不是一个好主意。

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

spring.jpa.open-in-view=false

您可以参考OSIV AntiPattern了解更多详情

答案 1 :(得分:0)

我认为,如果您的 customer.getAddress 位于交易之内,它仍然有效