[Hibernate / Oracle JDBC] : Solution au problème de ArrayIndexOutOfBoundsException

Une erreur incompréhensible

Hibernate

Logo hibernate

Si certains d'entre vous ont déjà utilisé Hibernate combiné à Oracle, peut-être reconnaîtront-ils cette fameuse erreur : java.lang.ArrayIndexOutOfBoundsException : <n>.
Cette erreur se produit lorsqu'on tente de faire des INSERT en base Oracle. Selon Hibernate il s'agit d'un bug du JDBC d'Oracle et selon Oracle ... débrouillez-vous. Cette erreur existe depuis la version 10.2.0.0.0 et n'est toujours pas corrigée à l'heure actuelle (12.1.0.1).

La raison

Outre tenter de référencer au mauvais endroit dans un tableau dont nous ne savons rien (ArrayIndexOutOfBoundsException), il semblerait que le driver Oracle ne supporte pas l'insertion de column Null ou sans valeur par défaut.

Par exemple :

Nous avons la table suivante : Personne(id_personne, nom, prenom, age, couleur_cheveux);
age et couleur cheveux ne sont pas obligatoires à l'insertion.

Nous insérons la ligne suivante :

(PersonneSequence.next, "Jean", "Dupont", null, null)

Lorsque nous insérons une ligne via l'API Hibernate, elle génère le 'SQL Statement' suivant avec les colonnes inutiles :

2014-10-20_104437

Les Null seront envoyés et vous obtiendrez l'exception. Pour pallier ce problème, j'ai trouvé une solution dans laquelle Hibernate n'inclut pas les colonnes inutiles : l'option dynamic-insert. Cette option est à false par défaut.

Comment le configurer

1 - Annotation

Voici comment faire par annotation :

2014-10-20_104249

2 - XML

Voici comment faire par hbm :

2014-10-20_104353

Conclusion

A la suite de cette manipulation, l'exception n'est plus générée et Hibernate génère le 'SQL Statement' suivant sans les colonnes inutiles :

2014-10-20_104504

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.