Java &引用;BasicBatchConfigurer";具有受保护的访问-Spring批处理/Spring引导未将数据持久化到数据库

Java &引用;BasicBatchConfigurer";具有受保护的访问-Spring批处理/Spring引导未将数据持久化到数据库,java,spring-boot,hibernate,spring-batch,spring-transactions,Java,Spring Boot,Hibernate,Spring Batch,Spring Transactions,我最近将我的SpringBoot/batch Java应用程序从SpringBoot/SpringFramework(分别)1.x.x/4.x.x迁移到=>2.x.x/5.x.x(具体为2.2.4/5.2.3)。问题是事务/实体管理器肯定出了问题(在我看来),因为当从我的数据库持久层的JpaRepository类调用.saveAll()方法时,它跳入SpringAOP框架/libarary代码并进入无限循环。我看到它从一个方法(invoke())返回一个“DefaultTransaction”对

我最近将我的SpringBoot/batch Java应用程序从SpringBoot/SpringFramework(分别)1.x.x/4.x.x迁移到=>2.x.x/5.x.x(具体为2.2.4/5.2.3)。问题是事务/实体管理器肯定出了问题(在我看来),因为当从我的数据库持久层的
JpaRepository
类调用
.saveAll()
方法时,它跳入SpringAOP框架/libarary代码并进入无限循环。我看到它从一个方法(invoke())返回一个“DefaultTransaction”对象。我在1.x.x/4.x.x上的应用程序运行时,会在这里返回实体的实际ArrayList。我正在使用
springbootstarter
springbootstarterweb
springbootstarter数据jpa
springbootstarterbatch
,和
hibernate
/
hibernate envers
(当然还有许多其他依赖项,请告诉我是否需要列出它们)

经过一些研究,我发现人们说SpringBatch
@EnableBatchProcessing
注释设置了一个默认事务管理器,如果我使用JPA,这可能会导致问题。参考:

wilkinsona建议在我的
@Configuration
类中定义这个Bean:

@Bean
public BatchConfigurer batchConfigurer(DataSource dataSource, EntityManagerFactory entityManagerFactory) {
    return new BasicBatchConfigurer(dataSource, entityManagerFactory);
}   
我在执行此操作时出错,因为它表示
BasicBatchConfigurer()
具有受保护的访问权限。最好的实例化方法是什么

我还看到一些人说删除
@enableBackProcessing
注释可以解决数据库持久性问题,但当我删除此注释时,我将失去自动连接我的JobBuilderFactoryStepBuilderFactory的能力。有没有办法删除注释并在代码中获取这些对象,这样我至少可以测试这是否有效?对不起,我对Spring Batch/Spring不太熟悉

在我的
@Configuration
类中,我使用的是
平台TransactionManager
。我正在建立一个类似这样的工作存储库

@Bean
 public JobRepository jobRepository(PlatformTransactionManager transactionManager,
                                                @Qualifier("dataSource") DataSource dataSource) throws Exception {
        JobRepositoryFactoryBean jobRepositoryFactoryBean = new JobRepositoryFactoryBean();
        jobRepositoryFactoryBean.setDataSource(dataSource);
        jobRepositoryFactoryBean.setTransactionManager(transactionManager);
        jobRepositoryFactoryBean.setDatabaseType("POSTGRES");
        return jobRepositoryFactoryBean.getObject();
    }

如果需要,我可以提供任何其他信息。另一个问题是-如果我基本上使用相同的代码,事务管理器、实体管理器等等。。我的旧代码在1.x.x上工作得怎么样?我的pom.xml中是否存在错误的依赖项,从而导致新迁移的代码使用了错误的方法或来自错误依赖项的内容?

默认情况下,
@EnableBatchProcessing
将Spring Batch配置为在提供
数据源的情况下使用
数据源TransactionManager
。这个事务管理器对您的JPA上下文一无所知。因此,如果您想使用JPA存储库来保存数据,则需要将Spring Batch配置为使用
JpaTransactionManager

现在,为了提供自定义事务管理器,您需要注册一个
BatchConfigurer
并重写
getTransactionManager()
方法,类似于:

@Bean
public BatchConfigurer batchConfigurer(DataSource dataSource) {
    return new DefaultBatchConfigurer(dataSource) {
        @Override
        public PlatformTransactionManager getTransactionManager() {
            return new JpaTransactionManager();
        }
    };
}
这在
@EnableBatchProcessing
的部分和中进行了解释