当前位置: 首页 > 知识库问答 >
问题:

需要将我的JPA层配置为使用TransactionManager(Spring云任务批量注册平台TransactionManager)

昝唯
2023-03-14

我正在一个项目中使用Spring云任务批处理。我计划对任务中的业务数据和Spring审计数据使用不同的数据源。所以我配置了如下内容:

   @Bean
   public TaskConfigurer taskConfigurer() {
       return new DefaultTaskConfigurer(this.singletonNotExposedSpringDatasource());
   }

   @Bean
   public BatchConfigurer batchConfigurer() {
       return new DefaultBatchConfigurer(this.singletonNotExposedSpringDatasource());
   }

而主数据源是通过JpaBaseConfiguration自动配置的。

SimpleBatchConfigurationDefaultBatchConfigrer公开一个PlatformTransactionManagerbean时,问题就出现了,因为JpaBaseConfigurationPlatformTransactionManager上有一个@SittionalOnMissingBean。因此Batch的PlatformTransactionManager绑定到spring.datasource发生。

到目前为止,这似乎是因为这个错误造成的

因此,我试图模仿JpaBaseConfiguration的功能,在我的业务数据源/entityManager上定义自己的PlatformTransactionManager

    @Primary
    @Bean
    public PlatformTransactionManager appTransactionManager(final LocalContainerEntityManagerFactoryBean appEntityManager) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(appEntityManager.getObject());
        this.appTransactionManager = transactionManager;
        return transactionManager;
    }

注意我必须用transactionManager以外的名称来定义它,否则Spring会找到2个bean并抱怨(不管@Prime!

但现在有趣的部分来了。运行测试时,一切都运行顺利,测试完成,并且为业务和Batch/Task的数据库正确创建了DDL,数据库读取工作完美无瑕,但业务数据不会在我的测试数据库中持久化,因此最终assertThats在计数时失败。如果我在我的测试中@AutowirePlatformTransactionManager或ntityManager,一切都表明它们是正确的。但是,如果我在entityRepository.save中进行调试,并执行org.springframework.transaction.interceptor.TransactionAbooSupport.currentTransactionstatus(),则似乎Batch的配置中的DatasourceTransactionManager被覆盖,因此我的自定义公开PlatformTransactionManager未被使用。

因此,我想这不是我的PlatformManager作为主要的问题,而是有什么东西正在配置我的JPA层TransactionInterceptor,以使用非主要但transactionManager命名的批处理bean。

我还尝试让我的@Configuration实现TransactionManagementConfigrer并覆盖PlatformTransactionManager annotationDrivenTransactionManager()但仍然没有运气

因此,我想我要问的是,是否有办法为JPA层配置主TransactionManager。

共有1个答案

哈泰
2023-03-14

当SimpleBatchConfiguration DefaultBatchConfigurer公开PlatformTransactionManager bean时,就会出现问题,

正如你提到的,这确实是第2788批报告的情况。我们正在探索的解决方案是,仅当Spring Batch创建事务管理器bean时,才公开它。

与此同时,您可以设置属性spring.main.allow-bean-定义-覆盖=true以允许bean定义覆盖,并设置您希望Spring Batch与BatchConfigrer#getTransactionManager一起使用的事务管理器。在您的情况下,它类似于:

@Bean
public BatchConfigurer batchConfigurer() {
    return new DefaultBatchConfigurer(this.singletonNotExposedSpringDatasource()) {
        @Override
        public PlatformTransactionManager getTransactionManager() {
            return new MyTransactionManager();
        }
    };
}

希望这有帮助。

 类似资料:
  • 我正在尝试了解如何使用Spring。 我试着效仿这个例子。但是,当我从Eclipse启动Tomcat时,我得到了以下错误: 这是DispatcherServlet的相关代码。xml salvaUtente()是一种方法,我将在其中处理多个插入(现在仍然是exmpty)。

  • 对于条件sessionFactory beans,我将Autowired注释中的'required'参数设置为false,以防止spring抛出NoSuchBeanDefinitionException,但对于@Transactional我该怎么办? 配置类 事务性方法 我希望spring跳过条件transactionManager bean在某些情况下对它们不是由条件创建的bean进行验证。

  • 我在存储库类中有一个方法,标记为,该方面正在执行,如stacktrace中所示,但抛出的异常是“Transaction required exception” 电磁场: 交易: 我真的要疯了,任何帮助都会很好。 似乎,有一个事务,它被检查为完成,加入事务失败,所以它标记为仅回滚,因为它不能加入它。

  • 我正在尝试使用VSTSGit作为我的配置repo。 这是我的application.yml(隐藏或删除的敏感信息)

  • 为了在 JAX-RS/Jersey 应用中 实现 Jersey Spring 3 DI 的支持,请将上述模块添加到 class-path 中。

  • 问题内容: 我仍在尝试围绕@Transactional的工作原理。 我在Service类的方法上有注释,而在Repository类中的方法上有注释。带注释的方法是否适用于带注释的存储库中的方法? 我的理解: 在没有数据的类的方法上,将数据写入数据库,而使用时,则将数据写入数据库。 修改查询 修改方法签名只能返回,或者 更新查询必须是事务性的,标记为 Spring Data将删除所有未刷新的未处理更