Spring批处理ConstraintViolationException

时间:2018-02-02 22:43:24

标签: spring-batch

我使用spring批量导入城市数据。

City{
  String name;
  @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  State state;
}
State{
  String name;
  String code;
}

我已经在fieldSetMapper中填充了所需的数据,在处理器中,我需要设置状态和城市之间的关系。

State state;
if ((state = stateDao.findByStateCode(city.getState().getStateCode())) != null) {
  city.setState(state);
} else {
  city.getState().setCountry(country);
}

由于spring批处理使用chunk来处理事务,所以如果同一块中的多个城市具有状态存储库尚未存储的相同状态,则会导致唯一的约束违规。

例如,2个城市行

{name:x, state:{name:xx,code:xy}}
{name:y, state:{name:xx,code:xy}}

当spring批处理第一行时,它将创建一个名为xx且代码为xy的新状态。但对于第二行,由于该状态已经在数据库中,因此它将抛出constraintviolationexception。如果抛出异常,有没有办法重新处理第二行? retry()也将回滚第一行。

感谢。

1 个答案:

答案 0 :(得分:0)

我没有解决问题,但我设法通过一次分块一个项而不是10来避免这个问题。