使用Spring手动交易管理获取EntityManager

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)

Edw*_*rzo 5

有一个称为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)

  • @EdwinDalorzo 你能指导如何在事务方法中获取entityManager引用吗?即来自当前活动交易。因为我想将实体管理器从当前事务注入到 Hibernate Search 的 FulTextEntityManager 中。 (2认同)