Je reçois un problème de données trop volumineux dans Hibernate. c'est - p>
causée par: java.sql.batchupAtateException: troncature de données: données trop longue pour la colonne 'FBZiPloc' à la ligne 1 chez com.mysql.jdbc.preparationStatement.ExecuteBatchSériale (préparéStatement.java:1527) à com.mysql.jdbc.preparationStatement.executeBatch (préparéStatement.java:1065) à org.hibernate.jdbc.batchingbatcher.OexecuteBatch (batchingbatcher.java:58) à org.hibernate.jdbc.abstractbatcher.executeBatch (abstractbatcher.java:195) ... 12 Plus P> blockQuote>
est-il possible de tronquer automatiquement toutes les données du champ. ou tout autre moyen de gérer ce problème. Mais je ne veux pas vérifier la longueur de la transmission de tous les champs parce que j'ai plus de milliers de champs. P>
3 Réponses :
De ce que je sais, il n'y a vraiment aucun moyen pour Hibernate ou MySQL de tronquer automatiquement les chaînes sans que vous ajoutez dans la logique pour gérer cela. La raison pour laquelle je croirais que quelque chose comme ça n'existe pas, c'est que je ne voudrais jamais ce que j'ai demandé à être inséré dans une base de données soit différente de ce qui a vraiment été inséré.
Je pense que vos seules options sont ... p>
change les définitions de la colonne. strong> Faites-le un champ de varchar ou peut-être même un champ de texte. Ne passez pas de temps à construire un outil magique lorsque vous modifiez simplement la définition de la colonne, corrigez cela en quelques clics. Je recommande de faire ça! P> li>
Je pouvais vous voir en utilisant une sorte d'aspect pour intercepter forte> les setters, puis ajuster la taille de la chaîne si elle est supérieure à la longueur de x. Ce serait la meilleure façon la plus rapide de la gérer dans votre code. Si vous modifiez la DB n'est pas une option et que vous avez des milliers de champs, ce serait mon prochain choix. p> li>
construire une chaîne util forte> classe qui peut réapparaître vos chaînes ... p>
colletext (string val) {this.text = stringutil.trunate (Val, taille);} p> li>
ol> [update] strong>
Puisque vous ne pouvez pas vraiment mettre à jour la base de données, je recommanderais un aspect d'intercepter des String Setters et de vérifier leur longueur, cela pourrait ressembler à ceci (la syntaxe peut être éteinte et je n'ai pas testé cela) ... P> 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);
}
Mon projet est supérieur à 95% et j'ai 98 tables avec 120-150 champs, donc je ne peux donc pas changer de propriété BD ou colonne.
Considérons ensuite un aspect d'intercepter et de tronquer les cordes. Ce sera plus facile qu'un stringutil et un grand nombre de changements de code moins de code.
L'intercepteur Hibernate est probablement beaucoup meilleur choix dans ce cas que les intercepteurs de AspectJ.
@ALEX: D'accord (+1). J'ai oublié des intercepteurs de stock hb. Ce sera un meilleur choix.
Vous pouvez utiliser hibernate Intercepteur pour cela. Cela vous permettra de modifier votre état d'objet juste avant de l'enregistrer. Vous pouvez facilement couper vos chaînes en fonction de colonnes spécifiques ou de types spécifiques que vous économisez. P>
Je n'utilise pas JBoss, j'utilise un simple hibernate3.jar seulement hor hibernate.
Cela n'a rien à voir avec JBoss. C'est une documentation hibernate hébergée sur le site JBoss.
Je n'ai pas compris ton dernier commentaire. Pls clarifiez.
@Alexgitelman nous a laissé Continuez cette discussion en chat
Vous pouvez configurer MySQL pour tronquer des données si c'est ce que vous voulez vraiment: p>
Si le mode SQL strict n'est pas activé et que vous attribuez une valeur à une colonne de char ou de varcharille dépassant la longueur maximale de la colonne, la valeur est tronquée à l'ajustement et un avertissement est généré. Pour la troncature des caractères Nonspace, vous pouvez provoquer une erreur (plutôt qu'un avertissement) et supprimer l'insertion de la valeur en utilisant le mode SQL strict. Voir la section 5.1.7, "Modes SQL Server SQL" a>. p> blockQuote>
Cependant, ce n'est pas conseillé pour une production de production. P>
Vous devez écrire manuellement une fonction qui vérifie la longueur et tronquez les données si possible avant d'enregistrer les données. 2. Développez l'espace de la colonne dans dB.
Utilisez un aspect pour intercepter s'il y a une tonne de colonnes et de champs
J'ai des milliers de champs, donc je ne peux pas écrire une fonction et appeler de chaque champ.