• 数据完整性约束错误


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

          情形: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();
    }
  • 相关阅读:
    SDWebImage内存性能优化
    dataGridView1数据导出
    listView数据导出
    sqlserver定时备份
    C#-IniFiles文件配置连接数据库
    (转)线程同步详解
    C#工具类:Json操作帮助类(转载)
    c#实现验证码功能
    屏蔽F12审查元素,禁止使用右键菜单
    c# excel如何导入到sqlserver数据库
  • 原文地址:https://www.cnblogs.com/lyr-notebook/p/6052778.html
Copyright © 2020-2023  润新知