java - 使用spring手动事务管理获取EntityManager

标签 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
        }
    });
}

相关配置如下:

@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从哪里可以根据 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;
});

关于java - 使用spring手动事务管理获取EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27270862/

相关文章:

java - 使用多线程将控制台输出到文件

java - 重构静态类,以便我可以对其进行单元测试

java - 使用spring jpa时抛出NonUniqueResultException "findtop"

Spring JDBC 模板 - 超出最大打开游标数

hibernate - 具有反向外键的单向@OneToOne

c# - 英特尔的开源 uPNP SDK 有绝对 0 的文档,为什么?

java - 非 Json 格式转 JSON 格式

java - spring boot - 如何在 HTTP Controller 处理程序中避免 "Failed to instantiate [java.util.List]: Specified class is an interface"?

java - 没有实体管理器错误 JPA/hibernate 的持久性提供程序

spring-boot - 用户角色 Spring Data Rest Spring security