2014-12-03 2 views
2

У меня есть PlatformTransactionManager в зависимости (на самом деле JpaTransactionManager). Я могу использовать TransactionTemplate для выполнения действия в транзакции. Но я не могу понять, как я могу использовать EntityManager для использования.Получить EntityManager, используя весовое ручное управление транзакциями

@Autowired PlatformTransactionManager transactionManager; 

void doSomething() { 
    TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); 
    transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
     @Override 
     protected void doInTransactionWithoutResult(TransactionStatus status) { 
      EntityManager entityManager = ???; 
      // do work 
     } 
    }); 
} 

Вот родственная конфигурация:

@Bean 
public DataSource dataSource() { ... } 

@Bean 
public FactoryBean<EntityManagerFactory> entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); 
    entityManagerFactory.setDataSource(dataSource()); 
    ... 
    return entityManagerFactory; 
} 

@Bean 
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { 
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); 
    jpaTransactionManager.setEntityManagerFactory(entityManagerFactory); 
    return jpaTransactionManager; 
} 

ответ

2

Там есть класс называется EntityManagerFactoryUtils, где вы можете получить диспетчер сущностея текущей транзакции на основе на EntityManagerFactory, который вы настроили в своем JpaTransactionManager.

Например:

JpaTransactionManager tm = context.getBean(JpaTransactionManager.class); 
EntityManagerFactory emf = tm.getEntityManagerFactory(); 

TransactionTemplate template = new TransactionTemplate(tm); 
template.execute(status -> { 
    EntityManager em = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); 
    Department department = new Department(); 
    department.setId(15); 
    department.setName("Engineering"); 
    em.persist(department); 
    return department; 
}); 
0

Я реализовал свой собственный шаблон простой транзакции:

@Component 
public class JpaTransactionTemplate { 

    @Autowired 
    private EntityManagerFactory entityManagerFactory; 

    public void execute(Consumer<EntityManager> consumer) { 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     try { 
      EntityTransaction transaction = entityManager.getTransaction(); 
      transaction.begin(); 
      try { 
       consumer.accept(entityManager); 
       transaction.commit(); 
      } catch (RuntimeException e) { 
       try { 
        transaction.rollback(); 
       } catch (Exception rollbackException) { 
        e.addSuppressed(rollbackException); 
       } 
       throw e; 
      } 
     } finally { 
      entityManager.close(); 
     } 
    } 
} 
0

Вы можете придать ему:

@PersistenceContext 
private EntityManager entityManager; 
Смежные вопросы