Spring-Batch: писатель элементов для отношений родитель-потомок

Я написал обработчик элементов, который возвращает список объектов. Этот объект необходимо разделить на 2 таблицы базы данных (родительская и дочерняя). Одна строка заголовка и для этого соответствующего идентификатора заголовка у нас есть дочерние строки, связанные в дочерней таблице. Я использовал пример ListUnpackingItemWriter для решения проблемы со списком. Я использовал CompositeItemWriter, чтобы разделить результат на 2 писателя. Теперь мне нужно разделить каждый на заголовок и дочернюю таблицу. Теперь у каждого писателя одинаковое количество строк. Есть ли лучший способ сделать это? Решите обе проблемы с первичным ключом таблицы. Мне нужен пример записи пользовательского элемента записи, который выполняет проверку перед вставкой. Заранее благодарю.

Ниже приведен код

public JdbcBatchItemWriter<T> myWriter() {
         JdbcBatchItemWriter<T> myWriter = new JdbcBatchItemWriter<T>(); 
         myWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<T>());   
         myWriter.setSql("INSERT INTO Parent table( colums) values ( values )");
            myWriter.setDataSource(dataSource);
            myWriter.afterPropertiesSet();

            return myWriter;
        }

        public JdbcBatchItemWriter<T> myOtherWriter() {
             JdbcBatchItemWriter<T> myWriter = new JdbcBatchItemWriter<T>(); 1
             myWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<T>());   
             myWriter.setSql("INSERT INTO child table( colums) values ( values )");
             myWriter.setDataSource(dataSource);
             myWriter.afterPropertiesSet();
            return myWriter;
        }

        public CompositeItemWriter<T> compositeItemWriter() {
            CompositeItemWriter<T> writer = new CompositeItemWriter<T>();
            writer.setDelegates(Arrays.asList(myWriter(),myOtherWriter())); 
            return writer;
        }
    ```

1 ответ

Решение

Если составной писатель у вас не работает, можете ли вы использовать собственный писатель, например:

import java.util.List;

import javax.sql.DataSource;

import org.springframework.batch.item.ItemWriter;
import org.springframework.jdbc.core.JdbcTemplate;

public class MyParentChildWriter implements ItemWriter<Object> {

    private JdbcTemplate jdbcTemplate;

    public MyParentChildWriter(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public void write(List<?> items) {
        for (Object item : items) {
            // get parent/child values from item and use them in the query as needed
            jdbcTemplate.update("INSERT INTO Parent table( colums) values ( values )");
            jdbcTemplate.update("INSERT INTO child table( colums) values ( values )");
        }
    }
}

Обратите внимание, что все операторы обновления будут выполняться в одной транзакции, как описано в разделе " Обработка фрагментов".

Другие вопросы по тегам