vbe*_*nar 3 java spring jpa transactions
我有依赖的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
}
});
}
Run Code Online (Sandbox Code Playgroud)
这是相关的配置:
@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;
}
Run Code Online (Sandbox Code Playgroud)
有一个称为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;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4302 次 |
| 最近记录: |