【发布时间】:2020-11-18 07:26:03
【问题描述】:
我需要对存储到关系数据库中的数据进行非规范化处理。
彼此之间链接的表太多,无法构建单个查询来获取所有数据。
这里是一个简化的情况:
+-------------+ +-------------+
| | 1 N | |
| Unitat +-----------> Authors |
| | | |
+-------------+ +-------------+
到目前为止,我已经构建了一个获取所有 Unitat 行的步骤:
@Bean
public ItemReader<Unitat> reader() {
String sql = "select * from unitat";
JdbcCursorItemReader<Unitat> jdbcCursorItemReader = new JdbcCursorItemReader<>();
jdbcCursorItemReader.setDataSource(this.dataSource);
jdbcCursorItemReader.setSql(sql);
jdbcCursorItemReader.setVerifyCursorPosition(false);
jdbcCursorItemReader.setRowMapper(new UnitatRowMapper());
return jdbcCursorItemReader;
}
RowMapper 是:
public class UnitatRowMapper implements RowMapper<Unitat> {
private static final String ID_COLUMN = "id";
//...
@Override
public Unitat mapRow(ResultSet resultSet, int numRow) throws SQLException {
Unitat unitat = new Unitat();
unitat.setId(resultSet.getString(ID_COLUMN));
//...
return unitat;
}
}
这是我的处理器。它仅用于将字段填充到 UnitatDenormalized 对象中:
@Component
public class UnitatMappingItemProcessor implements ItemProcessor<Unitat, UnitatDenormalized> {
@Override
public UnitatDenormalized process(Unitat unitat) throws Exception {
UnitatDenormalized denormalized = new UnitatDenormalized();
denormalized.setId(unitat.getId());
//denormalized.set...()
return denormalized;
}
}
这是我当前的步骤和工作配置:
@Bean
public Step step(
ItemReader<Unitat> mssqlItemReader,
UnitatMappingItemProcessor processor,
SolrItemWriter solrItemWriter
) {
return this.stepBuilderFactory
.get("unitat")
.<Unitat, UnitatDenormalized>chunk(100)
.reader(mssqlItemReader)
.processor(processor)
.writer(solrItemWriter)
.build();
}
@Bean
public Job job(Step step) {
Job job = this.jobBuilderFactory.get("job1")
.flow(step)
.end()
.build();
return job;
}
如何获取作者并将他们合并到之前获得的unitat?
何时以及如何执行下一个代码?
// Here would I need to populate `authors`:
denormalized.addAutors(...);
denormalized.addAutors(...);
我希望我已经解释得很好......
【问题讨论】:
标签: spring-batch