java – 在Hibernate中正确处理长数据

前端之家收集整理的这篇文章主要介绍了java – 在Hibernate中正确处理长数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在hibernate中收到一个数据太大的问题.那是-

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

是否可能自动截断所有字段的数据.
或任何其他方式来处理这个问题.
但是我不想检查所有字段的数据长度,因为我有超过一千个字段.

解决方法

从我所知道的,Hibernate或 MySQL实际上没有办法自动截断字符串,而没有添加逻辑来处理这个.我相信这样的东西不存在的原因是,我永远不会想要我被要求插入到数据库中,而不是真正插入的内容.

我认为你唯一的选择是…

>更改列定义.使它成为一个更大的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);
}

而且,如果某个层必须检查定义的列大小与每个插入的表中的所有数据相匹配,那么将会有额外的开销.

原文链接:https://www.f2er.com/java/124711.html

猜你在找的Java相关文章