Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Spring数据JPA避免意外的回滚异常_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

使用Spring数据JPA避免意外的回滚异常

使用Spring数据JPA避免意外的回滚异常,spring,hibernate,jpa,spring-data-jpa,Spring,Hibernate,Jpa,Spring Data Jpa,我有一个包含SpringBoot(2.3.3.RELEASE)、SpringDataJPA(2.3.3.RELEASE)和Hibernate(5.4.20)的项目 我正在尝试从DataIntegrityViolationException恢复,这是在尝试保存违反数据库约束的实体后发生的。例如: @Transactional 公共无效剂量测定法(){ //将一些数据保存到数据库中 试一试{ 用户=新用户(); user.setName(“测试”); //此方法因约束而失败 userService.

我有一个包含SpringBoot(2.3.3.RELEASE)、SpringDataJPA(2.3.3.RELEASE)和Hibernate(5.4.20)的项目

我正在尝试从DataIntegrityViolationException恢复,这是在尝试保存违反数据库约束的实体后发生的。例如:

@Transactional
公共无效剂量测定法(){
//将一些数据保存到数据库中
试一试{
用户=新用户();
user.setName(“测试”);
//此方法因约束而失败
userService.save(用户);
}捕获(DataIntegrityViolationException e){
LOGGER.info(“捕获异常。正在尝试恢复…”,e);
}
//继续做其他事情
}
正如我捕获到的异常一样,当
doSomething
方法结束时,我希望Spring会提交更改。但是,Spring抛出以下异常:

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
据我所知,Hibernate仅在发生完整性冲突时才将事务标记为回滚,因此Spring中止了事务

我试图通过在
userService.save
方法中添加带有
norollboor
属性的
@Transactional
注释来避免这种行为,但在这种情况下它没有用

我可以为
userService.save
方法创建一个新事务,添加
@Transactional(propagation=propagation.REQUIRES_new)
注释。但是,我希望在同一事务中保留所有更改

使用普通JDBC,从
DataIntegrityViolationException
中恢复并提交更改是没有问题的。有没有办法用Hibernate改变这种行为


我在Github中创建了一个演示项目来检查这种行为:

尝试使用
userRepository.save(user)
而不是
userRepository.saveAndFlush(user)
我不明白!事务中存在数据集成问题,您希望hibernate毫无例外地提交它吗?不可能。您还可以捕获意外的回滚异常,然后执行一些操作@alexvaluiskyi此更改只会推迟错误。谢谢你的建议。@OnurBaştürk问题是,在这个用例中插入可能存在完整性问题。如果发生完整性错误,我不想中止整个用例。因此,我捕获异常并继续执行该方法,并在该方法完成后提交更改。我原以为Spring会执行提交,但它在Hibernate中不起作用。确实,这种情况不太可能发生,但我可以用jdbc而不是hibernate来管理它。我明白了!然后您可以将该方法分为两种方法。在另一个事务方法中保存其他方法。然后在另一个事务中调用user save方法尝试使用
userRepository.save(user)
而不是
userRepository.saveAndFlush(user)
我不明白!事务中存在数据集成问题,您希望hibernate毫无例外地提交它吗?不可能。您还可以捕获意外的回滚异常,然后执行一些操作@alexvaluiskyi此更改只会推迟错误。谢谢你的建议。@OnurBaştürk问题是,在这个用例中插入可能存在完整性问题。如果发生完整性错误,我不想中止整个用例。因此,我捕获异常并继续执行该方法,并在该方法完成后提交更改。我原以为Spring会执行提交,但它在Hibernate中不起作用。确实,这种情况不太可能发生,但我可以用jdbc而不是hibernate来管理它。我明白了!然后您可以将该方法分为两种方法。在另一个事务方法中保存其他方法。然后在另一个事务中调用用户保存方法