spring数据jpa是否为每个事务创建了EntityManager的新实例?

时间:2018-04-19 14:32:14

标签: jpa transactions spring-data-jpa entitymanager spring-transactions

我无法在spring data jpa应用程序中找到有关EntityManager与事务之间关系的信息。

哪一项陈述是正确的:

  1. 每个事务创建新的EntityManager实例
  2. EntityManager的一个共享实例用于所有事务

1 个答案:

答案 0 :(得分:0)

正确答案是: EntityManager的一个共享实例用于同一持久化上下文中的所有事务

我们可以在这里考虑两件事:

首先,EntityManager接口中的definition

  

EntityManager实例与持久性上下文相关联。持久化上下文是一组实体实例,其中对于任何持久性实体标识,存在唯一的实体实例。在持久化上下文中,管理实体实例及其生命周期。

     

可由给定EntityManager实例管理的实体集由持久性单元定义。持久性单元定义了由应用程序关联或分组的所有类的集合,并且必须在映射到单个数据库时将其共同定位。

其次,Spring SimpleJpaRepository的构造函数:

public SimpleJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {


    Assert.notNull(entityInformation, "JpaEntityInformation must not be null!");
    Assert.notNull(entityManager, "EntityManager must not be null!");


    this.entityInformation = entityInformation;
    this.em = entityManager;
    this.provider = PersistenceProvider.fromEntityManager(entityManager);
}

em是使用final修饰符在该类中定义的属性:

private final EntityManager em;

SimpleJpaRepository的方法中调用em而不创建EntityManager的新实例。