Spring-Batch: автор статей для отношений между родителями и детьми - PullRequest
0 голосов
/ 02 апреля 2020

Я написал обработчик предметов, который возвращает список объектов. Этот объект необходимо разбить на 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 Ответ

0 голосов
/ 02 апреля 2020

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

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 )");
        }
    }
}

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

...