Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Korrekter Umgang mit langen Daten in Hibernate

Soweit ich weiß, gibt es für Hibernate oder MySQL wirklich keine Möglichkeit, Zeichenfolgen automatisch abzuschneiden, ohne dass Sie die Logik hinzufügen, um dies zu handhaben. Der Grund, warum ich glauben würde, dass so etwas nicht existiert, ist, dass ich niemals möchte, dass das, was ich in eine Datenbank einfügen wollte, anders ist als das, was wirklich eingefügt wurde.

Ich denke, deine einzigen Optionen sind...

  1. Ändern Sie die Spaltendefinitionen. Machen Sie es zu einem größeren Varchar-Feld oder vielleicht sogar zu einem Textfeld. Verbringen Sie keine Zeit damit, ein magisches Werkzeug zu erstellen, wenn die Änderung der Spaltendefinition dies mit ein paar Klicks beheben würde. Ich empfehle dies!

  2. Ich konnte sehen, dass Sie eine Art Aspekt zum Abfangen verwenden die Setter und dann die Größe der Zeichenfolge anpassen, wenn sie größer als x Länge ist. Dies wäre der schnellste Grund, es in Ihrem Code zu behandeln. Wenn das Ändern der DB keine Option ist und Sie Tausende von Feldern haben, wäre dies meine nächste Wahl.

  3. Erstellen Sie ein String-Dienstprogramm Klasse, die Ihre Strings skalieren kann...

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

[AKTUALISIEREN] Da Sie die Datenbank nicht wirklich aktualisieren können, würde ich einen Aspekt empfehlen, um String-Setter abzufangen und ihre Länge zu überprüfen. Es könnte so aussehen (Syntax kann deaktiviert sein und ich habe dies nicht getestet) ...

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

Außerdem würde es zusätzlichen Overhead geben, wenn eine Schicht die definierte Spaltengröße mit allen Daten vergleichen müsste, die bei jeder Einfügung in die Tabelle eingehen.