Caused by: java.sql.BatchUpdateException: Data truncation: Data too long for column ‘FBZipLoc’ at row 1
at com.MysqL.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1527)
at com.MysqL.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1065)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
… 12 more
是否可能自动截断所有字段的数据.
或任何其他方式来处理这个问题.
但是我不想检查所有字段的数据长度,因为我有超过一千个字段.
解决方法
我认为你唯一的选择是…
>更改列定义.使它成为一个更大的varchar字段,甚至可能是一个文本字段.只需更改列定义就可以在几次点击中修复这个问题,花点时间来构建一个魔术工具.我建议这样做!
>我可以看到你使用某种方面拦截setter,然后调整字符串的大小,如果它大于x长度.这将是您代码中处理最快的原因.如果更改数据库不是一个选项,并且您有成千上万的字段,这将是我的下一个选择.
>构建一个可以重新调整字符串大小的String util类
setText(String val){this.text = StringUtil.truncate(val,size);}
[UPDATE]
因为你不能真正更新数据库,我会推荐一个方面来拦截String setter并检查它们的长度,可能看起来像这样(语法可能是关闭的,我没有测试这个)…
private static final MAX_SIZE_OF_STRINGS = 255; @Around("execution(* your.package.*.set*(..)) && args(java.lang.String)") public void checkAroundSetter(final ProceedingJoinPoint pjp) throws Throwable { Object[] args = pjp.getArgs(); for (int i = 0; i < args.length; i++) { if (args[i] instanceof String && ((String) args[i]).size() > MAX_SIZE_OF_STRINGS) { args[i] = ((String)args[i]).subString(0,MAX_SIZE_OF_STRINGS) ; } } pjp.proceed(args); }
而且,如果某个层必须检查定义的列大小与每个插入的表中的所有数据相匹配,那么将会有额外的开销.