Desativar a criação de LOB contextual porque o método createClob () gerou erro

87

Estou usando o Hibernate 3.5.6 com Oracle 10g. Estou vendo a exceção abaixo durante a inicialização, mas o próprio aplicativo está funcionando bem. Qual é a causa desta exceção? e como isso pode ser corrigido?

Exceção
Desativar a criação de LOB contextual como createClob()método gerou erro:java.lang.reflect.InvocationTargetException

Info
Oracle version: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 Driver JDBC: Driver Oracle JDBC, versão: 11.1.0.7.0

GiriByaks
fonte
"o aplicativo em si está funcionando bem" ... contanto que você não tente usar LOBs, imagino.
Nyerguds

Respostas:

76

Desative este aviso adicionando a propriedade abaixo.

Para aplicação Spring:

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

JPA normal:

hibernate.temp.use_jdbc_metadata_defaults=false
Narayan Yerrabachu
fonte
1
Com qual versão java você tentou fazer isso? Intellij não conseguiu encontrar esta propriedade.
comiventor
Tentamos com eclipse e também com Intellij. Em ambos os casos está funcionando. Na verdade, estamos cansados ​​de java 6, 7,8 e está funcionando sem nenhum problema para nós. Apenas depure seu código ou verifique-o.
Narayan Yerrabachu
67

Como você notou, essa exceção não é um problema real. Acontece durante a inicialização, quando o Hibernate tenta recuperar alguma meta informação do banco de dados. Se isso incomoda você, você pode desativá-lo:

hibernate.temp.use_jdbc_metadata_defaults false
jpkrohling
fonte
1
Obrigado Partenon. Estou ciente da opção de desativá-lo, mas estou tentando descobrir o motivo dessa exceção. Quaisquer dicas?
GiriByaks
6
Pelo que eu entendi, não é um problema com sua aplicação, o Hibernate está apenas verificando se o DB suporta alguns recursos e se ajustando caso não suporte. Gostaria de verificar se algum mapeamento está acionando isso (como um campo LOB), mas não é nada para se preocupar.
jpkrohling
5
AVISO : Usar esta solução com Oracle é perigoso ! Isso leva a COMMITs inesperados . Quando o hibernate cria tabelas temporárias, ele tem que abrir uma nova transação, já que as instruções DDL no banco de dados Oracle implicam em COMMIT. Ao definir essa opção como false, você desativa a abertura de uma nova transação e o DDL obtém problemas dentro de sua transação COMEÇANDO-a.
Boris Brodski,
@BorisBrodski, tem certeza de que o comportamento que você descreveu é causado pela configuração dessa propriedade como falsa? Olhando para o código, não vejo nada extra sendo executado quando isso é falso: github.com/hibernate/hibernate-orm/blob/… .
jpkrohling de
3
@jpkrohling Sim, eu depurei o hibernate4.2.7 e vi se eu mesmo: Configurando useJdbcMetadatapara falseprevine metaReportsDDLCausesTxnCommitde ser configurado e ele permanece false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski
28

Olhando para os comentários na fonte :

Basicamente, aqui estamos simplesmente verificando se podemos chamar os métodos java.sql.Connection para a criação de LOB adicionados ao JDBC 4. Não apenas verificamos se o java.sql.Connection declara esses métodos, mas também se o java.sql.Connection real a instância os implementa (ou seja, pode ser chamada sem simplesmente lançar uma exceção).

Portanto, ele está tentando determinar se pode usar alguns novos métodos JDBC 4. Eu acho que seu driver pode não suportar o novo método de criação de LOB.

Steve K
fonte
5
Isso significa isso Driver does not support LOB featureou Database does not support LOB feature?
Marek Sebera
Driver @MarekSebera. Estou tendo esse problema porque algo está substituindo misteriosamente minha biblioteca C3P0 por uma versão antiga. O banco de dados suporta muito bem.
Nyerguds
24

Para ocultar a exceção:

Para Hibernate 5.2 (e Spring Boot 2.0), você pode usar a propriedade use_jdbc_metadata_defaults que os outros apontaram:

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

Ou, se você quiser não ter nenhum efeito colateral da configuração acima (há um comentário nos avisando sobre alguns efeitos colaterais do Oracle, eu não sei se é válido ou não), você pode simplesmente desativar o registro da exceção assim :

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

Para se livrar da exceção

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

