Das Deaktivieren der kontextbezogenen LOB-Erstellung als createClob () -Methode hat einen Fehler ausgelöst

84

Ich verwende Hibernate 3.5.6 mit Oracle 10g. Während der Initialisierung wird die folgende Ausnahme angezeigt, aber die Anwendung selbst funktioniert einwandfrei. Was ist die Ursache für diese Ausnahme? und wie kann es korrigiert werden?

Ausnahme Das
Deaktivieren der kontextbezogenen LOB-Erstellung als createClob()Methode hat einen Fehler ausgelöst :java.lang.reflect.InvocationTargetException

Info
Oracle-Version: Oracle Database 10g Enterprise Edition Version 10.2.0.4.0 JDBC-Treiber: Oracle JDBC-Treiber, Version: 11.1.0.7.0

GiriByaks
quelle
"Die Anwendung selbst funktioniert einwandfrei" ... solange Sie nicht versuchen, LOBs zu verwenden, stelle ich mir vor.
Nyerguds

Antworten:

74

Deaktivieren Sie diese Warnung, indem Sie unten eine Eigenschaft hinzufügen.

Für die Frühjahrsanwendung:

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

Normaler JPA:

hibernate.temp.use_jdbc_metadata_defaults=false
Narayan Yerrabachu
quelle
1
Mit welcher Java-Version haben Sie das versucht? Intellij kann diese Eigenschaft nicht finden.
Comiventor
Wir haben es sowohl mit Eclipse als auch mit Intellij versucht. In beiden Fällen funktioniert es. Eigentlich waren wir müde von Java 6, 7,8 und es funktioniert ohne Probleme für uns. Debuggen Sie einfach Ihren Code oder überprüfen Sie Ihren Code.
Narayan Yerrabachu
67

Wie Sie bemerkt haben, ist diese Ausnahme kein wirkliches Problem. Dies geschieht während des Startvorgangs, wenn Hibernate versucht, einige Metainformationen aus der Datenbank abzurufen. Wenn Sie dies stört, können Sie es deaktivieren:

hibernate.temp.use_jdbc_metadata_defaults false
jpkrohling
quelle
1
Danke Partenon. Mir ist die Option zum Deaktivieren bekannt, aber ich versuche, den Grund für diese Ausnahme zu finden. Irgendwelche Hinweise?
GiriByaks
6
Soweit ich weiß, ist dies kein Problem mit Ihrer Anwendung. Hibernate überprüft lediglich, ob die Datenbank einige Funktionen unterstützt, und passt sich an, falls dies nicht der Fall ist. Ich würde überprüfen, ob eine Zuordnung dies auslöst (wie ein LOB-Feld), aber es gibt keinen Grund zur Sorge.
jpkrohling
5
WARNUNG : Die Verwendung dieser Lösung mit Oracle ist gefährlich ! Dies führt zu unerwarteten COMMITs . Wenn der Ruhezustand temporäre Tabellen erstellt, muss eine neue Transaktion geöffnet werden, da DDL-Anweisungen in Oracle DB COMMIT implizieren. Wenn Sie diese Option auf false setzen, deaktivieren Sie das Öffnen einer neuen Transaktion, und DDL erhält Probleme innerhalb Ihrer Transaktion.
Boris Brodski
@BorisBrodski, sind Sie sicher, dass das von Ihnen beschriebene Verhalten durch das Setzen dieser Eigenschaft auf false verursacht wird? Wenn ich mir den Code anschaue, sehe ich, dass nichts extra ausgeführt wird, wenn dies falsch ist: github.com/hibernate/hibernate-orm/blob/… .
jpkrohling
3
@jpkrohling Ja, ich habe hibernate4.2.7 debuggt und gesehen, ob ich selbst: Einstellung useJdbcMetadataauf falseverhindert metaReportsDDLCausesTxnCommit, gesetzt zu werden, und es bleibt false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski
28

Schauen Sie sich die Kommentare in der Quelle an :

Grundsätzlich prüfen wir hier einfach, ob wir die in JDBC 4 hinzugefügten Methoden java.sql.Connection für die LOB-Erstellung aufrufen können. Wir prüfen nicht nur, ob java.sql.Connection diese Methoden deklariert, sondern auch, ob die tatsächliche java.sql.Connection Instanz implementiert sie (dh kann aufgerufen werden, ohne einfach eine Ausnahme auszulösen).

Es wird also versucht festzustellen, ob einige neue JDBC 4-Methoden verwendet werden können. Ich denke, Ihr Treiber unterstützt die neue LOB-Erstellungsmethode möglicherweise nicht.

Steve K.
quelle
5
Bedeutet das Driver does not support LOB featureoder Database does not support LOB feature?
Marek Sebera
@MarekSebera Treiber. Ich habe dieses Problem, weil etwas meine C3P0-Bibliothek mit einer alten Version auf mysteriöse Weise überschreibt. Die Datenbank unterstützt es einwandfrei.
Nyerguds
24

Um die Ausnahme auszublenden:

Für Hibernate 5.2 (und Spring Boot 2.0) können Sie entweder die Eigenschaft use_jdbc_metadata_defaults verwenden , auf die die anderen hingewiesen haben:

# Meant to hide HHH000424: Disabling contextual LOB creation as createClob() method threw error 
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false

Wenn Sie keine Nebenwirkungen aus der obigen Einstellung haben möchten (es gibt einen Kommentar, der uns vor einigen Oracle-Nebenwirkungen warnt, ich weiß nicht, ob diese gültig sind oder nicht), können Sie die Protokollierung der Ausnahme einfach so deaktivieren ::

logging:
   level: 
      # Hides HHH000424: Disabling contextual LOB creation as createClob() method threw error 
      org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl: WARN
Vlad Dinulescu
quelle
21

Um die Ausnahme loszuwerden

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

In der hibernate.cfg.xmlDatei Folgende Eigenschaft hinzufügen

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
UdayKiran Pulipati
quelle
5
Dies ist die gleiche Antwort wie von Steve K. Warum antwortest du noch einmal?
Bevor
4
@Bevor er erklärt das Problem, aber ich gab Antwort.
UdayKiran Pulipati
2
Sie möchten Updates nur befehlen, indem Sie eine bereits gegebene Antwort kopieren. Ihre Antwort unterscheidet sich nicht von Steve K.
Bevor
2
Vielen Dank. Auf dieser Grundlage habe ich <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> die persistence.xmlDatei hinzugefügt und das Problem für mich gelöst. Ich benutze JPA mit Hibernate.
dschulz
4
@Bevor, um ehrlich zu sein für einen Neuling wie mich diese Antwort ist zum Teil viel klarer, wo ich diese Eigenschaft setzen soll
Anatoly Yakimchuk
14

Aktualisieren Sie dies für die Verwendung von Hibernate 4.3.x / 5.0.x - Sie können diese Eigenschaft einfach auf true setzen:

<prop key="hibernate.jdbc.lob.non_contextual_creation">true</prop>

um diese Fehlermeldung loszuwerden. Gleicher Effekt, jedoch ohne das Detail "Ausnahmeregelung". Weitere Informationen finden Sie in der LobCreatorBuilder-Quelle.

Torsten Krah
quelle
Setzen Sie dies in persistence.xml
user961954
10

Fügen Sie einfach die folgende Zeile in application.properties hinzu

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

Wie in anderen Kommentaren erwähnt mit

hibernate.temp.use_jdbc_metadata_defaults = false

... wird die nervige Nachricht beheben, kann aber zu vielen anderen überraschenden Problemen führen. Eine bessere Lösung besteht darin, die kontextbezogene LOB-Erstellung folgendermaßen zu deaktivieren:

hibernate.jdbc.lob.non_contextual_creation = true

Dies führt dazu, dass Hibernate (in meinem Fall 5.3.10.Final) die Prüfung des JDBC-Treibers überspringt und nur die folgende Meldung ausgibt:

