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

时间:2014-11-20 21:27:11

标签: java spring jpa spring-data

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

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

2 个答案:

答案 0 :(得分:7)

TransactionManager与EntityManager完全不同,一个负责与特定持久化上下文关联的实体(侦听器,实体,关系,它们的持久性生命周期以及此接口定义用于与持久性上下文交互的方法)在实体处于活动状态的同时,TransactionManager负责事务数据访问,为您的应用程序中需要发生的所有事务提供支持。

配置将一个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>

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

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

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

答案 1 :(得分:0)

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