J'utilise Hibernate 3.5.6 avec Oracle 10g. Je vois l'exception ci-dessous pendant l'initialisation, mais l'application elle-même fonctionne correctement. Quelle est la cause de cette exception? et comment cela peut-il être corrigé?
Exception
La désactivation de la création LOB contextuelle en tant que createClob()
a renvoyé une erreur: Java.lang.reflect.InvocationTargetException
Info
Version Oracle: Base de données Oracle 10g Enterprise Edition 10.2.0.4.0 Pilote JDBC: Pilote JDBC Oracle, version: 11.1.0.7.0
Comme vous l'avez remarqué, cette exception n'est pas un réel problème. Cela se produit lors du démarrage, quand Hibernate essaie de récupérer des méta-informations de la base de données. Si cela vous agace, vous pouvez le désactiver:
hibernate.temp.use_jdbc_metadata_defaults false
Désactivez cet avertissement en ajoutant la propriété ci-dessous.
Pour application printanière:
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
JPA normal:
hibernate.temp.use_jdbc_metadata_defaults=false
En regardant les commentaires dans la source :
Fondamentalement, ici, nous vérifions simplement si nous pouvons appeler le Méthodes Java.sql.Connection pour LOB création ajoutée dans JDBC 4. Nous non seulement vérifiez si le fichier Java.sql.Connection déclare ces méthodes, mais aussi si la connexion Java.sql.Connexion réelle exemple les implémente (c’est-à-dire qu’on peut appeler sans simplement lever une exception ).
Donc, il essaie de déterminer s'il peut utiliser certaines nouvelles méthodes JDBC 4. J'imagine que votre pilote peut ne pas prendre en charge la nouvelle méthode de création LOB.
Se débarrasser de l'exception
INFO - HHH000424: Disabling contextual LOB creation as createClob() method threw error :Java.lang.reflect.InvocationTargetException
Dans le fichier hibernate.cfg.xml
, ajoutez la propriété ci-dessous
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
Afin de cacher l'exception:
Pour Hibernate 5.2 (et Spring Boot 2.0), vous pouvez utiliser la propriété use_jdbc_metadata_defaults que les autres ont indiquée:
# Meant to hide HHH000424: Disabling contextual LOB creation as createClob() method threw error
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
Ou, si vous souhaitez que le paramètre ci-dessus ne provoque aucun effet secondaire (un commentaire nous avertit à propos de certains effets secondaires Oracle, je ne sais pas s'il est valide ou non), vous pouvez simplement désactiver la journalisation de l'exception comme ceci :
logging:
level:
# Hides HHH000424: Disabling contextual LOB creation as createClob() method threw error
org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl: WARN
Effectuez la mise à jour pour utiliser Hibernate 4.3.x/5.0.x - vous pouvez simplement définir cette propriété sur true:
<prop key="hibernate.jdbc.lob.non_contextual_creation">true</prop>
se débarrasser de ce message d'erreur. Même effet, mais sans le détail "levée d'exception" ..__ Voir Source de LobCreatorBuilder pour plus de détails.
La mise à jour du pilote JDBC vers la dernière version a supprimé le message d'erreur désagréable.
Vous pouvez le télécharger à partir d'ici:
http://www.Oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
Une inscription gratuite est requise cependant.
Ajoutez simplement la ligne ci-dessous dans application.properties
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
Si vous définissez:
hibernate.temp.use_jdbc_metadata_defaults: false
cela peut causer des problèmes avec PostgreSQL lorsque le nom de votre table contient Word comme utilisateur réservé Après insertion, il essaiera de trouver la séquence id avec:
select currval('"user"_id_seq');
qui va évidemment échouer. Ceci au moins avec Hibernate 5.2.13 et Spring Boot 2.0.0.RC1. N'ayant pas trouvé d'autre moyen d'empêcher ce message, ignorez-le maintenant.
Comme mentionné dans d'autres commentaires en utilisant
hibernate.temp.use_jdbc_metadata_defaults = false
... résoudra le message ennuyant, mais peut conduire à de nombreux autres problèmes surprenants. Une meilleure solution consiste simplement à désactiver la création LOB contextuelle avec ceci:
hibernate.jdbc.lob.non_contextual_creation = true
Hibernate (dans son cas, son 5.3.10.Final) ignorera donc de vérifier le pilote JDBC et produira simplement le message suivant:
HHH000421: Disabling contextual LOB creation as hibernate.jdbc.lob.non_contextual_creation is true
Jusqu'à présent, il semble que ce paramètre ne pose aucun problème.
Le problème se produit parce que vous n'avez pas choisi le JDBC approprié. Il suffit de télécharger et d'utiliser JDBC pour Oracle 10g plutôt que 11g.
J'ai rencontré cette erreur lorsque mon application Web a été lancée sous Linux par un utilisateur connecté avec des droits d'accès insuffisants. Cette erreur
org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: La désactivation de la création LOB contextuelle en tant que méthode createClob () renvoyait une erreur: Java.lang.reflect.InvocationTargetException
généralement précédé par d'autres erreurs/exceptions, notamment de votre serveur d'applications, c'est-à-dire pour Tomcat:
org.Apache.catalina.LifecycleException: Échec d'initialisation du composant ...
ou
Java.lang.UnsatisfiedLinkError: ... ne peut pas ouvrir le fichier d'objet partagé: aucun fichier ou répertoire de ce type
Solution:
Arrêtez l'instance actuelle de vos applications Web.
Connectez-vous avec le super utilisateur ou ceux avec les droits d'accès suffisants i.e root
Redémarrez votre application Web ou appelez à nouveau la fonction précédente.