繁体   English   中英

Spring 引导中的 PersistenceContext 生命周期

[英]PersistenceContext lifecycle in Spring Boot

我试图理解 Spring 引导应用程序中的持久性上下文如何工作。 我使用 Spring 数据、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应该比事务更有效并且应该导致正在使用ExtendedEntityManagerInvocationHandler 所以我试图通过调试来证明它,我发现了以下内容。

  1. PersistenceContextType.EXTENDED没有在任何地方进行评估。 PersistenceAnnotationBeanPostProcessor.java中有一些用法,但是在我的集成测试中断点从未停止过。

  2. 有时SharedEntityManagerInvocationHandler#invoke有时是ExtendedEntityManagerInvocationHandler#invoke被调用,这并没有告诉我它使用什么样的EntityManager

  3. 在某些情况下,我什至发现SharedEntityManagerInvocationHandler包装了ExtendedEntityManagerInvocationHandler

问题是 - 如何确定PersistenceContext是否在事务结束时关闭?

PersistenceContextType.EXTENDED没有在任何地方进行评估。 PersistenceAnnotationBeanPostProcessor.java中有一些用法,但是在我的集成测试中断点从未停止过。

当您的任何 bean 中有以下字段声明时,您将遇到断点:

@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;

问题是 - 如何确定 PersistenceContext 是否在事务结束时关闭?

有趣的问题。 如果您仔细研究 Spring 代码,您会注意到SharedEntityManagerInvocationHandler调用EntityManagerFactoryUtils.doGetTransactionalEntityManager() 该方法为返回的EntityManager实例注册一个事务同步:

TransactionSynchronizationManager.registerSynchronization(
                                new TransactionalEntityManagerSynchronization(emHolder, emf, transactionData, false));

该同步是事务后关闭EntityManager的原因:

protected void releaseResource(EntityManagerHolder resourceHolder, EntityManagerFactory resourceKey) {
            closeEntityManager(resourceHolder.getEntityManager());
        }

您还会注意到ExtendedEntityManagerInvocationHandler没有这样的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM