当前位置: 首页 > 知识库问答 >
问题:

SQLIntegrityConstraintViolationException导致Spring事务回滚

柳项明
2023-03-14

Spring 4.1.4 Hibernate 4.2.0 JDK 1.8

我的上下文:我有一个控制器调用-->Service-->调用Dao业务功能是删除(在1到许多DB关系中)一些子级,但不是所有子级。然后,在删除了一些子项之后,我尝试删除父项,然后我得到了java.sql.SqlIntegrityConstraintViolationException

@Transactional(noRollbackFor = SQLIntegrityConstraintViolationException.class)
public void delete() {
    FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Data deleted.","");
    
    try{
        memoTemplateService.delete(memoTemplate);
        memoTemplates.remove(memoTemplate);
    }
    catch (Exception e){
        msg=new FacesMessage(FacesMessage.SEVERITY_WARN, "A","B");
    }
    reset();

    
    FacesContext.getCurrentInstance().addMessage(null, msg);
}
@Override
@Transactional(noRollbackFor =  {SQLIntegrityConstraintViolationException.class,DBConstraintException.class})
public void delete(MemoTemplate memoTemplate)throws BusinessException {
    // deleting some ,not all , child 
    phaseAndMemoGenerator.deleteMemosForVisibleTimeHorizon(memoTemplate);
    try{// some times Template cannot be deleted
        memoTemplateDao.delete(memoTemplate);
    }
    catch (Exception e){
        throw new DBConstraintException("Partial Delete", "Template cannot be deleted, Memo in the past are present");
    }
}
@Repository(value = "memoTemplateDao")
public class MemoTemplateDaoImpl extends GenericJpaDaoImpl<MemoTemplate,  Long> implements MemoTemplateDao {

@Override
@Transactional(noRollbackFor = SQLIntegrityConstraintViolationException.class)
public void delete(MemoTemplate t) {
    super.delete(t);
    em.flush();
}
}
@Transactional(noRollbackFor = {SQLIntegrityConstraintViolationException.class,PersistenceException.class})
public void tryToDelete(MemoTemplate t)throws Exception {
    super.delete(t);
    try{
        em.flush();
    }
    catch (Exception e){
        throw new Exception("ddddd");
    }
}

共有1个答案

慕乐池
2023-03-14

如果在DB中定义了约束,您将无法通过提交而不回滚来绕过它们。

 类似资料:
  • 我正在与用propagation.requires_new注释的方法的奇怪行为作斗争。 以下是TransactionManager的日志:

  • 情景故事时间: 我“继承”了一个程序,一个用于访问数据库的相当简单的webservice。该程序在某个地方有一个缺陷:它试图更新一个没有更新授权的表。该程序只具有更新数据库队列的权限(Oracle),以保存谁访问了什么信息。这是不受欢迎的行为,现在我纠正了它。注意:这与这个问题本身无关,它只是导致我提出这个问题的原因。 该程序使用Spring+Hibernate来管理和访问数据和事务。 因为程序的

  • 我正在使用Spring引导 1.3 开发一个 spring 应用程序 我有一个类似这样的MVC请求处理程序: 这是它的集成测试 删除了一些位以留出空间,但请注意顶部的@Transactional注释 它运行和通过没有线: 但是当添加它时,它给出了这个讨厌的异常,这是一个bean验证异常,没有任何数据插入操作(Spring mvc已经处理的验证错误和BindingResault中的结果) 当我在类级

  • 我们使用CDI和CMT(容器管理事务)连接到web应用程序中的数据库,并标记从前端调用的方法,这些方法需要使用以下事务: 这将创建一个新的CDI事务,但是现在如果在执行此代码块或从此方法调用的任何其他代码块时发生异常,它将抛出错误消息: 有没有办法让CDI重新抛出嵌套错误,以便您可以轻松地调试回滚的真正原因是什么? (在 Java-EE7、Glassfish 4.0、JSF 2.2.2 上运行)

  • -ZJ 以下是我在Application.Properties中的数据源设置:

  • 在我开始这看似很长的一段之前,我想对我可能收到的任何建议/建议表示感谢。朱约翰 我开发了一个简单的测试来帮助我理解spring的声明性(@Transactional)事务管理框架如何与spring的RESTful web服务结合使用。 为此,我开发了以下RESTful控制器: 其中,“tester”是以下服务类的bean,并自动连接到此控制器。类中唯一的方法是事务性的: 在上面,GenericDB