【问题标题】:Can I continue a transactional operation after catching an exception?捕获异常后我可以继续事务操作吗?
【发布时间】:2020-08-09 11:52:27
【问题描述】:

我的代码如下所示:

@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()); 时会出现另一个异常。这是终端的sn-p:

[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) 但这没有帮助。

【问题讨论】:

    标签: java mysql spring transactions


    【解决方案1】:

    可以使用不同的方法。即你可以先执行findByID,并验证findByID是否返回值,如果返回值,因此它已经存在,你可以执行setAge 操作,否则可以拯救市民。这样,您将始终进行初步检查,并避免通过进入异常来保存不存在的对象。

    【讨论】:

    • 我正在重写我的代码以实现这一点。由于某种原因,其他方法似乎是不可能的:)
    • 太好了,!如果你解决了,你应该关闭主题;-)
    【解决方案2】:

    如果你提交给citizenReposiory.save()的“公民对象”里面已经有主键。也许你可以简单地调用 saveOrUpdate()。

    private void saveCitizen(Citizen citizen){
    
        citizenReposiory.saveOrUpdate(citizen);
    
    }
    

    仅供参考

    1. Hibernate saveOrUpdate behavior

    2. Hibernate save() and saveOrUpdate() methods

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      相关资源
      最近更新 更多