使用hibernate将对象保存到数据库时,有时会失败,因为对象中的某些字段超出了数据库中定义的最大varchar
长度。
因此我使用以下方法:
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();
}
}
答案 0 :(得分:1)
所有Hibernate异常(NonUniqueResultException
除外)都是不可恢复的。如果您收到异常,则应关闭会话并打开另一个会话以进行进一步操作。
另见:
答案 1 :(得分:0)
hibernate documentaiton非常清楚,一旦抛出异常,会话将处于不一致状态,因此不能安全地用于进一步的操作。我怀疑你在这里得到的结果是会议剩下一半,这样可以避免你的第一次尝试发生这么糟糕的事情。
从根本上说,您不应该依赖数据库错误来检查字段的长度,而应该在java代码中预先验证它。如果你知道长度足以截断,那么我建议你每次只需要调用你的trucate util。
或者使用Hibernate Validator在保存之前以声明方式验证对象。