У меня была похожая проблема с записью нескольких строк в базу данных. Поскольку шаг задания создаст Список ваших элементов, как вы можете вернуть Список из обработчика автору? Это создаст список списков, и метод doWrite в Writer не настроен для обработки этого сценария.
Я использую 1.2.0 spring-boot-starter-parent (который дает мне spring-core 4.1.3) вместе с hibernate (4.3.7), в моем случае у меня есть «Receables», и для каждого 1 дебиторская задолженность, которую я читаю из CSV-файла, может потребоваться обновить или вставить много дебиторской задолженности в мою таблицу. Я также использую HibernateItemWriter.
Мое решение заключалось в расширении HibernateItemWriter. Поле sessionFactory является закрытым, поэтому я передаю его через конструктор, а также использую метод установки (для размещения существующего кода). Таким образом, мой оригинальный код (который отлично работает для одного «получаемого») изначально выглядел так:
@Bean
public ItemWriter<Receivable> recivableWriter() {
HibernateItemWriter<Receivable> hibernateItemWriter = new HibernateItemWriter<Receivable>(){{ setSessionFactory(sessionFactory); }};
return hibernateItemWriter;
}
После расширения HibernateItemWriter и изменения моего процессора, чтобы он возвращал список, мой код изменился на:
@Bean
public ItemWriter<List<Receivable>> receivableWriter() {
HibernateListItemWriter<List<Receivable>> hibernateItemWriter = new HibernateListItemWriter<List<Receivable>>(this.sessionFactory){{ setSessionFactory(sessionFactory); }};
return hibernateItemWriter;
}
И мой расширенный класс выглядит следующим образом (я мог бы очистить его, но это мой первоначальный проход. Я также хотел бы, чтобы поля sessionFactory и clearSession не были частными)
package com.work;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.SessionFactory;
public class HibernateListItemWriter<Receivable> extends org.springframework.batch.item.database.HibernateItemWriter<Receivable> {
public HibernateListItemWriter(SessionFactory sessionFactory) {
super();
this.sessionFactory = sessionFactory;
}
private SessionFactory sessionFactory;
private boolean clearSession = true;
@Override
public void write(List items) {
List<Receivable> unwrappedItems = new ArrayList<Receivable>();
List<List<Receivable>> wrappedItems = (List<List<Receivable>>)items;
for (List<Receivable> singleList: wrappedItems) {
unwrappedItems.addAll(singleList);
}
doWrite(sessionFactory, unwrappedItems);
sessionFactory.getCurrentSession().flush();
if(clearSession) {
sessionFactory.getCurrentSession().clear();
}
}
}
Приветствую grepcode.com за облегчение жизни.