Правильная обработка длинных данных в Hibernate - PullRequest
10 голосов
/ 30 июля 2011

Я получаю слишком большие данные в спящем режиме. то есть -

Вызвано: java.sql.BatchUpdateException: усечение данных: слишком длинные данные для столбца FBZipLoc в строке 1 at com.mysql.jdbc.PreparedStatement.executeBatchSerially (PreparedStatement.java:1527) в com.mysql.jdbc.PreparedStatement.executeBatch (PreparedStatement.java:1065) в org.hibernate.jdbc.BatchingBatcher.doExecuteBatch (BatchingBatcher.java:58) в org.hibernate.jdbc.AbstractBatcher.executeBatch (AbstractBatcher.java:195) ... еще 12

Возможно ли автоматическое усечение всех данных поля. или любой другой способ справиться с этой проблемой. но я не хочу проверять длину данных всех полей, потому что у меня более тысячи полей.

Ответы [ 3 ]

4 голосов
/ 30 июля 2011

Из того, что я знаю, Hibernate или MySQL на самом деле не могут автоматически обрезать строки без добавления логики для обработки этого.Причина, по которой я бы поверил, что чего-то подобного не существует, заключается в том, что я бы никогда не хотел, чтобы то, что я просил вставить в базу данных, отличалось от того, что было вставлено на самом деле.

Я думаю, что ваши единственные варианты ...

  1. Изменить определения столбцов. Сделать это поле большего размера varchar или, возможно, даже текстовое поле,Не тратьте время на создание магического инструмента, когда просто измените определение столбца, чтобы исправить это за пару кликов.Я рекомендую сделать это!

  2. Я мог бы видеть, как вы используете какой-то аспект для перехвата сеттеров, а затем корректируете размер строки, если она больше длины x,Это было бы самым быстрым, почему бы обработать это в вашем коде.Если изменение БД не вариант, и у вас есть тысячи полей, это будет мой следующий выбор.

  3. Создание класса String Util , который может изменить размер ваших строк ...

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

[ОБНОВЛЕНИЕ] Поскольку вы не можете действительно обновить базу данных, я бы порекомендовал аспект для перехвата установщиков String и проверкиих длина может выглядеть так (синтаксис может быть отключен, и я не проверял это) ...

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

Кроме того, могут возникнуть дополнительные издержки, если какой-то слой должен будет проверить определенный размер столбцапротив всех данных, поступающих в таблицу при каждой вставке.

2 голосов
/ 30 июля 2011

Для этого вы можете использовать Перехватчик Hibernate .Это позволит вам изменить состояние вашего объекта непосредственно перед его сохранением.Вы можете легко обрезать свои строки на основе определенных столбцов или определенных типов, которые вы сохраняете.

0 голосов
/ 29 мая 2013

Вы можете настроить MySQL для усечения данных, если вы действительно этого хотите:

Если режим строгого SQL не включен, и вы присваиваете столбцу CHAR или VARCHAR значение, которое превышает максимальную длину столбца, значение усекается, чтобы соответствовать, и генерируется предупреждение. Для усечения непространственных символов вы можете вызвать ошибку (а не предупреждение) и запретить вставку значения, используя строгий режим SQL. См. Раздел 5.1.7, «Режимы SQL сервера» .

Однако это не рекомендуется для производственной базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...