【问题标题】:Spring Batch + Hibernate: Resolve ManyToMany on Data MigrationSpring Batch + Hibernate:解决多对多数据迁移
【发布时间】:2021-08-31 23:19:34
【问题描述】:

我们正在使用 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();

现在假设该表与另一个表具有多对多关系。我怎么能坚持呢?我的所有实体基本上都有一个 JPA 实体类,并将它们填充到处理器中,该处理器执行从旧数据库对象到新数据库对象的实际迁移。

@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,或者,如果它成功,有时中间表中的数据不会被填满。

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

【问题讨论】:

    标签: java spring hibernate spring-batch data-migration


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢!我会试试的。
    • 我可以确认这解决了问题。再次感谢您的准确回答!我将您的答案标记为已接受。 :)
    • 谢谢。很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2012-11-19
    相关资源
    最近更新 更多