У меня есть Spring Batch
с базовым чанком:
- Прочитайте CSV-файл.
- Обработайте его (перекодируйте одно закодированное значение в другое).
- Запишите результат в базу данных.
Проблема
В некоторых случаях я хочу вставить или обновить механизм в своем пользовательском файле ItemWriter
.
Пример: я могу получить эти 2 строки на моем CSV
C006;Test;OK;01/01/1970;1
C006;Test;OK;01/01/1970;5
Вы можете понять, что они очень похожи, за исключением последнего столбца, стратегия будет такой:
- Проверьте базу данных, если у меня есть сущность "как так"
- если true, обновите значение последним полученным элементом (в нашем случае вторая строка со значением 5 в последнем столбце)
Что я уже сделал?
В свой объектный компонент я добавил аннотацию Unique Constraint следующим образом:
@Table(name = "indicator",
uniqueConstraints = { @UniqueConstraint(columnNames =
{ "reference", "type", "status", "date" }) })
Теперь я уверен, что не могу сохранить объект с данными того же столбца. Затем я создал пользовательское исключение ItemWriter
и попытался перехватить ConstraintViolationException, но это не сработало, я всегда получаю другое исключение, даже когда пробовал родительское.
Итак, у вас есть какие-либо идеи или другой способ сделать это?
Я думал об использовании функций слияния JPA? что ты думаешь об этом?
Мой пользовательский ItemWriter
@Component
public class ImportItemWriter implements ItemWriter<Indicator>{
@Autowired
protected IndicatorDao indicatorDao;
public void write(List<? extends Indicator> items) throws Exception {
for (Indicator item : items) {
Indicator indicator = new Indicator();
indicator.setReference(item.getReference());
indicator.setType(item.getType());
indicator.setStatus(item.getStatus());
indicator.setDueDate(item.getDueDate());
indicator.setValue(item.getValue());
try {
indicatorDao.persist(indicator);
} catch (ConstraintViolationException e) {
// TODO: handle exception
}
}
}
}
Обновление Проблема решена Идея использования Composite PKey
интересна, но я не могу ее использовать, потому что мне нужно создать композицию с 9 ключами, не справедливо с точки зрения производительности. Я решил добавить функцию в свой DAO
(isDuplicated
) и в своем пользовательском ItemWriter
просто провел простой тест:
if `isDuplicated()` then `updateEntity()` else `insertNew()`