数据完整性约束错误
近期项目中又遇到了外键关联的问题。虽然之前的项目处理过类似错误,但是没有搞清楚是为什么报错,这此大概搞清楚了到底是什么情况。
情形:A类主键aId是B类外键bId,在数据库中设置了外键约束,删除时约束,更新时级联。程序中删除时报错org.hibernate.exception.ConstraintViolationException......这个错误违反数据库约束的时候就会报,现在只是报这个错误的一个情形。
在网上查询解决方法后发现,设置约束要么交给Hibernate管理,要么交给数据库管理,否则就会报错。交给Hibernate管理时,数据库不需要设置外键,设置映射文件中cascade属性如下一种:
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点
然而现在我是要删除和更新分开处理,我就不会使用hibernate设置了,只好交给数据库管理,这时候程序中不处理就会报错。
首先,使用原生的SQL语句写删除方法,否则hibernate中肯定会打印错误的,另外在删除方法中catch到ConstraintViolationException,就可以进行自己想要的处理了。如:
try { System.out.println(findObjectById(id) +"..."); getSession().delete(findObjectById(id)); } catch (Throwable e) { Throwable cause = e.getCause(); if(cause instanceof ConstraintViolationException) { throw new SysException("111"); } }
另外附上原生的删除方法:
public void delete2(Serializable id) throws SysException { CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_MYSQL; String className = clazz.getSimpleName(); String[] classId = Constant.Table_Entity_MAP.get(className).split("_"); String sql = "DELETE FROM " + Constant.Table_Entity_MAP.get(className) +" WHERE " +classId[1]+"Id = ?"; SQLQuery query = getSession().createSQLQuery(sql); query.setParameter(0,id); query.executeUpdate(); }