gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:43:53 27 4
gpt4 key购买 nike

我使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com