簡體   English   中英

Spring JPA - 注入事務管理器與注入實體管理器

[英]Spring JPA - Injecting transaction manager vs injecting entity manager

如果我想以編程方式管理事務,通過注入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;
      }
    }

彈簧配置片段看起來像這樣

 <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和模型對象以完成其用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM