如果我想以编程方式管理事务,通过注入 PlatformTransactionManager 启动事务与直接注入 EntityMangerFactory/EntityManager 和从 Entitymanager 获取事务之间有什么区别
public class MyDAO {
@PersistenceContext(unitName="test") EntityManager em;
JpaTransactionManager txnManager = null;
public void setTxnManager(JpaTransactionManager mgr) {
txnManager = mgr;
}
public void process(Request request) throws Exception {
TransactionStatus status =
txnManager.getTransaction(new DefaultTransactionDefinition());
try {
em.persist(request);
txnManager.commit(status);
} catch (Exception up) {
txnManager.rollback(status);
throw up;
}
}
Run Code Online (Sandbox Code Playgroud)
与直接注入 EntityManager 一样
public class MyDAO {
@PersistenceContext(unitName="test")
EntityManager em;
public void process(Request request) throws Exception {
EntityTransaction txn = em.getTransaction();
try {
em.persist(request);
txn.commit();
} catch (Exception up) {
txn.rollback();
throw up;
}
}
Run Code Online (Sandbox Code Playgroud)
spring 配置片段看起来像这样
<beans>
<bean id="MyDAO" class="com.xyz.app.dao.MyDAO">
<context:annotation-config />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerE ntityManagerFactoryBean">
<property name="persistenceUnitName" value="persistence" />
<property name="dataSource" ref="dataSourceProvider" />
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
</bean>
<bean id="transactionManagerJpa" class="org.springframework.orm.jpa.JpaTransactionM anager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
</beans>
Run Code Online (Sandbox Code Playgroud)
事务管理器不应该被注入到 DAO 中,因为 DAO 无法判断他们是否是更大事务中的一个参与者。
我认为事务管理器属于服务层,而不是持久层。这些服务了解用例和工作单元。他们编排其他服务、DAO 和模型对象来实现他们的用例。
| 归档时间: |
|
| 查看次数: |
4144 次 |
| 最近记录: |