[英]Get EntityManager using spring manual transaction management
我有依賴的PlatformTransactionManager(實際上是JpaTransactionManager)。 我可以使用TransactionTemplate在事務中執行操作。 但是我不知道該如何檢索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;
}
有一個稱為EntityManagerFactoryUtils的類,您可以從中基於在JpaTransactionManager中配置的EntityManagerFactory獲取當前事務的實體管理器。
例如:
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;
});
您可以通過以下方式注入它:
@PersistenceContext
private EntityManager entityManager;
我實現了自己的簡單交易模板:
@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();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.