我使用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()也将回滚第一行。
感谢。
答案 0 :(得分:0)
我没有解决问题,但我设法通过一次分块一个项而不是10来避免这个问题。