Spring JPA - Менеджер транзакций ввода против менеджера сущностей инъекции - PullRequest
1 голос
/ 05 июля 2010

Если я хотел управлять транзакциями программно, в чем разница между запуском транзакции путем внедрения 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>

1 Ответ

4 голосов
/ 05 июля 2010

Менеджеры транзакций не должны внедряться в DAO, потому что DAO не может определить, являются ли они одним участником более крупной транзакции или нет.

Я думаю, что менеджер транзакций принадлежит сервисному уровнюне персистентный слой.Службы знают о вариантах использования и единицах работы.Они управляют другими службами, DAO и модельными объектами для выполнения их сценариев использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...