La désactivation de la création de LOB contextuel en tant que méthode createClob () a généré une erreur

87

J'utilise Hibernate 3.5.6 avec Oracle 10g. Je vois l'exception ci-dessous lors de 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
Désactivation de la création de LOB contextuel en tant que createClob()méthode a généré une erreur:java.lang.reflect.InvocationTargetException

Info
Version Oracle: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 Pilote JDBC: pilote Oracle JDBC, version: 11.1.0.7.0

GiriByaks
la source
"l'application elle-même fonctionne correctement" ... tant que vous n'essayez pas d'utiliser des LOB, j'imagine.
Nyerguds

Réponses:

76

Désactivez cet avertissement en ajoutant la propriété ci-dessous.

Pour l'application de printemps:

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

JPA normal:

hibernate.temp.use_jdbc_metadata_defaults=false
Narayan Yerrabachu
la source
1
Avec quelle version Java avez-vous essayé cela? Intellij est incapable de trouver cette propriété.
comiventor
Nous avons essayé avec eclipse ainsi qu'avec Intellij. Dans les deux cas, cela fonctionne, en fait, nous nous sommes fatigués avec java 6, 7,8 et cela fonctionne sans aucun problème pour nous. Déboguez simplement votre code ou vérifiez votre code.
Narayan Yerrabachu
67

Comme vous l'avez remarqué, cette exception n'est pas un réel problème. Cela se produit pendant le démarrage, lorsque Hibernate tente de récupérer des méta-informations de la base de données. Si cela vous ennuie, vous pouvez le désactiver:

hibernate.temp.use_jdbc_metadata_defaults false
jpkrohling
la source
1
Merci Partenon. Je connais la possibilité de le désactiver, mais j'essaie de trouver la raison de cette exception. Des pointeurs?
GiriByaks le
6
Pour autant que je sache, ce n'est pas un problème avec votre application, Hibernate vérifie simplement si la base de données prend en charge certaines fonctionnalités et s'ajuste au cas où ce ne serait pas le cas. Je vérifierais si un mappage déclenche cela (comme un champ LOB), mais il n'y a pas de quoi s'inquiéter.
jpkrohling le
5
AVERTISSEMENT : l'utilisation de cette solution avec Oracle est dangereuse ! Cela conduit à des COMMITs inattendus . Lorsque hibernate crée des tables temporaires, il doit ouvrir une nouvelle transaction, car les instructions DDL dans Oracle DB impliquent COMMIT. En définissant cette option sur false, vous désactivez l'ouverture d'une nouvelle transaction et DDL obtient des problèmes dans votre transaction.
Boris Brodski
@BorisBrodski, êtes-vous sûr que le comportement que vous avez décrit est causé par la définition de cette propriété sur false? En regardant le code, je ne vois rien de plus en cours d'exécution lorsque c'est faux: github.com/hibernate/hibernate-orm/blob/… .
jpkrohling
3
@jpkrohling Oui, j'ai débogué hibernate4.2.7 et j'ai vu moi-même: le réglage useJdbcMetadatasur falseempêche metaReportsDDLCausesTxnCommitd'être défini et ça reste false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski
28

En regardant les commentaires dans la source :

