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 批处理无法在该级别提供帮助。
我们正在使用 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 批处理无法在该级别提供帮助。