Mysql
 sql >> Base de données >  >> RDS >> Mysql

Gérer correctement les données longues dans Hibernate

D'après ce que je sais, il n'y a vraiment aucun moyen pour Hibernate ou MySQL de tronquer automatiquement les chaînes sans que vous ajoutiez la logique pour gérer cela. La raison pour laquelle je croirais que quelque chose comme ça n'existe pas est que je ne voudrais jamais que ce que j'ai demandé à insérer dans une base de données soit différent de ce qui a vraiment été inséré.

Je pense que tes seules options sont...

  1. Modifier les définitions de colonne. Faites-en un champ varchar plus grand ou peut-être même un champ de texte. Ne perdez pas de temps à créer un outil magique alors que le simple fait de modifier la définition de la colonne résoudrait ce problème en quelques clics. Je recommande de le faire !

  2. Je pourrais vous voir utiliser une sorte d'aspect pour intercepter les setters, puis en ajustant la taille de la chaîne si elle est supérieure à x longueur. Ce serait la raison la plus rapide pour le gérer dans votre code. Si changer la base de données n'est pas une option et que vous avez des milliers de champs, ce serait mon prochain choix.

  3. Créer un utilitaire String classe qui peut redimensionner vos chaînes...

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

[MISE À JOUR] Comme vous ne pouvez pas vraiment mettre à jour la base de données, je recommanderais un aspect pour intercepter les créateurs de chaînes et vérifier leur longueur, cela pourrait ressembler à ceci (la syntaxe peut être désactivée et je n'ai pas testé cela)...

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

De plus, il y aurait une surcharge supplémentaire si une couche devait vérifier la taille de colonne définie par rapport à toutes les données entrant dans la table à chaque insertion.