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

Spring数据-无法捕获服务层中的DataIntegrityViolationException

凌华奥
2023-03-14

我正在使用org.springframework.data.jpa.repository.JpaRepository保存方法来保存一个实体。我认为保存方法来自CrudRepository接口。我从服务类调用这个保存方法。

try {
    studentLog = studentsLogRepository.save(studentLog);        
} catch (DataIntegrityViolationException dive) {
    LOGGER.warn("Constraint violation occurred. Cannot insert the same record twice.", dive);
}

但问题是< code > DataIntegrityViolationException 在catch块中没有被捕获。相反,我在下面的日志中看到。

java.sql.BatchUpdateException: ORA-00001: unique constraint (QA_VPP.UX_TVPPC_TRAN_LOG_1) violated
        at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10296) ~[ojdbc6-11.2.0.2.0.jar:11.2.0.2.0]
        at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:216) ~[ojdbc6-11.2.0.2.0.jar:11.2.0.2.0]
        at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297) ~[commons-dbcp-1.3.jar:1.3]
        at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297) ~[commons-dbcp-1.3.jar:1.3]
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) ~[hibernate-core-3.6.7.Final.jar:3.6.7.Final]...

2016-12-28 10:13:52,655 LL="DEBUG" CR="1_1482920032_407_357_l73q069_VPP" RE="1482920032407" DE="1" TR="tomcat-http--12" LN="o.s.o.j.JpaTransactionManager"  Initiating transaction rollback after commit exception
org.springframework.orm.jpa.JpaSystemException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
        at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:321) ~[spring-orm-3.2.9.RELEASE.jar:3.2.9.RELEASE]
        at org.springframework.orm.jpa.DefaultJpaDialect.translateExceptionIfPossible(DefaultJpaDialect.java:121) ~[spring-orm-3.2.9.RELEASE.jar:3.2.9.RELEASE]
        at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ~[spring-orm-3.2.9.RELEASE.jar:3.2.9.RELEASE]
        at 

我甚至尝试捕获ConstraintViolationException,但没有成功。我认为spring数据将数据层异常包装为DataAccessException,在本例中是其子类DataIntegrityViolationException。那么,为什么没有发现异常呢?我的服务方法未使用@Transactional注释

共有2个答案

夏侯昆琦
2023-03-14

在处理较低级别的持久性异常时从Spring异常转换机制引发的异常。所以直到事务提交没有完成,所以需要在范围之外捕获

TODO服务类示例

studentLog = studentsLogRepository.save(studentLog);        

Catch at controller class
try {
    call student service     
} catch (DataIntegrityViolationException dive) {
    LOGGER.warn("Constraint violation occurred. Cannot insert the same record twice.", dive);

或使用全局异常处理程序使用控制器建议执行相同的操作

微生阳平
2023-03-14

发生的事情是,当调用方法. sav()时,Spring在幕后告诉EntityManager持久化实体,这只会使其在持久化上下文中受到管理和持久化,但是您的实体中的更改可能不会立即与DB状态同步(取决于您配置的刷新模式),因此在发出刷新或提交命令之前,不会抛出任何异常。因此,您可以尝试调用. saveAndFlush()来强制DB同步。这样异常将立即抛出。

为了进一步理解Spring如何处理事务管理,我将留下一个有用的链接:事务管理

 类似资料:
  • 尝试使用ControllerAdvice处理DataIntegrityViolationException并使用Spring Boot v1.3.3和Spring Data REST v2.4.4返回自定义响应。以下是我的课程: ExceptionControllerAdvice.java 但我得到的是404状态,而不是这个响应: {“时间戳”:1463382639043“状态”:404“错误”:

  • 在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

  • 在我的项目中,我在进行单元测试时遇到了问题。一个问题是,仅仅进行联调就可以更快地编写,并且还可以测试组件是否真正协同工作。单元测试新颖的“算法”之类的似乎要容易得多。单元测试服务类感觉是错误和无用的。 我使用mockito来模拟spring数据存储库(以及DB访问)。问题是,如果我告诉模拟存储库在方法调用getById时返回实体A,它显然会返回实体A,服务也会返回实体A。是的,该服务做了一些额外的

  • 我是android开发的新手。我正在开发一个简单的应用程序,其中包含1个活动,1个广播接收器和1个通知服务。有些警报设置在活动中,我想在设备启动/重启时重新设置它们。 下面是我在MainActivity中的代码: 我从活动中设置的警报中正确地获取所有通知。但获取NullpointerException 这是我从意图中读到额外内容的地方。我错过了什么?任何帮助都很感激。 附言。所有必要的权限都在清单

  • 通过使用JMockit@Capture,它无法捕获对任何Spring数据jpa存储库方法的调用。 然而,通过替换 用户存储库 具有 代码库 在测试类中,JMockit能够拦截对JpaRepository接口中可用的任何方法的调用,如findOne()或findAll()。 但它无法捕获对扩展JpaRepository的自定义存储库方法的调用,比如findByName()。 尽管基于JMockit状

  • 问题内容: 我需要有关Spring AOP的帮助。我有以下代码: application-context.xml application-context-aop.xml 当我尝试在Tomcat上加载应用程序时,出现以下异常: 我在Web层具有与记录我的应用程序相同的配置,并且工作正常,但是当我将AOP放在Service层时,会遇到此异常。 我正在使用Spring MVC,并在web.xml上配置了