La disabilitazione della creazione LOB contestuale come metodo createClob () ha generato un errore


87

Sto usando Hibernate 3.5.6 con Oracle 10g. Vedo l'eccezione di seguito durante l'inizializzazione ma l'applicazione stessa funziona correttamente. Qual è la causa di questa eccezione? e come può essere corretto?

Eccezione
Disabilitazione della creazione LOB contestuale come createClob()metodo ha generato un errore:java.lang.reflect.InvocationTargetException

Informazioni
Versione Oracle: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 Driver JDBC: Driver Oracle JDBC, versione: 11.1.0.7.0


"l'applicazione stessa funziona bene" ... a patto che non provi a utilizzare le line-of-business, immagino.
Nyerguds

Risposte:


76

Disabilita questo avviso aggiungendo la proprietà di seguito.

Per applicazioni primaverili:

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

JPA normale:

hibernate.temp.use_jdbc_metadata_defaults=false

1
Con quale versione Java l'hai provato? Intellij non è in grado di trovare questa proprietà.
comiventor

Abbiamo provato con eclipse e con Intellij. In entrambi i casi funziona, in realtà ci stanchiamo di java 6, 7,8 e funziona senza problemi per noi. Basta eseguire il debug del codice o effettuare un controllo incrociato del codice.
Narayan Yerrabachu

67

Come hai notato, questa eccezione non è un vero problema. Succede durante l'avvio, quando Hibernate cerca di recuperare alcune meta informazioni dal database. Se questo ti infastidisce, puoi disabilitarlo:

hibernate.temp.use_jdbc_metadata_defaults false

1
Grazie Partenon. Sono a conoscenza dell'opzione per disabilitarlo, ma sto cercando di trovare il motivo di questa eccezione. Qualche suggerimento?
GiriByaks

6
Per quanto ne so, non è un problema con la tua applicazione, Hibernate sta solo verificando se il DB supporta alcune funzionalità e si aggiusta se non lo fa. Vorrei verificare se una mappatura lo attiva (come un campo LOB), ma non c'è nulla di cui preoccuparsi.
jpkrohling

5
ATTENZIONE : l'utilizzo di questa soluzione con Oracle è pericoloso ! Porta a COMMIT imprevisti . Quando l'ibernazione crea tabelle temporanee deve aprire una nuova transazione, poiché le istruzioni DDL in Oracle DB implicano COMMIT. Impostando questa opzione su false disabiliti l'apertura di una nuova transazione e DDL ottiene problemi all'interno della tua transazione COMMITERLA.
Boris Brodski

@ BorisBrodski, sei sicuro che il comportamento che hai descritto sia causato dall'impostazione di questa proprietà su false? Guardando il codice, non vedo nulla di extra in esecuzione quando questo è falso: github.com/hibernate/hibernate-orm/blob/… .
jpkrohling

3
@jpkrohling Sì, ho eseguito il debug di hibernate4.2.7 e ho visto se: L'impostazione useJdbcMetadatasu falseimpedisce metaReportsDDLCausesTxnCommitdi essere impostata e rimane false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski

28

Guardando i commenti nella fonte :

Fondamentalmente qui stiamo semplicemente controllando se possiamo chiamare i metodi java.sql.Connection per la creazione di LOB aggiunti in JDBC 4. Non solo controlliamo se java.sql.Connection dichiara questi metodi, ma anche se l'effettivo java.sql.Connection istanza li implementa (cioè può essere chiamato senza semplicemente lanciare un'eccezione).

Quindi, sta cercando di determinare se può utilizzare alcuni nuovi metodi JDBC 4. Immagino che il tuo driver potrebbe non supportare il nuovo metodo di creazione LOB.


5
Significa questo Driver does not support LOB featureo Database does not support LOB feature?
Marek Sebera

@MarekSebera Driver. Ho questo problema perché qualcosa sta misteriosamente sovrascrivendo la mia libreria C3P0 con una versione antica. Il database lo supporta perfettamente.
Nyerguds

24

Per nascondere l'eccezione:

Per Hibernate 5.2 (e Spring Boot 2.0), puoi utilizzare la proprietà use_jdbc_metadata_defaults che gli altri hanno indicato:

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

Oppure, se vuoi non avere effetti collaterali dall'impostazione sopra (c'è un commento che ci avverte di alcuni effetti collaterali Oracle, non so se è valido o meno), puoi semplicemente disabilitare la registrazione dell'eccezione in questo modo :

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

21

Per sbarazzarsi dell'eccezione

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

