java - 如何为具有 ArrayList 字段的实体创建 spring-batch ItemWriter?

标签 java sql spring-batch

我使用 spring-batch 按表定位实体。 问题是关于 ItemWriter 的,或者可能是关于 ItemProcessor 的。

对于这个实体,一切正常。我可以从源代码中读取实体并将其保存到表 User_export

@Getter @Setter
class User{
    String objectId;
    String rev;
    String value;
    String type;
}

我有这个 ItemWriter:

    @Bean
    @StepScope
    public ItemWriter<UserExport> writer() {
        JdbcBatchItemWriter<UserExport> writer = new JdbcBatchItemWriter<>();
        writer.setDataSource(dataSource);

        String sql = "insert into User_export(objectId, REV, Value, Type)" +
                "values (:objectId, :rev, :value, :type)";
        writer.setSql(sql);

        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        writer.afterPropertiesSet();
        return writer;
    }

2) 然后,我在我的实体用户中添加了字段。此字段是列表,我需要将此字段保存在其他表 - Device_Export 中。

@Getter @Setter
class User{
    String objectId;
    String rev;
    String value;
    String type;
    List<String> devices;
}

我有两个表 User_export 和 Device_export。 Device_export 对 User_export 有外键,关系是许多设备对一个用户。 我需要通过表映射我的用户实体。 所以,我的解决方案是:

     @Bean
    public Step exportStep1() {
        return stepBuilderFactory.get("step1").<InputUser, List<OutputUser>>chunk(1)
                .reader(reader())
                .processor(processor())
                .writer(writer())
                .build();
    }

读取器->处理器->写入器

Reader(从源表中读取实体)- 没关系。

@Bean
public JdbcCursorItemReader<User> reader() {
    JdbcCursorItemReader<InputUser> reader = new JdbcCursorItemReader<>();
    String sql = "select * from User_Table";
    reader.setSql(sql);
    reader.setDataSource(dataSource);
    reader.setName("User_Table");
    reader.setRowMapper(new BeanPropertyRowMapper<>(User.class));
    return reader;
}

处理后,我得到了带有完整设备列表的用户实体。我需要将它映射到表格:

我使用了 ComposeWriter:

@Bean
    @StepScope
    @DependsOn({"userWriter", "deviceWriter"})
    public CompositeItemWriter composeWriter() {
        CompositeItemWriter writer = new CompositeItemWriter();

        ItemWriter<UserExport> userWriter = userWriter();
        ItemWriter<DeviceExport> deviceWriter = deviceWriter();
        List<ItemWriter> writers = new ArrayList<>();
        writers.add(userWriter);
        writers.add(deviceWriter);

        writer.setDelegates(writers);
        return writer;
    }


    @Bean
    @StepScope
    public ItemWriter<UserExport> userWriter() {
        JdbcBatchItemWriter<UserExport> writer = new JdbcBatchItemWriter<>();
        writer.setDataSource(dataSource);

        String sql = "insert into User_Export (objectId, REV, Value, Type)" 
                "values (:objectId, :rev, :value, :type)";
        writer.setSql(sql);

        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        writer.afterPropertiesSet();
        return writer;
    }

    @Bean
    @StepScope
    public ItemWriter<DeviceExport> deviceWriter() {
        JdbcBatchItemWriter<DeviceExport> writer = new JdbcBatchItemWriter<>();
        writer.setDataSource(dataSource);

        String sql = "insert into Device_Export (PR_KEY, objectId, device) values (:prKey, :objectId, :device)";
        writer.setSql(sql);

        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        writer.afterPropertiesSet();
        return writer;
    }

但是对于这样的 ItemWriter,我只能在设备表中写入一条记录。如何在Device_export中写入设备(记录)列表?

我的处理器大概是这样的:

    @Bean
    public ItemProcessor<User, List<OutputUser>> processor() {
        return new ItemProcessor<User, List<OutputUser>>() {
            @Override
            public List<OutputUser> process(OutputUser item) throws Exception {
                OutputUser outputUser = mapToUser(item);
                List<OutputDevice> outputDevices = mapToDevices(item);
                // Не понятно что делать дальше
            }
        };
    }

最佳答案

JdbcBatchItemWriter 无济于事。您需要编写代码来保存用户及其 devices 并将该代码包装为自定义 Spring Batch 编写器。否则使用 ORM 将您的实体映射到表并使用 JpaItemWriterHibernateItemWriter

这里有一个类似的问题:Read one record/item and write multiple records/items using spring batch

关于java - 如何为具有 ArrayList 字段的实体创建 spring-batch ItemWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56986032/

相关文章:

java - 我如何将此脚本从 C# 转换为 Java

spring - 当我创建 spring 批处理多个 JobBuild 时发生错误

spring-boot - 使用 spring-boot 连接到 spring-batch 和应用程序数据库

Java - 对字符串数组进行排序/按字母顺序排列

java - jbpm6-build.xml :508: jboss did not start within 5 minutes

java - 如何使用 http post 将两个参数传递给 Restful Web 服务? UnrecognizedPropertyException : Unrecognized field , 未标记为可忽略

mysql - 数据库为一所功能性学校设计一个简单的数据库

mysql - sql select - 另一个带有 NULL 的选择仅返回 NULL

php - Mysql max函数及具体值

spring - (Spring 批处理)即使 JOB 成功完成,带有回复的可轮询 channel 也包含 block 响应