事务管理器和实体管理器有何区别?

17
作为一名学生,我几乎阅读了所有的Spring文档。就我所了解的而言,Spring是一个配置怪兽,基于注解或XML并不重要,但我真正不理解的是事务管理器和实体管理器之间的区别。
如果我们在Dao层中注入了entityManager,那么为什么还需要在service层注入transactionManager或反之亦然?如果我们注入了transactionManager(它包装了entityManager),为什么还需要在DaoLayer中注入entityManager?对于JPARepositories,我甚至不需要注入任何manager。Spring会为我做好一切(我真的不理解其机制)。我的另一个问题是,对于JPARepositories,Spring使用entityManager还是transactionManager?
2个回答

16

TransactionManager与EntityManager完全不同,一个负责实体(listener、实体、关系、它们的持久性生命周期)及其所属的特定持久性上下文与之交互的方法, 另一个则负责事务数据访问,并支持应用程序中所有需要进行的事务。

配置将一个EntityManager对象绑定到一个特定的TransactionManager。

<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>
这意味着连接到数据库和实体的管理是由EntityManager处理的,但是在服务层中使用@Transaction注释打开和关闭事务的对象是TransactionManager。
javax.transaction.TransactionManager接口允许应用程序服务器代表被管理的应用程序控制事务边界,该接口包含许多方法,例如:提交、挂起、回滚等,这些方法用于控制它们。
因此,基本上根据您所寻找的内容注入其中一个对象,使用entitymanager来管理实体并操作它们,使用transactionmanager自己控制应用程序的事务状态。

0

将域类映射为实体与事务管理不同。EntityManager有助于在DAO层中创建域对象之间的关系,并使用最少的代码创建条件,而事务管理则可根据业务需求设置不同的事务传播来管理事务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接