java - 捕获异常后可以继续事务操作吗?

标签 java mysql spring transactions

我的代码看起来像这样:

@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/

相关文章:

java - 使用增量的乘法

PHP mysql_fetch_array 多个表

php - 向服务器添加大量记录

mySQL - 抓取数据同时确保字段是唯一的

java - 在方向改变时处理 Dagger 组件

java - 如何将 JDialog 链接到 JButton 单击

java - HashMap Java 避免冲突的例子

java - 如何解决BeanCreationException?

spring - 在spring + hibernate中保存creationTimestamp和updatedTime

java - 访问 BeanDefinitionRegistryPostProcessor 内部的 Spring ApplicationContext