【问题标题】:What is the difference between Transaction manager and Entity Manager事务管理器和实体管理器有什么区别
【发布时间】:2015-01-18 22:06:05
【问题描述】:
作为一名学生,我几乎阅读了所有 Spring 文档。据我了解,弹簧是配置怪物。基于注释或基于 Xml,没关系,但我真正不明白的是事务管理器和实体管理器之间的区别。
如果我们在 Dao 层注入了 entityManager,为什么我们需要在 service 层注入事务管理器,反之亦然。如果我们注入事务管理器(包装实体管理器)为什么我们需要在 DaoLayer 上注入实体管理器。对于 JPARepositories,我什至不需要注入任何管理器。 Spring 为我做了一切(我不太了解力学)。我的另一个问题是 JPARepositories Spring 使用 entityManager 还是 transactionManager?
【问题讨论】:
标签:
java
spring
jpa
spring-data
【解决方案1】:
TransactionManager 与 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 接口允许应用服务器代表被管理的应用程序控制事务边界,该接口包含许多用于控制它们的方法,例如:提交、挂起、回滚。
所以基本上注入这些对象之一取决于您要查找的内容,管理实体并使用它们操作实体管理器,使用事务管理器自己控制应用程序的事务状态。
【解决方案2】:
将域类映射为实体与事务管理不同。 EntityManager 有助于创建关系 b/w 域对象,并有助于在 DAO 层中使用最少的代码创建标准,而事务管理通过根据业务需求设置不同的事务传播来帮助您管理事务。