[英]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
。 所以我试图通过调试来证明它,我发现了以下内容。
PersistenceContextType.EXTENDED
没有在任何地方进行评估。 PersistenceAnnotationBeanPostProcessor.java
中有一些用法,但是在我的集成测试中断点从未停止过。
有时SharedEntityManagerInvocationHandler#invoke
有时是ExtendedEntityManagerInvocationHandler#invoke
被调用,这并没有告诉我它使用什么样的EntityManager
。
在某些情况下,我什至发现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.