Mysql
 sql >> Database >  >> RDS >> Mysql

Gestire correttamente i dati lunghi in Hibernate

Da quello che so non c'è davvero modo per Hibernate o MySQL di troncare automaticamente le stringhe senza che tu aggiunga la logica per gestirlo. Il motivo per cui credo che qualcosa del genere non esista è che non vorrei mai che ciò che ho chiesto di inserire in un database fosse diverso da ciò che è stato effettivamente inserito.

Penso che le tue uniche opzioni siano...

  1. Modifica le definizioni delle colonne. Rendilo un campo varchar più grande o forse anche un campo di testo. Non perdere tempo a costruire uno strumento magico quando la semplice modifica della definizione della colonna risolverebbe il problema in un paio di clic. Consiglio di farlo!

  2. Potrei vederti usare una sorta di aspetto per intercettare i setter e quindi regolando la dimensione della stringa se è maggiore di x lunghezza. Questo sarebbe il motivo più veloce per gestirlo nel tuo codice. Se la modifica del DB non è un'opzione e hai migliaia di campi, questa sarebbe la mia prossima scelta.

  3. Crea un'utilità String classe che può ridimensionare le tue stringhe...

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

[AGGIORNAMENTO] Dal momento che non puoi davvero aggiornare il database, consiglierei un aspetto per intercettare i setter di stringhe e controllarne la lunghezza potrebbe sembrare così (la sintassi potrebbe essere disattivata e non l'ho testato)...

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

Inoltre, ci sarebbe un sovraccarico aggiuntivo se un livello dovesse controllare la dimensione della colonna definita rispetto a tutti i dati che entrano nella tabella su ciascun inserto.