Java &引用;BasicBatchConfigurer";具有受保护的访问-Spring批处理/Spring引导未将数据持久化到数据库
我最近将我的SpringBoot/batch Java应用程序从SpringBoot/SpringFramework(分别)1.x.x/4.x.x迁移到=>2.x.x/5.x.x(具体为2.2.4/5.2.3)。问题是事务/实体管理器肯定出了问题(在我看来),因为当从我的数据库持久层的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”对
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
注释可以解决数据库持久性问题,但当我删除此注释时,我将失去自动连接我的JobBuilderFactory和StepBuilderFactory的能力。有没有办法删除注释并在代码中获取这些对象,这样我至少可以测试这是否有效?对不起,我对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
的部分和中进行了解释