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

Spring批处理Jpa存储库保存不提交数据

公羊渝
2023-03-14

我正在使用Spring Batch和JPA处理一个批处理作业并执行更新。我正在使用默认的存储库实现。

并且我正在使用一个repository.save将修改后的对象保存在处理器中。而且,我没有在处理器或编写器中指定任何@Transactional注释。

下面是我的步骤,读取器和写入器配置:另外,我的config类是用EnableBatchProcessing注释的

@EnableBatchProcessing
public class UpgradeBatchConfiguration extends DefaultBatchConfigurer{
 @Autowired 
private PlatformTransactionManager transactionManager;

@Override
protected JobRepository createJobRepository() throws Exception {
    JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
    factory.setDataSource(getdataSource());
    factory.setTransactionManager(transactionManager);
    factory.setTablePrefix("CFTES_OWNER.BATCH_");
    factory.afterPropertiesSet();
    return factory.getObject();
}

@Bean(name = "updateFilenetJobStep")
public Step jobStep(StepBuilderFactory stepBuilderFactory,
        @Qualifier("updateFileNetReader") RepositoryItemReader reader,
        @Qualifier("updateFileNetWriter") ItemWriter writer,
        @Qualifier("updateFileNetProcessor") ItemProcessor processor) {
    return stepBuilderFactory.get("jobStep").allowStartIfComplete(true).chunk(1).reader(reader).processor(processor)
            .writer(writer).transactionManager(transactionManager).build();

}

@Bean(name = "updateFileNetWriter")
public ItemWriter getItemWriter() {
    return new BatchItemWriter();
}

@Bean(name = "updateFileNetReader")
public RepositoryItemReader<Page<TermsAndConditionsErrorEntity>> getItemReader(
        TermsAndConditionsErrorRepository repository) {

    RepositoryItemReader<Page<TermsAndConditionsErrorEntity>> reader = new RepositoryItemReader<Page<TermsAndConditionsErrorEntity>>();
    reader.setRepository(repository);
    reader.setMethodName("findAll");
    HashMap<String, Direction> map = new HashMap<String, Direction>();
    map.put("transactionId", Direction.ASC);
    reader.setSort(map);

    return reader;
}
}

在writer中,这就是我使用的repository.save

repository.save(entity);

共有1个答案

丌官积厚
2023-03-14

通过在整个作业存储库、作业、步骤等中注入一个JPATransactionManager,而不是自动连接的PlatformTransactionManager来解决这个问题。

 类似资料:
  • 我已经开始探索Spring Batch,并遇到了一些基本问题。

  • 我有一个使用JPA的Spring Boot应用程序,它有一个PostgreSQL数据库。我使用的是Spring Batch。场景是我正在读取一个文件并将数据写入PostgreSQL数据库。当程序在数据库中创建Spring Batch使用的元数据表时,它与PostgreSQL一起工作。但我需要的是Spring Boot不要创建元数据表,并通过Spring Batch使用内存中基于映射的作业存储库。我

  • 我在使用JPA时遇到了一些困难。我没有得到任何异常,但我不能保存任何东西到数据库。我从Hibernate到Jpa,在那里一切都工作得很好。下面是我的文件 Application.Properties: 存储库: 服务: 我在提交表单时得到了200的响应,但在数据库中找不到数据

  • 它是否将其存储在缓存中?我有一个应用程序,但应用程序中没有任何地方。属性是提到的db详细信息。我可以通过邮递员存储数据和查询它。

  • 无论如何,如果用户名已经被使用,存储库只需进行更新,因为指定的标识符不是空的。这不是我想要的行为,我需要它抛出类似重复条目异常的东西。有什么办法可以预防吗?我必须自己做吗?例如: