sql >> Databasteknik >  >> RDS >> Mysql

Korrekt hantering av långa data i Hibernate

Vad jag vet finns det verkligen inget sätt för Hibernate eller MySQL att automatiskt trunkera strängar utan att du lägger till logiken för att hantera detta. Anledningen till att jag skulle tro att något sådant här inte existerar är att jag aldrig skulle vilja att det jag bad om att infogas i en databas skulle vara annorlunda än det som verkligen infogades.

Jag tror att dina enda alternativ är...

  1. Ändra kolumndefinitionerna. Gör det till ett större varcharfält eller kanske till och med ett textfält. Lägg inte tid på att bygga ett magiskt verktyg när bara att ändra kolumndefinitionen skulle fixa detta med ett par klick. Jag rekommenderar att du gör detta!

  2. Jag kunde se dig använda någon sorts aspekt för att fånga upp sättarna och sedan justera storleken på strängen om den är större än x längd. Detta skulle vara det snabbaste varför du hanterar det i din kod. Om det inte är ett alternativ att ändra DB och du har tusentals fält skulle detta vara mitt nästa val.

  3. Bygg ett strängverktyg klass som kan ändra storlek på dina strängar...

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

[UPPDATERA] Eftersom du inte riktigt kan uppdatera databasen skulle jag rekommendera en aspekt för att fånga upp strängsättare och kontrollera deras längd, det kan se ut så här (syntax kan vara avstängd och jag testade inte detta)...

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

Det skulle också tillkomma ytterligare overhead om något lager måste kontrollera den definierade kolumnstorleken mot all data som kommer in i tabellen på varje inlägg.



  1. MySQL Välj WHERE IN given ordning

  2. välj 30 slumpmässiga rader där summa =x

  3. Hur man skapar och kör MySQL-lagrade funktioner och procedurer

  4. Hur Ceiling() fungerar i PostgreSQL