如果我想以编程方式管理事务,通过注入 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;
  }
}
与直接注入 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;
      }
    }
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>
事务管理器不应该被注入到 DAO 中,因为 DAO 无法判断他们是否是更大事务中的一个参与者。
我认为事务管理器属于服务层,而不是持久层。这些服务了解用例和工作单元。他们编排其他服务、DAO 和模型对象来实现他们的用例。
| 归档时间: | 
 | 
| 查看次数: | 4144 次 | 
| 最近记录: |