春季批处理 - 一次写入 2 个表



我有一个包含地址列表的 Person 对象。我的Spring Batch应用程序将Person JSON引用转换为Person POJO,并将它们写入数据库。

通常,我会使用 JdbcBatchItemWriter,但我看到它仅限于写入 2 个单独的表。我需要写信给"人员和地址"表。

Hibernate可以一步写出这个,但我在Spring Bathc中没有看到模拟器功能。

这个SO问题 Spring 批处理中的多个项目编写器建议使用 CompositeItemWriter,但问题是,我希望我的地址表包含一个名为 Person_id 的列,以将地址链接回 Person。我将无法通过 2 次写入来做到这一点。

有什么建议吗?当然,批处理可以满足更复杂的写入

我从评论中看到,您不能使用 ORM 或保留 Person 及其地址的服务。在这种情况下,您可以使用自定义编写器:

import java.util.List;
import javax.sql.DataSource;
import org.springframework.batch.item.ItemWriter;
import org.springframework.jdbc.core.JdbcTemplate;
public class PersonWriter implements ItemWriter<Person> {
    private JdbcTemplate jdbcTemplate;
    public PersonWriter(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    @Override
    public void write(List<? extends Person> items) {
        for (Person person : items) {
            jdbcTemplate.update("INSERT INTO Person ...");
            for (Address address : person.addresses) {
                jdbcTemplate.update("INSERT INTO Address ... where person_id = ?", person.getId()); 
            }
        }
    }
}

另一种方法是委托给两个 jdbc 批处理项编写器:

import java.util.Collections;
import java.util.List;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
public class PersonItemWriter implements ItemWriter<Person> {
    private JdbcBatchItemWriter<Person> personWriter;
    private JdbcBatchItemWriter<Address> addressWriter;
    public PersonItemWriter(JdbcBatchItemWriter<Person> personWriter, JdbcBatchItemWriter<Address> addressWriter) {
        this.personWriter = personWriter;
        this.addressWriter = addressWriter;
    }
    @Override
    public void write(List<? extends Person> persons) throws Exception {
        for (Person person : persons) {
            personWriter.write(Collections.singletonList(person));
            List<Address> addresses = person.getAddresses();
            for (Address address : addresses) {
                address.setPersonId(person.getId());
            }
            addressWriter.write(addresses);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新