Spring Batch + Hibernate:解决数据迁移上的ManyToMany

Spring Batch + Hibernate: Resolve ManyToMany on Data Migration

我们正在使用 Hibernate 和 Spring Batch 将数据从一个数据库迁移到另一个数据库。下面的例子有点伪装。

因此,我们正在使用标准处理管道:

return jobBuilderFactory.get("migrateAll")
               .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(DConfiguration.migrateD())

migrateD 包含三个步骤:

@Bean(name="migrateDsStep")
    public Step migrateDs() {
        return stepBuilderFactory.get("migrateDs")
                .<org.h2.D, org.mssql.D> chunk(100)
                .reader(dReader())
                .processor(dItemProcessor)
                .writer(dWriter())
                .listener(chunkLogger)
                .build();

现在假设此 table 与另一个 table 具有多对多关系。我怎么能坚持呢?我基本上有一个 JPA 实体 Class 用于我的所有实体,并在处理器中填充这些实体,这些处理器执行从旧数据库对象到新数据库对象的实际迁移。

@Component
@Import({mssqldConfiguration.class, H2dConfiguration.class})
public class ClassificationItemProcessor implements ItemProcessor<org.h2.d, org.mssql.d> {

    public ClassificationItemProcessor() {
        super();
    }

    public Classification process(org.h2.d a) throws Exception {

        d di = new di();
        di.setA(a.getA);
        di.setB(a.getB);`

        // asking for object e.g. possible via, But this does not work:
        // Set<e> es = eRepository.findById(a.getes());
        di.set(es)
        ...
        // How to model a m:n?

        return d;
    }

所以我基本上可以通过另一个数据库调用(存储库)请求相关对象并将其添加到 d.但是当我这样做时,我宁愿 运行 进入 LazyInitializationExceptions 或者,如果它成功有时中间 tables 中的数据将不会被填满。

对此建模的最佳做法是什么?

这不是 Spring 批处理问题,而是 Hibernate 映射问题。就 Spring 批处理而言,您的输入项是 org.h2.D 类型,您的输出项是 org.mssql.D 类型。由您定义物品是什么以及如何在您的物品处理器中“丰富”它。

您需要确保作者收到的项目已完全“填写”,这意味着您已经在其上设置了任何其他实体(无论是单个实体还是一组实体,例如 di.set(es) 在你的例子中)。如果这导致延迟初始化异常,您需要将模型更改为急切初始化,因为 Spring 批处理无法在该级别提供帮助。