数据完整性约束错误

      近期项目中又遇到了外键关联的问题。虽然之前的项目处理过类似错误,但是没有搞清楚是为什么报错,这此大概搞清楚了到底是什么情况。

      情形: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();
}

 

posted @ 2016-11-10 23:01  宣室夜  阅读(1496)  评论(0编辑  收藏  举报