Spring JPA - 注入事务管理器与注入实体管理器

时间:2010-07-04 21:28:22

标签: spring jpa transactions

如果我想以编程方式管理事务,通过注入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 config snippet看起来像这样

 <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>

1 个答案:

答案 0 :(得分:4)

不应将交易管理员注入DAO,因为DAO无法判断他们是否是更大交易的参与者。

我认为事务管理器属于服务层,而不是持久层。这些服务了解用例和工作单元。他们协调其他服务,DAO和模型对象以完成其用例。