TV *_*ath 3 java spring hibernate spring-data spring-data-jpa
我正在使用 org.springframework.data.jpa.repository.JpaRepository 保存方法来保存实体。我认为 save 方法来自 CrudRepository 接口。我正在从服务类调用此保存方法。
try {
studentLog = studentsLogRepository.save(studentLog);
} catch (DataIntegrityViolationException dive) {
LOGGER.warn("Constraint violation occurred. Cannot insert the same record twice.", dive);
}
Run Code Online (Sandbox Code Playgroud)
但问题是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]...
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)
我什至尝试捕获无效的 ConstraintViolationException。我认为 Spring Data 将数据层异常包装到 DataAccessException,在这种情况下是它的子类 DataIntegrityViolationException。那么为什么异常没有被捕获?我的服务方法没有注释@Transactional
发生的事情是,在调用该方法时.save(),Spring 在后台告诉EntityManager将实体持久化,这只会使其在持久化上下文中受到管理和持久化,但是实体中的更改可能不会立即与数据库同步状态(取决于配置的刷新模式),因此在发出刷新或提交命令之前,还不会抛出异常。所以你可以尝试调用.saveAndFlush()强制数据库同步。这样异常就会立即抛出。
为了进一步理解 Spring 如何处理事务管理,我会留下一个有用的链接:事务管理
| 归档时间: |
|
| 查看次数: |
4170 次 |
| 最近记录: |