【发布时间】:2021-06-14 01:03:57
【问题描述】:
我试图理解 Spring Boot 应用程序中的持久性上下文是如何工作的。我使用 Spring Data、Hibernate 和 Hikari。
我不知道PersistenceContext 何时创建以及何时关闭。根据几篇文章,例如https://www.baeldung.com/jpa-hibernate-persistence-context 或https://dzone.com/articles/how-does-spring-transactional 这一PersistenceContext 生命周期与EntityManager 生命周期相同。所以我想知道,当EntityManager 实际创建时,它关闭时更重要,最重要的是它在事务结束时关闭。根据我的发现,枚举PersistenceContextType.java 决定了我将拥有什么PersistenceContext。 PersistenceContextType.TRANSACTION 应该是默认的,应该导致 SharedEntityManagerInvocationHandler 被用作 EntityManager 的实现并且应该在事务结束时关闭,而 PersistenceContextType.EXTENDED 应该比事务更有效并且应该导致 @正在使用 987654333@。所以我尝试通过调试来证明它,我发现了以下内容。
-
PersistenceContextType.EXTENDED没有在任何地方进行评估。PersistenceAnnotationBeanPostProcessor.java有一些用法,但是在我的集成测试中断点从未停止过。 -
有时会调用
SharedEntityManagerInvocationHandler#invoke,有时会调用ExtendedEntityManagerInvocationHandler#invoke,但这并不能告诉我它使用的是哪种EntityManager。 -
在某些情况下,我什至发现
SharedEntityManagerInvocationHandler包装了ExtendedEntityManagerInvocationHandler。
问题是 - 如何确定PersistenceContext 在交易结束时是否关闭?
【问题讨论】:
标签: java spring-boot hibernate jpa hikaricp