我发现使用Spring Boot不需要打开和关闭休眠会话。
但是出于理解的目的,它是如何在内部工作的,它在哪一层打开了休眠会话,什么时候关闭了。
我创建了一个POC。
我有一个Spring Boot应用程序,它有两个实体,一个是Customer
,另一个是Address
,并且Customer
和Address
之间存在一对多的关系。
我有两个Apis,一个正在添加记录,另一个正在获取所有记录。 这些APis在CustomerEndpoint中,并带有
注释。@RestController
@RequestMapping(value="/customer").
并还创建了CustomerRepository
,它扩展了CrudRepository
,用于保存和提取Customer
记录。
根据我的理解,在我们CustomerRepository
(因为其提取类型为LAZY)中使用CustomerEndpoint
类内的customer.getAddress
获取客户时,应该引发LazyInitialization错误。
但是它没有引发任何错误,它工作正常。
我原以为CustomerEndpoint
类中没有休眠会话。
有人可以帮助我如何通过Spring Boot维护此Hibernate会话吗?
因为每个人都认为它是另一个问题的重复,但是我的问题并不是他们的解释的重点,因为根据他们的说法,该会话在存储库之前是有效的,因此我应该在说customer.getAddress时获取LazyInitialization异常在CustomerEndpoint内部,因为它不是存储库,但是我没有收到任何异常
答案 0 :(得分:2)
首先,在Repository layer
中使用Presentation layer
不是一个好习惯。
OSIV (在视图中打开会话),从性能和可伸缩性的角度来看, OSIV 的确不是一个好主意。
因此,您没有遇到异常,无法在表示层中工作。 通过将以下内容放在application.properties文件中进行检查
spring.jpa.open-in-view=false
您可以参考OSIV AntiPattern了解更多详情
答案 1 :(得分:0)
我认为,如果您的 customer.getAddress 位于交易之内,它仍然有效