【问题标题】:Spring Batch - write to 2 tables at onceSpring Batch - 一次写入 2 个表
【发布时间】:2020-04-03 01:37:42
【问题描述】:

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

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

Hibernate 可以一步完成,但我在 Spring Bathc 中没有看到类似的功能。

这个 SO 问题Multiple itemwriters in Spring batch 建议使用 CompositeItemWriter 但问题是,我希望我的地址表包含一个名为 Person_id 的列,以将地址链接回 Person。我将无法通过 2 次写入来做到这一点。

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

【问题讨论】:

  • 你可以在你的ItemWriter中使用hibernate,在里面调用你的PersonService来保存所有的数据,还是有什么问题?
  • @KacperWolkowski 不幸的是我不能介绍 Hibernate
  • 这不会使@KacperWolkowski 无效;使用 SB 组合您的对象,并使用 PersonService 使用您的技术(hibernate、jdbc 或您用于持久性的任何其他技术)将其持久化
  • @LucaBassoRicci 他建议在 ItemWriter 中使用 Hibernate。根据我的问题,ItemWriter 只写入一个数据库表。
  • 是的。但他也建议在ItemWriter 中拨打PersonService#save(Person) 的电话。在PersonService 中,您可以使用您喜欢的技术。

标签: java spring-batch writers


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多