Fondamentalement, nous vérifions simplement si nous pouvons appeler les méthodes java.sql.Connection pour la création de LOB ajoutées dans JDBC 4. Nous vérifions non seulement si java.sql.Connection déclare ces méthodes, mais également si le java.sql.Connection réel instance les implémente (c'est-à-dire peut être appelée sans simplement lancer une exception).

Donc, il essaie de déterminer s'il peut utiliser de nouvelles méthodes JDBC 4. Je suppose que votre pilote peut ne pas prendre en charge la nouvelle méthode de création LOB.

Steve K
la source
5
Est-ce que ça veut dire ça Driver does not support LOB featureou Database does not support LOB feature?
Marek Sebera
Pilote @MarekSebera. J'ai ce problème parce que quelque chose remplace mystérieusement ma bibliothèque C3P0 avec une version ancienne. La base de données le prend parfaitement en charge.
Nyerguds
24

Pour masquer l'exception:

Pour Hibernate 5.2 (et Spring Boot 2.0), vous pouvez soit utiliser la propriété use_jdbc_metadata_defaults que les autres ont signalé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 voulez ne pas avoir d'effets secondaires du paramètre ci-dessus (il y a un commentaire nous avertissant de certains effets secondaires d'Oracle, je ne sais pas si c'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
Vlad Dinulescu
la source
21

Pour se débarrasser de l'exception

INFO - HHH000424: Disabling contextual LOB creation as createClob() method threw error :java.lang.reflect.InvocationTargetException

Dans le hibernate.cfg.xmlfichier Ajouter ci-dessous la propriété

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
UdayKiran Pulipati
la source
5
C'est la même réponse que celle de Steve K. Pourquoi y répondez-vous à nouveau?
Bevor
4
@Bevor, il a expliqué le problème mais j'ai donné une réponse.
UdayKiran Pulipati
2
Vous souhaitez uniquement commander des mises à jour en copiant une réponse déjà donnée. Votre réponse ne distingue pas de Steve K.
Bevor
2
Merci. Sur cette base, j'ai ajouté <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> au persistence.xmlfichier et cela a résolu le problème pour moi. J'utilise JPA avec Hibernate.
dschulz
4
@Bevor pour être honnête pour un novice comme moi, cette réponse est beaucoup plus claire en partie où dois-je mettre cette propriété
Anatoly Yakimchuk
14

Mettez à jour ceci 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>

pour se débarrasser de ce message d'erreur. Même effet mais sans le détail "jeté exception". Voir la source LobCreatorBuilder pour plus de détails.

Torsten Krah
la source
définir ceci dans persistence.xml
user961954
10

Ajoutez simplement la ligne ci-dessous dans application.properties

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
Rupesh Patil
la source
6

Comme mentionné dans d'autres commentaires utilisant

hibernate.temp.use_jdbc_metadata_defaults = false

... corrigera le message ennuyeux, mais peut entraîner de nombreux autres problèmes surprenants. La meilleure solution consiste simplement à désactiver la création de LOB contextuel avec ceci:

hibernate.jdbc.lob.non_contextual_creation = true

Cela obligera Hibernate (dans mon cas, son 5.3.10.Final) à ignorer l'analyse du pilote JDBC et à afficher 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.

Jacek Prucia
la source
4

Si vous définissez:

hibernate.temp.use_jdbc_metadata_defaults: false

cela peut vous causer des problèmes avec PostgreSQL lorsque le nom de votre table contient un mot réservé comme user. Après l'insertion, il essaiera de trouver la séquence d'identifiants avec:

select currval('"user"_id_seq');

qui échouera évidemment. Ceci au moins avec Hibernate 5.2.13 et Spring Boot 2.0.0.RC1. Je n'ai pas trouvé d'autre moyen d'empêcher ce message, alors maintenant, il suffit de l'ignorer.

kettunen
la source
2

Lorsque vous travaillez avec Spring boot 2.1.x, ce message d'avertissement apparaît lors du démarrage de l'application.

Comme indiqué ici, peut-être que ce problème n'apparaissait pas dans les versions antérieures car la propriété associée était définie sur true par défaut et maintenant elle est false:

https://github.com/spring-projects/spring-boot/issues/12007

En conséquence, résoudre ce problème est aussi simple que d'ajouter la propriété suivante au fichier spring application.property.

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
migueldoctor
la source
Merci pour cela. Une trace d'exception en mode journal INFO est vraiment ennuyeuse!
Daniel Fernández le
1

Le problème se produit parce que vous n'avez pas choisi le JDBC approprié. Il suffit de télécharger et d'utiliser le JDBC pour oracle 10g plutôt que 11g.

sami
la source
Huh. Cela contredit complètement la réponse de Boris Brodski. Vous êtes sûr que cela fait une différence?
Nyerguds
1

J'utilise hibernate 5.3.17 et cela fonctionne bien en ajoutant des propriétés données

hibernate.default_entity_mode=dynamic-map
hibernate.temp.use_jdbc_metadata_defaults=true
hibernate.jdbc.lob.non_contextual_creation = true

Merci

SK
la source
0

J'ai rencontré cette erreur lorsque mon application Web a été démarré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 de LOB contextuel comme méthode createClob () a généré une erreur: java.lang.reflect.InvocationTargetException

généralement précédé d'autres erreurs / exceptions, notamment de votre serveur d'application c'est-à-dire pour Tomcat:

org.apache.catalina.LifecycleException: échec de l'initialisation du composant ...

ou

java.lang.UnsatisfiedLinkError: ... impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type

Solution:

  1. Arrêtez l'instance actuelle de vos applications Web.

  2. Connectez-vous avec un super utilisateur ou avec des droits d'accès suffisants, par exemple root

  3. Redémarrez votre application Web ou appelez à nouveau la fonction précédente.

Peterong
la source
0

Pour tous ceux qui sont confrontés à ce problème avec Spring Boot 2

par défaut, spring boot utilisait la version hibernate 5.3.x, j'ai ajouté la propriété suivante dans mon pom.xml

<hibernate.version>5.4.2.Final</hibernate.version>

et l'erreur avait disparu. La raison de l'erreur est déjà expliquée dans les articles ci-dessus

Shailesh Chandra
la source
-1

Supprimez les annotations @Temporal si vous l'utilisez avec les classes java.sql. *.

Amr El-Demerdash
la source
-3

Vérifiez si vous n'êtes pas sur un VPN. J'ai eu le même problème mais j'ai réalisé la db que je connectais à la télécommande!

logixplayer
la source