1.升级版本
hibernate-core:4.3.9 升级为hibernate-core:5.5.4
2.遇到的问题
问题描述
升级后的主键冲突异常-ConstraintViolationException ,没有被捕捉到,因为hibernate5相较于之前的版本抛出的异常是其父类-PersistenceException(严格说是父类的父类的父类)。
ConstraintViolationException 的父类为JDBCException;
JDBCException的父类为HibernateException;
HibernateException的父类为PersistenceException。
详情
捕捉异常代码如下:
catch (ConstraintViolationException e) { if (tx != null) { tx.rollback(); } throw new EntityExistException("已存在相同XXX信息,无法添加!", e); }
升级hibernate5之前,捕捉的异常如图:
升级后,捕捉的异常如图:
3.解决方法
判断是可以使用e.getCause()判断
方法一
catch (PersistenceException e) { if (tx != null) { tx.rollback(); } if (e.getCause() instanceof ConstraintViolationException) { throw new EntityExistException("已存在相同XXX信息,无法添加!", e); } else { throw e; } }
方法二
catch (PersistenceException e) { if (tx != null) { tx.rollback(); } if (e.getCause().getCause().getMessage().contains("某某主键名")) { throw new EntityExistException("已存在相同的XXX,请联系XXX!", e); } else { throw e; } }
大家如果有更好的方法,欢迎在评论区赐教!!!