HHH000421: Disabling contextual LOB creation as hibernate.jdbc.lob.non_contextual_creation is true

Bisher sieht es so aus, als würde diese Einstellung keine Probleme verursachen.

Jacek Prucia
quelle
4

Wenn Sie einstellen:

hibernate.temp.use_jdbc_metadata_defaults: false

Dies kann zu Problemen mit PostgreSQL führen, wenn Ihr Tabellenname ein reserviertes Wort wie "Benutzer" enthält. Nach dem Einfügen wird versucht, die ID-Sequenz zu finden mit:

select currval('"user"_id_seq');

was offensichtlich scheitern wird. Dies zumindest mit Hibernate 5.2.13 und Spring Boot 2.0.0.RC1. Ich habe keinen anderen Weg gefunden, um diese Nachricht zu verhindern. Ignoriere sie jetzt einfach.

kettunen
quelle
1

Das Problem tritt auf, weil Sie nicht den entsprechenden JDBC ausgewählt haben. Laden Sie einfach den JDBC herunter und verwenden Sie ihn für Oracle 10g anstatt für 11g.

Sami
quelle
Huh. Dies widerspricht völlig der Antwort von Boris Brodski. Sind Sie sicher, dass dies einen Unterschied macht?
Nyerguds
1

Bei der Arbeit mit Spring Boot 2.1.x wird diese Warnmeldung beim Starten der Anwendung angezeigt.

Wie hier angegeben, ist dieses Problem in früheren Versionen möglicherweise nicht aufgetreten, da die zugehörige Eigenschaft standardmäßig auf true festgelegt wurde und jetzt false lautet:

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

Infolgedessen ist das Lösen so einfach wie das Hinzufügen der folgenden Eigenschaft zur Datei spring application.property.

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
Migueldoctor
quelle
Danke dafür. Eine Ausnahmeverfolgung im Protokoll-INFO-Modus ist wirklich ärgerlich!
Daniel Fernández
0

Ich habe diesen Fehler festgestellt, als meine Web-App unter Linux von einem Benutzer gestartet wurde, der mit unzureichenden Zugriffsrechten angemeldet war. Dieser Fehler

org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: Das Deaktivieren der kontextbezogenen LOB-Erstellung als createClob () -Methode hat den Fehler ausgelöst: java.lang.reflect.InvocationTargetException

In der Regel gehen andere Fehler / Ausnahmen voraus, insbesondere von Ihrem Anwendungsserver, z. B. für Tomcat:

org.apache.catalina.LifecycleException: Komponente konnte nicht initialisiert werden ...

oder

java.lang.UnsatisfiedLinkError: ... kann die gemeinsam genutzte Objektdatei nicht öffnen: Keine solche Datei oder kein solches Verzeichnis

Lösung:

  1. Stoppen Sie die aktuelle Instanz Ihrer Web-Apps.

  2. Melden Sie sich mit einem Superuser oder solchen mit ausreichenden Zugriffsrechten an, z. B. root

  3. Starten Sie Ihre Web-App neu oder rufen Sie die vorherige Funktion erneut auf.

Peterong
quelle
0

Für alle, die mit Spring Boot 2 vor diesem Problem stehen

Standardmäßig verwendete Spring Boot die Version 5.3.x im Ruhezustand. Ich habe die folgende Eigenschaft in meiner pom.xml hinzugefügt

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

und Fehler war weg. Der Grund für den Fehler ist bereits in den obigen Beiträgen erläutert

Shailesh Chandra
quelle
-1

Entfernen Sie @ Temporal-Annotationen, wenn Sie sie mit java.sql. * -Klassen verwenden.

Amr El-Demerdash
quelle
-3

Überprüfen Sie, ob Sie kein VPN haben. Ich hatte das gleiche Problem, erkannte aber die Datenbank, die ich mit der Fernbedienung verband!

logixplayer
quelle