zoukankan      html  css  js  c++  java
  • 数据完整性约束错误

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

          情形: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();
    }
  • 相关阅读:
    yii2.0安装redis
    composer
    Windows下安装redis
    Windows下启动redis闪退
    svn的使用及安装
    mysql主从
    linux下远程链接mysql报错1045
    git命令行克隆报错fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
    git克隆报错128
    yii phpexcel <转>
  • 原文地址:https://www.cnblogs.com/lyr-notebook/p/6052778.html
Copyright © 2011-2022 走看看