Из того, что я знаю, Hibernate или MySQL на самом деле не могут автоматически обрезать строки без добавления логики для обработки этого.Причина, по которой я бы поверил, что чего-то подобного не существует, заключается в том, что я бы никогда не хотел, чтобы то, что я просил вставить в базу данных, отличалось от того, что было вставлено на самом деле.
Я думаю, что ваши единственные варианты ...
Изменить определения столбцов. Сделать это поле большего размера varchar или, возможно, даже текстовое поле,Не тратьте время на создание магического инструмента, когда просто измените определение столбца, чтобы исправить это за пару кликов.Я рекомендую сделать это!
Я мог бы видеть, как вы используете какой-то аспект для перехвата сеттеров, а затем корректируете размер строки, если она больше длины x,Это было бы самым быстрым, почему бы обработать это в вашем коде.Если изменение БД не вариант, и у вас есть тысячи полей, это будет мой следующий выбор.
Создание класса 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);
}
Кроме того, могут возникнуть дополнительные издержки, если какой-то слой должен будет проверить определенный размер столбцапротив всех данных, поступающих в таблицу при каждой вставке.