1

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

因此我使用以下方法:

  1. 尝试保存
  2. 如果得到DataException,然后我将对象中的字段截断为 db 定义中指定的最大长度,然后再次尝试保存。

但是,在截断后的第二次保存中,出现以下异常:

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(); 
    }
}    
4

2 回答 2

1

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

也可以看看:

于 2012-09-16T09:48:51.590 回答
0

休眠文档非常清楚,一旦引发异常,会话将处于不一致状态,因此无法安全用于进一步操作。我怀疑你在这里得到的是会话剩下一半来保存你的第一次尝试所以坏事发生了。

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

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

于 2012-09-16T09:52:26.797 回答