我的代码看起来像这样:
@Transactional
public void save(Citizen citizen){
this.saveCitizen(citizen);
}
private void saveCitizen(Citizen citizen){
try{
citizenReposiory.save(citizen);
} catch(DataIntegrityViolationException exception){
//Exception on the line below
Citizen existingCitizen = citizenReposiory.findById(citizen.getId());
exisitingCitizen.setAge(50);
}
}
我首先要尝试拯救公民。如果抛出异常,那是因为数据库中已经存在该公民。在这种情况下,我想更新现有的行。然而,在上面的代码中,当调用citizenReposiory.findById(citizen.getId());
时我会得到另一个异常。 。这是终端的片段:
[26-04-2020 00:35] WARN [o.h.engine.jdbc.spi.SqlExceptionHelper] - SQL Error: 1062, SQLState: 23000
[26-04-2020 00:35] ERROR [o.h.engine.jdbc.spi.SqlExceptionHelper] - Duplicate entry '10-2020-1' for key 'UKe4wgjj1wdqag5qhbcgnxhbvuj'
[26-04-2020 00:35] ERROR [org.hibernate.AssertionFailure] - HHH000099: an assertion failure occurred
(this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session):
org.hibernate.AssertionFailure: null id in dk.rsyd.mature.entities.WeeklyCare entry (don't flush the
Session after an exception occurs)
org.hibernate.AssertionFailure: null id in dk.rsyd.mature.entities.WeeklyCare entry (don't flush the
Session after an exception occurs)
这里发生了什么?捕获异常后是否无法继续处理事务?我尝试添加 @Transactional(noRollbackFor = DataIntegrityViolationException.class)
但这没有帮助。
最佳答案
可以使用不同的方法。也就是说,您可以先执行findByID,并验证findByID是否返回值,如果返回值,因此它已经存在,则可以执行setAge 操作,否则您可以拯救公民。通过这种方式,您将始终进行初步检查,并避免因进入异常而保存不存在的对象。
关于java - 捕获异常后可以继续事务操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61433243/