事务管理器和实体管理器之间有什么区别

Ali*_*han 8 java spring jpa spring-data

作为一名学生,我阅读了几乎所有的春季文档.据我所知,春天是配置怪物.基于注释或基于Xml,它没关系,但我真正不理解的是事务管理器和实体管理器之间的区别.

如果我们在Dao层上注入了entityManager,为什么我们需要服务层上的事务管理器,反之亦然.如果我们注入事务管理器(包装实体管理器)为什么我们需要在DaoLayer上注入entitymanager.对于JPARepositories,我甚至不需要注入任何经理.Spring为我做了一切(我真的不懂机械).我的另一个问题是JPARepositories Spring使用entityManager还是transactionManager?

Koi*_*oer 8

TransactionManager与EntityManager完全不同,一个负责实体(监听器,实体,关系,它们的持久性生命周期以及此接口定义用于与持久性上下文交互的方法)与特定持久性上下文相关联的实体是活的,同时事务管理负责事务性的数据访问,对于需要在应用程序中发生的所有交易给予支持.

配置将一个entitymanager对象绑定到特定的事务管理器.

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <qualifier value="pagTransactionManager" />
</bean>

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
    <property name="persistenceUnitName" value="persistenceUnit" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

这意味着与数据库和实体的连接由EntityManager管理,但使用@Transaction批注在服务层中打开close事务的对象是TransactionManager.

javax.transaction.TransactionManager接口允许应用程序服务器代表正在管理的应用程序控制事务边界,该接口包含许多用于控制它们的方法,例如:commit,suspend,rollback.

因此,基本上注入其中一个对象取决于您要查找的内容,管理实体并使用它们操作使用entitymanager,通过自己使用transactionmanager控制应用程序的事务状态.