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

标签 java mysql 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 确实无法自动截断字符串。我相信这样的东西不存在的原因是我永远不希望我要求插入数据库的内容与实际插入的内容不同。

我认为你唯一的选择是......

  1. 更改列定义。使其成为更大的 varchar 字段,甚至可以是文本字段。不要花时间构建一个神奇的工具,只要更改列定义就可以通过几次点击来解决这个问题。我建议这样做!

  2. 我可以看到您使用某种 aspect 来拦截 setter,然后在字符串大于 x 长度时调整其大小。这将是在您的代码中处理它的最快的原因。如果更改数据库不是一种选择,并且您有数千个字段,这将是我的下一个选择。

  3. 构建一个 String util 类,它可以重新调整字符串大小...

    setText(String val){this.text = StringUtil.truncate(val,size);}

[更新] 由于您无法真正更新数据库,因此我建议使用一个方面来拦截字符串 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);
}

此外,如果某个层必须根据每次插入时进入表的所有数据检查定义的列大小,则会产生一些额外的开销。

关于java - 在 Hibernate 中正确处理长数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6882009/

相关文章:

java - 项目构建良好,但为什么 JUnit 测试失败?

PHP:调用 bool 值上的成员函数 format()...什么

mysql - 如何建模一个页面可以有不同内容类型的数据库?

java - 如何在 hibernate 4.3 Integrator 中获取 JDBC 连接?

java - Hibernate 代理对象包含什么?

java - 等待 lambda 完成的正确方法

java - 自定义 TransferHandler 的 D&D 和 CCP 问题

php - xmlHttpRequest 检查 mysql 数据库中的更改

Hibernate (JPA) 级联 - 从 child 那里检索 id

java - 生成的没有 setter 的 Web 服务客户端类