hibernate:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException

时间:2012-09-16 09:35:47

标签: mysql hibernate

使用hibernate将对象保存到数据库时,有时会失败,因为对象中的某些字段超出了数据库中定义的最大varchar长度。

因此我使用以下方法:

  1. 尝试保存
  2. 如果获得DataException,我会将对象中的字段截断为db定义中指定的最大长度,然后再次尝试保存。
  3. 但是,在截断后的第二次保存中,我遇到以下异常:

    hibernate: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
    

    以下是相关代码,你注意到它有什么问题吗?

    public static void saveLenientObject(Object obj){
    
        try {
            save2(rec);
        } catch (org.hibernate.exception.DataException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    
    
            saveLenientObject(rec, e);
    
    
    
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    
    
    }
    private static void saveLenientObject(Object rec, DataException e) {
        Util.truncateObject(rec);
        System.out.println("after truncation ");
        save2(rec);
    
    }
    public static void save2(Object obj) throws Exception{
        try{
            beginTransaction();
            getSession().save(obj);
    
            commitTransaction();
    
        }catch(Exception e){
            e.printStackTrace();
            rollbackTransaction();
            //closeSession();
            throw e;
        }finally{
            closeSession(); 
        }
    }    
    

2 个答案:

答案 0 :(得分:1)

所有Hibernate异常(NonUniqueResultException除外)都是不可恢复的。如果您收到异常,则应关闭会话并打开另一个会话以进行进一步操作。

另见:

答案 1 :(得分:0)

hibernate documentaiton非常清楚,一旦抛出异常,会话将处于不一致状态,因此不能安全地用于进一步的操作。我怀疑你在这里得到的结果是会议剩下一半,这样可以避免你的第一次尝试发生这么糟糕的事情。

从根本上说,您不应该依赖数据库错误来检查字段的长度,而应该在java代码中预先验证它。如果你知道长度足以截断,那么我建议你每次只需要调用你的trucate util。

或者使用Hibernate Validator在保存之前以声明方式验证对象。