Nel hibernate.cfg.xmlfile Aggiungi sotto la proprietà

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>

5
Questa è la stessa risposta di Steve K. Perché rispondi di nuovo?
Bevor

4
@Bevor ha spiegato il problema ma ho dato risposta.
Uday Kiran Pulipati

2
Vuoi solo comandare gli aggiornamenti copiando una risposta già data. La tua risposta non fa distinzione da Steve K.
Bevor

2
Grazie. Sulla base di questo, ho aggiunto <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> al persistence.xmlfile e ha risolto il problema per me. Uso JPA con Hibernate.
dschulz

4
@Bevor ad essere onesti per un principiante come me questa risposta è molto più chiara in parte dove dovrei mettere questa proprietà
Anatoly Yakimchuk

14

Aggiorna a questo per l'utilizzo di Hibernate 4.3.x / 5.0.x - potresti semplicemente impostare questa proprietà su true:

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

per sbarazzarsi di quel messaggio di errore. Stesso effetto ma senza il dettaglio "getta eccezione". Vedi l'origine LobCreatorBuilder per i dettagli.



10

Basta aggiungere sotto la riga in application.properties

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

6

Come accennato in altri commenti utilizzando

hibernate.temp.use_jdbc_metadata_defaults = false

... risolverà il messaggio fastidioso, ma può portare a molti altri problemi sorprendenti. La soluzione migliore è semplicemente disabilitare la creazione LOB contestuale con questo:

hibernate.jdbc.lob.non_contextual_creation = true

Ciò farà sì che Hibernate (nel mio caso, il suo 5.3.10.Final) salti il ​​sondaggio del driver JDBC e visualizzi semplicemente il seguente messaggio:

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

Finora sembra che questa impostazione non causi alcun problema.



4

Se imposti:

hibernate.temp.use_jdbc_metadata_defaults: false

può causare problemi con PostgreSQL quando il nome della tabella contiene una parola riservata come utente. Dopo l'inserimento proverà a trovare la sequenza dell'ID con:

select currval('"user"_id_seq');

che ovviamente fallirà. Questo almeno con Hibernate 5.2.13 e Spring Boot 2.0.0.RC1. Non ho trovato altro modo per impedire questo messaggio, quindi ora lo ignoro.


2

Quando si lavora con Spring Boot 2.1.x questo messaggio di avviso viene visualizzato all'avvio dell'applicazione.

Come indicato qui, forse questo problema non si presentava nelle versioni precedenti perché la proprietà correlata era impostata su true per impostazione predefinita e ora è falsa:

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

Di conseguenza, risolverlo è semplice come aggiungere la seguente proprietà al file spring application.property.

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true

Grazie per questo. Una traccia di eccezione in modalità INFO registro è davvero fastidiosa!
Daniel Fernández

1

Il problema si verifica perché non hai scelto il JDBC appropriato. Basta scaricare e utilizzare JDBC per Oracle 10g anziché 11g.


Eh. Ciò contraddice completamente la risposta di Boris Brodski. Sei sicuro che questo faccia differenza?
Nyerguds

1

Sto usando l'ibernazione 5.3.17 e funziona bene aggiungendo determinate proprietà

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

Grazie


0

Ho riscontrato questo errore quando la mia app Web è stata avviata in Linux da un utente connesso con diritti di accesso insufficienti. Questo errore

org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: la disabilitazione della creazione LOB contestuale come metodo createClob () ha generato un errore: java.lang.reflect.InvocationTargetException

solitamente preceduto da altri errori / eccezioni, in particolare dal server delle applicazioni, ad esempio per Tomcat:

org.apache.catalina.LifecycleException: impossibile inizializzare il componente ...

o

java.lang.UnsatisfiedLinkError: ... impossibile aprire il file oggetto condiviso: nessun file o directory di questo tipo

Soluzione:

  1. Arresta l'istanza corrente delle tue app web.

  2. Effettua il login con super utente o con diritti di accesso sufficienti, ad esempio root

  3. Riavvia la tua app web o chiama di nuovo la funzione precedente.


0

Per chiunque stia affrontando questo problema con Spring Boot 2

per impostazione predefinita, l'avvio di primavera utilizzava la versione di ibernazione 5.3.x, ho aggiunto la seguente proprietà nel mio pom.xml

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

e l'errore era sparito. Il motivo dell'errore è già spiegato nei post precedenti



-3

Controlla se non sei su una VPN. Ho avuto lo stesso problema ma ho capito il db che stavo collegando al telecomando!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.