簡體   English   中英

如何使用ArrayList字段為實體創建spring-batch ItemWriter?

[英]How to create spring-batch ItemWriter for entity with ArrayList field?

我用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();
    }

閱讀器 - >處理器>作家

讀者(從來源talbe讀取實體) - 這是okey。

@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

這里有一個類似的問題: 讀取一個記錄/項目並使用spring批處理寫入多個記錄/項目

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM