Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot中的PersistenceContext生命周期_Java_Spring Boot_Hibernate_Jpa_Hikaricp - Fatal编程技术网

Java Spring Boot中的PersistenceContext生命周期

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

我试图弄清楚Spring Boot应用程序中的持久性上下文是如何工作的。我使用Spring数据、Hibernate和Hikari

我不知道什么时候创建了
PersistenceContext
,什么时候关闭了它。根据几篇文章,例如这篇或这篇,
PersistenceContext
生命周期与
EntityManager
生命周期相同。所以我想知道,
EntityManager
实际上是什么时候创建的,更重要的是它何时关闭,最重要的是它是否在事务结束时关闭。根据我的发现,枚举
PersistenceContextType.java
决定了我将拥有什么
PersistenceContext
PersistenceContextType.TRANSACTION
应该是默认的,应该导致
SharedEntityManager职业处理程序
被用作
EntityManager
的实现,并且应该在事务结束时关闭,而
PersistenceContextType.EXTENDED
应该比事务更有效,并且应该导致使用
extendedEntityManager职业处理程序。所以我试图通过调试来证明这一点,我发现了以下几点

  • PersistenceContextType.EXTENDED
    未在任何位置求值。在
    PersistenceAnnotationBeanPostProcessor.java中有一些用法,但在我的集成测试中断点从未停止过

  • 有时调用
    SharedEntityManager职业处理程序#invoke
    ,有时调用
    ExtendedEntityManager职业处理程序#invoke
    ,这并不能告诉我它使用的是哪种
    EntityManager

  • 在某些情况下,我甚至发现了
    SharedEntityManager职业处理程序
    wrapping
    ExtendedEntityManager职业处理程序

  • 问题是-如何确定
    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职业处理程序
    不做这样的事情