Java Spring Boot中的PersistenceContext生命周期
我试图弄清楚Spring Boot应用程序中的持久性上下文是如何工作的。我使用Spring数据、Hibernate和Hikari 我不知道什么时候创建了Java Spring Boot中的PersistenceContext生命周期,java,spring-boot,hibernate,jpa,hikaricp,Java,Spring Boot,Hibernate,Jpa,Hikaricp,我试图弄清楚Spring Boot应用程序中的持久性上下文是如何工作的。我使用Spring数据、Hibernate和Hikari 我不知道什么时候创建了PersistenceContext,什么时候关闭了它。根据几篇文章,例如这篇或这篇,PersistenceContext生命周期与EntityManager生命周期相同。所以我想知道,EntityManager实际上是什么时候创建的,更重要的是它何时关闭,最重要的是它是否在事务结束时关闭。根据我的发现,枚举PersistenceContextT
PersistenceContext
,什么时候关闭了它。根据几篇文章,例如这篇或这篇,PersistenceContext
生命周期与EntityManager
生命周期相同。所以我想知道,EntityManager
实际上是什么时候创建的,更重要的是它何时关闭,最重要的是它是否在事务结束时关闭。根据我的发现,枚举PersistenceContextType.java
决定了我将拥有什么PersistenceContext
。PersistenceContextType.TRANSACTION
应该是默认的,应该导致SharedEntityManager职业处理程序
被用作EntityManager
的实现,并且应该在事务结束时关闭,而PersistenceContextType.EXTENDED
应该比事务更有效,并且应该导致使用extendedEntityManager职业处理程序。所以我试图通过调试来证明这一点,我发现了以下几点
PersistenceContextType.EXTENDED
未在任何位置求值。在PersistenceAnnotationBeanPostProcessor.java中有一些用法,但在我的集成测试中断点从未停止过
有时调用SharedEntityManager职业处理程序#invoke
,有时调用ExtendedEntityManager职业处理程序#invoke
,这并不能告诉我它使用的是哪种EntityManager
在某些情况下,我甚至发现了SharedEntityManager职业处理程序
wrappingExtendedEntityManager职业处理程序
问题是-如何确定PersistenceContext
是否在事务结束时关闭
PersistenceContextType.EXTENDED
未在任何位置求值。在PersistenceAnnotationBeanPostProcessor.java中有一些用法,但在我的集成测试中断点从未停止过
当您在任何bean中具有以下字段声明时,将命中断点:
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
问题是-如何确定PersistenceContext是否在事务结束时关闭
有趣的问题。如果仔细研究一下Spring代码,您会注意到,SharedEntityManager职业处理程序
调用EntityManager工厂utils.doGetTransactionalEntityManager()
。该方法为返回的EntityManager
实例注册事务同步:
TransactionSynchronizationManager.registerSynchronization(
new TransactionalEntityManagerSynchronization(emHolder, emf, transactionData, false));
该同步是在事务完成后关闭EntityManager
的原因:
protected void releaseResource(EntityManagerHolder resourceHolder, EntityManagerFactory resourceKey) {
closeEntityManager(resourceHolder.getEntityManager());
}
您还将注意到,ExtendedEntityManager职业处理程序
不做这样的事情