No hibernate.cfg.xmlarquivo Adicionar propriedade abaixo

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
UdayKiran Pulipati
fonte
5
Esta é a mesma resposta de Steve K. Por que você responde de novo?
Bevor,
4
@Bevor ele explicou o problema mas eu dei resposta.
UdayKiran Pulipati,
2
Você só quer comandar atualizações copiando uma resposta já dada. Sua resposta não difere de Steve K.
Bevor
2
Obrigado. Com base nisso, adicionei <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> ao persistence.xmlarquivo e ele resolveu o problema para mim. Eu uso JPA com Hibernate.
dschulz
4
@Bevor, para ser honesto para um novato como eu, esta resposta é muito mais clara em parte onde devo colocar esta propriedade
Anatoly Yakimchuk
14

Atualize para usar o Hibernate 4.3.x / 5.0.x - você pode apenas definir esta propriedade como verdadeira:

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

para se livrar dessa mensagem de erro. Mesmo efeito, mas sem o detalhe "lançou exceção". Consulte a fonte LobCreatorBuilder para obter detalhes.

Torsten Krah
fonte
defina isso em persistence.xml
user961954
10

Basta adicionar a linha abaixo em application.properties

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

Conforme mencionado em outros comentários usando

hibernate.temp.use_jdbc_metadata_defaults = false

... vai consertar a mensagem chata, mas pode levar a muitos outros problemas surpreendentes. A melhor solução é simplesmente desativar a criação de LOB contextual com isto:

hibernate.jdbc.lob.non_contextual_creation = true

Isso fará com que o Hibernate (no meu caso, seu 5.3.10.Final) pule a análise do driver JDBC e apenas exiba a seguinte mensagem:

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

Até agora, parece que essa configuração não causa problemas.

Jacek Prucia
fonte
4

Se você definir:

hibernate.temp.use_jdbc_metadata_defaults: false

pode causar problemas com o PostgreSQL quando o nome da tabela contém uma palavra reservada como usuário. Após a inserção, ele tentará encontrar a sequência de id com:

select currval('"user"_id_seq');

que obviamente irá falhar. Isso pelo menos com Hibernate 5.2.13 e Spring Boot 2.0.0.RC1. Não encontrei outra maneira de evitar esta mensagem, então agora apenas a ignore.

Kettunen
fonte
2

Ao trabalhar com o Spring boot 2.1.x, esta mensagem de aviso aparece ao iniciar o aplicativo.

Conforme indicado aqui, talvez esse problema não tenha aparecido nas versões anteriores porque a propriedade relacionada foi definida como verdadeira por padrão e agora é falsa:

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

Consequentemente, resolver isso é tão simples quanto adicionar a seguinte propriedade ao arquivo spring application.property.

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
migueldoctor
fonte
Obrigado por isso. Um rastreamento de exceção no modo de log INFO é realmente irritante!
Daniel Fernández
1

O problema ocorre porque você não escolheu o JDBC apropriado. Basta fazer o download e usar o JDBC para oracle 10g ao invés do 11g.

sami
fonte
Hã. Isso contradiz completamente a resposta de Boris Brodski. Tem certeza que isso faz alguma diferença?
Nyerguds
1

Estou usando o hibernate 5.3.17 e funciona bem adicionando determinadas propriedades

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

obrigado

SK
fonte
0

Eu encontrei este erro quando meu aplicativo da web foi iniciado no Linux por um usuário conectado com direitos de acesso insuficientes. Esse erro

org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: Desativando a criação de LOB contextual porque o método createClob () gerou erro: java.lang.reflect.InvocationTargetException

geralmente precedido por outros erros / exceções, especialmente do seu servidor de aplicativos, por exemplo, para Tomcat:

org.apache.catalina.LifecycleException: Falha ao inicializar o componente ...

ou

java.lang.UnsatisfiedLinkError: ... não é possível abrir o arquivo de objeto compartilhado: esse arquivo ou diretório não existe

Solução:

  1. Pare a instância atual de seus aplicativos da web.

  2. Faça login com superusuário ou aqueles com direitos de acesso suficientes, ou seja, root

  3. Reinicie seu aplicativo da web ou chame a função anterior novamente.

Peterong
fonte
0

Para quem está enfrentando esse problema com Spring Boot 2

por padrão, o Spring Boot estava usando a versão 5.3.x do hibernate, adicionei a seguinte propriedade em meu pom.xml

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

e o erro desapareceu. O motivo do erro já é explicado nas postagens acima

Shailesh Chandra
fonte
-1

Remova as anotações @Temporal se usá-las com classes java.sql. *.

Amr El-Demerdash
fonte
-3

Verifique se você não está em uma VPN. Eu tive o mesmo problema mas percebi que o db estava conectando ao remoto!

logixplayer
fonte