java - Hibernate 异常没有被捕获
问题描述
我面临的问题是每个 try catch 块都被忽略了。
我有这样的结构:
void A(){
// some logic
try{
service.createItem(...);
}catch(Exception e){
System.out.println("blabla...");
}
}
service$createItem(...){
// some logic - building item.
try{
dao.saveItem( item );
}catch(Exception e){
throw new IllegalArgumentException("bla bla");
}
}
dao$saveItem(Item item){
Session session = sessionFactory.getCurrentSession();
session.save(item);
}
项目是独一无二的,但是即使我尝试插入重复项,而不是捕获异常并打印“bla bla”,它只会打印整个堆栈跟踪——就像根本没有处理异常一样。
调试显示它甚至没有跳转到A
方法的catch块中,我以前没有遇到过这样的事情,有人遇到过这种情况吗?
什么可能导致问题?
谢谢!
堆栈跟踪:
使用者:org.hibernate.exception.ConstraintViolationException:无法在 org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) 处执行语句~[hibernate-core-5.3.2.Final.jar:5.3。 2.Final] 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.engine。 jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper .java:99) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178) ~[hibernate-核心 5.3.2.Final.jar:5.3.2。Final] 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3167) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.persister.entity。 AbstractEntityPersister.insert(AbstractEntityPersister.java:3682) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:90) ~ [hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) ~[hibernate-core-5.3.2.Final. jar:5.3.2.Final] 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org. hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)〜[休眠核心5.3.2.Final.jar:5.3.2.Final]在org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)〜[休眠核心5.3.2 .Final.jar:5.3.2.Final] 在 org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org .hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:511) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:第3283章~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]在org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2479)~[hibernate-core-5.3.2.Final .jar:5.3.2.Final] 在 org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl。beforeTransactionCompletion(JdbcCoordinatorImpl.java:473) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java :178) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39) ~ [hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271) ~[hibernate- core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.engine.transaction。internal.TransactionImpl.commit(TransactionImpl.java:98) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:609 ) ~[spring-orm-5.0.7.RELEASE.jar:5.0.7.RELEASE] ... 35 更多原因:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 键的重复条目 '2-1' sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 的“PRIMARY”~[?:1.8.0_121] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)~[?:1.8.0_121] 在 sun.reflect .DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_121] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_121] 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.46.jar:5.1.46] 在 com.mysql.jdbc.Util.getInstance(Util. java:408) ~[mysql-connector-java-5.1.46.jar:5.1.46] at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936) ~[mysql-connector-java-5.1.46 .jar:5.1.46] 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976) ~[mysql-connector-java-5.1.46.jar:5.1.46] 在 com.mysql.jdbc.MysqlIO .checkErrorPacket(MysqlIO.java:3912) ~[mysql-connector-java-5.1.46.jar:5.1.46] at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector- java-5.1.46.jar:5.1.46] 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46] 在 com. mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:第2486章~[mysql-connector-java-5.1.46.jar:5.1.46]在com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)~[mysql-connector-java-5.1.46.jar :5.1.46] 在 com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079) ~[mysql-connector-java-5.1.46.jar:5.1.46] 在 com.mysql.jdbc.PreparedStatement.executeUpdateInternal (PreparedStatement.java:2013) ~[mysql-connector-java-5.1.46.jar:5.1.46] at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104) ~[mysql-connector-java- 5.1.46.jar:5.1.46] 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998) ~[mysql-connector-java-5.1.46.jar:5.1.46] 在 org.hibernate。 engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3167) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org. hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3682) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction .java:90) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) ~[hibernate-core- 5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478) ~[hibernate-core-5.3.2.Final.jar:5.3.2 .Final] 在 org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)〜[休眠核心5.3.2.Final.jar:5.3.2.Final]在org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)〜[休眠核心5.3.2 .Final.jar:5.3.2.Final] 在 org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org .hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:511) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:第3283章~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]在org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2479)~[hibernate-core-5.3.2.Final .jar:5.3.2.Final] 在 org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl。beforeTransactionCompletion(JdbcCoordinatorImpl.java:473) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java :178) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39) ~ [hibernate-core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271) ~[hibernate- core-5.3.2.Final.jar:5.3.2.Final] 在 org.hibernate.engine.transaction。internal.TransactionImpl.commit(TransactionImpl.java:98) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final] at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:609 ) ~[spring-orm-5.0.7.RELEASE.jar:5.0.7.RELEASE] ... 35 更多
引起:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:键“PRIMARY”的重复条目“2-1”
解决方案
您无法以这种方式捕获它的原因是在事务刷新期间出现异常,而不是在 try-catch 或保存块期间出现。
也许考虑在尝试再次保存之前检查记录是否存在于数据库中?
因此,要解决该问题,您必须对事务的类/方法进行尝试捕获,或者将事务移动到保存到数据库的类。
推荐阅读
- ios - iOS 14 设备上的离子服务。错误“无效服务”
- security - Symfony 4.4 多个提供商的多个防火墙安全性
- c# - C# - 解码服务器响应(MSN、LSN)
- c# - Apache Ignite 中的通用 UTC DateTime 序列化
- swiftui - 选择后如何正确显示 SwiftUI 菜单中的选定项目?
- ios - 未从我们的企业站点安装企业应用程序(无法安装“--- 应用程序”请稍后重试)
- python - FocusOut 事件触发两个回调而不是 Python/Tkinter 中的预期一个
- javascript - 形状不定的物体
- javascript - Javascript 客户端页面不捕获 Python Flask 发出信号
- php - MySQL 如何在 INSERT INTO SELECT 查询中使用动态 PHP 变量?