【问题标题】:Spring Batch with custom FieldSetMapper not saving data?带有自定义 FieldSetMapper 的 Spring Batch 不保存数据?
【发布时间】:2020-05-14 11:15:03
【问题描述】:

我需要将一个大的 .csv 文件加载到我的数据库中,我的 Price 实体引用了一个分销商:

public class Price {

@Id
private String id;

private Date dtComu;

private Double price;

@ManyToOne
@JoinColumn(name = "idDistributor")
private Distributor distributor;

//constrcutor, getters&setters

我尝试上传的带有价格数据的 csv 引用了每个价格的分销商 ID。在我拥有的 ItemReader 上:

public FlatFileItemReader<Price> priceReader() {

    FlatFileItemReader<Price> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("file.csv"));
    reader.setLinesToSkip(2);
    reader.setRecordSeparatorPolicy(recordSeparatorPolicy);
    reader.setLineMapper(new DefaultLineMapper<Price>() {
        {
            setLineTokenizer(new DelimitedLineTokenizer() {
                {
                    setStrict(false);
                    setDelimiter(";");
                    setNames(new String[] { "idDistributor", "price", "dtComu" });
                }
            });
            setFieldSetMapper(customMapper());

        }
    });

    return reader;
}

而我的 customMapper 是:

public class CustomMapper implements FieldSetMapper<Price> {

@Autowired
DistributorRepository repository;

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

@Override
public Price mapFieldSet(FieldSet fieldSet) throws BindException {
    Distributor distributor = repository.findById(fieldSet.readInt("idDistributor")).orElse(null);
    if (distributore == null) {
        return null;
    }
    Price p = new Price();
    p.setDistributor(distributor);
    p.setPrice(fieldSet.readDouble("price"));
    try {
        p.setDtComu(formatter.parse(fieldSet.readString("dtComu")));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        p.setDtComu(new Date());
    }
    //here i will crate an ID for the Price that i need to always be unique
    p.setId(distributor.getIdImpianto()+ fieldSet.readString("dtComu"));
    return p;   }}

我的作家如下:

public JdbcBatchItemWriter<Price> prezzoWriter() {
    JdbcBatchItemWriter<price> writer = new JdbcBatchItemWriter<Price>();
    writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Prezzo>());
    ;
    writer.setSql("INSERT INTO price (id_distributor, price, dt_comu) "
            + "VALUES (:idDistributor, :price, :dtComu");
    writer.setDataSource(dataSource);
    return writer;
}

我运行程序,它完成后没有保存任何内容。我可能做错了什么吗?我刚开始使用 Sring Batch,必须详细说明一些复杂的东西..

【问题讨论】:

  • 您使用的是哪个事务管理器?
  • 嘿,我正在使用 JPA
  • 好的,那是你的问题。我添加了一个答案。

标签: java spring spring-data-jpa spring-batch


【解决方案1】:

JdbcBatchItemWriter 对 JPA 上下文一无所知。您需要使用 DataSourceTransactionManager 才能使其正常工作。

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多