Z tego, co wiem, nie ma możliwości, aby Hibernate lub MySQL automatycznie obcinały ciągi bez dodawania logiki, aby to obsłużyć. Powodem, dla którego mógłbym wierzyć, że coś takiego nie istnieje, jest to, że nigdy nie chciałbym, aby to, o co prosiłem, aby zostało wstawione do bazy danych, różniło się od tego, co zostało wstawione w rzeczywistości.
Myślę, że twoje jedyne opcje to...
-
Zmień definicje kolumn. Ustaw większe pole varchar, a może nawet pole tekstowe. Nie trać czasu na tworzenie magicznego narzędzia, ponieważ sama zmiana definicji kolumny naprawi to za pomocą kilku kliknięć. Polecam to zrobić!
-
Widziałem, jak używasz jakiegoś aspektu do przechwycenia ustawiaczy, a następnie dostosowując rozmiar łańcucha, jeśli jest większy niż x długość. To byłby najszybszy powód, aby obsłużyć to w swoim kodzie. Jeśli zmiana DB nie wchodzi w grę, a masz tysiące pól, byłby to mój następny wybór.
-
Zbuduj narzędzie String klasa, która może zmienić rozmiar twoich ciągów...
setText(String val){this.text =StringUtil.truncate(val,size);}
[AKTUALIZACJA] Ponieważ tak naprawdę nie możesz zaktualizować bazy danych, polecam aspekt przechwycenia seterów ciągów i sprawdzenia ich długości, może to wyglądać tak (składnia może być wyłączona, a ja tego nie testowałem)...
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);
}
Ponadto, byłoby dodatkowe obciążenie, gdyby jakaś warstwa musiała sprawdzić zdefiniowany rozmiar kolumny ze wszystkimi danymi przychodzącymi do tabeli przy każdym wstawieniu.