Spring Batch - 一次写入2个表

时间:2018-04-10 14:30:28

标签: java spring-batch writers

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

通常,我会使用JdbcBatchItemWriter,但我发现写入2个单独的表是有限的。我需要写入Person和Address表。

Hibernate可以一步编写这个,但我没有在Spring Bathc中看到一个类似的功能。

这个问题Multiple itemwriters in Spring batch建议使用CompositeItemWriter,但问题是,我希望我的地址表保存一个名为Person_id的列,将地址链接回Person。我不能用2次写作来做到这一点。

有什么建议吗?肯定批处理更复杂的写入

1 个答案:

答案 0 :(得分:0)

我从评论中看到,您不能使用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);
        }
    }
}