我正在与我的应用程序实现excel集成。现在,代码如下:
@Autowired
private FooRepository fooRepository;
@Autowired
private AuxRepository auxRepository;
public void doImport(...) {
List<ExcelDto> excelRows = // read the excel file to get all the rows
for (ExcelDto row in excelRows) {
try {
// Build the Foo object to persist
Foo foo = new Foo();
foo.setProp1(row.prop1);
// This is just to show that I access the database in order
// to retrieve information needed by the Foo object
String aux = auxRepository.findOneById(row.auxId);
foo.setAux(aux);
//Build the rest of Foo...
// Try to save it (it still may fail due to database constraints)
fooRepository.save(foo);
} catch (Exception e) {
// log error
}
}
}
excel集成具有以下必要条件:
现在发生的事情是,如果某个项目失败,则事务将回滚,并且由于某些原因,持久化的项目将保持持久状态,但是在下一个.save()
上,我开始遇到{{1} }。我没有在任何地方使用任何transaction rolled back
批注,而是使用@Transactional
和spring-boot
,因此默认情况下启用了事务处理(如here所述)。
由于我没有Spring经验,所以我想知道什么是达到此要求的最佳方法。我是否应该将spring-data
方法与另一个带有.save()
的方法放置在一起,例如:
Transaction.REQUIRES_NEW
如果是这样,如果我的@Transactional(propagation = Propagation.REQUIRES_NEW)
public save(Foo foo) {
fooRepository.save(foo);
}
在其他方法上失败了怎么办?我是否应该将用于构建和保存auxRepository.findOneById()
的整个逻辑放在一个单独的方法中?这对性能有何影响?
非常感谢您的帮助/指导。
谢谢