Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring手动事务管理获取EntityManager_Java_Spring_Jpa_Transactions - Fatal编程技术网

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

Java 使用spring手动事务管理获取EntityManager,java,spring,jpa,transactions,Java,Spring,Jpa,Transactions,我在依赖项中有PlatformTransactionManager(实际上是JpaTransactionManager)。我可以使用TransactionTemplate在事务中执行操作。但我不知道如何检索EntityManager以使用 @Autowired PlatformTransactionManager transactionManager; void doSomething() { TransactionTemplate transactionTemplate = new

我在依赖项中有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;
}
@Bean
公共数据源数据源(){…}
@豆子
public FactoryBean EntityManager工厂(){
LocalContainerEntityManagerFactoryBean entityManagerFactory=新的LocalContainerEntityManagerFactoryBean();
setDataSource(dataSource());
...
返回实体管理工厂;
}
@豆子
公共平台transactionManager transactionManager(EntityManager工厂EntityManager工厂){
JpaTransactionManager JpaTransactionManager=新的JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
返回jpaTransactionManager;
}

我实现了自己的简单事务模板:

@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();
        }
    }
}
@组件
公共类JpaTransactionTemplate{
@自动连线
私人实体管理工厂实体管理工厂;
公共无效执行(消费者){
EntityManager EntityManager=EntityManager工厂。createEntityManager();
试一试{
EntityTransaction=entityManager.getTransaction();
transaction.begin();
试一试{
consumer.accept(实体管理器);
commit();
}捕获(运行时异常e){
试一试{
transaction.rollback();
}捕获(异常回滚异常){
e、 addsupprested(回滚异常);
}
投掷e;
}
}最后{
entityManager.close();
}
}
}
有一个名为的类,您可以从中根据在中配置的获取当前事务的实体管理器

例如:

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;

我在一个带有
@Transactional
注释的函数中尝试了这段代码,并且
EntityManagerFactoryUtils.getTransactionalEntityManager(emf)
返回了
null
。如果我尝试使用
@PersistenceContext
注释,它不会为null,但我不确定它是否是事务的正确EntityManager。最初的问题是关于手动事务管理。如果您的方法被标记为
@Transactional
,则您没有使用手动事务,使用此答案没有意义。@EdwinDalorzo您可以指导如何在事务方法内获取entityManager引用。i、 从当前活动事务中删除。因为我想将实体管理器从当前事务注入Hibernate Search的FulTextEntityManager。