Wyłączenie kontekstowego tworzenia LOB jako metody createClob () spowodowało błąd

87

Używam Hibernate 3.5.6 z Oracle 10g. Widzę poniższy wyjątek podczas inicjalizacji, ale sama aplikacja działa poprawnie. Jaka jest przyczyna tego wyjątku? i jak można to poprawić?

Wyjątek
wyłączający kontekstowe tworzenie LOB, ponieważ createClob()metoda spowodowała błąd:java.lang.reflect.InvocationTargetException

Informacje
Wersja Oracle: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 Sterownik JDBC: Sterownik Oracle JDBC, wersja: 11.1.0.7.0

GiriByaks
źródło
„sama aplikacja działa dobrze” ... o ile nie próbujesz używać LOBów, tak sobie wyobrażam.
Nyerguds

Odpowiedzi:

76

Wyłącz to ostrzeżenie, dodając właściwość poniżej.

Do aplikacji wiosennej:

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

Normalny JPA:

hibernate.temp.use_jdbc_metadata_defaults=false
Narayan Yerrabachu
źródło
1
Z którą wersją Java to wypróbowałeś? Intellij nie może znaleźć tej właściwości.
comiventor
Próbowaliśmy zarówno z zaćmieniem, jak iz Intellij. W obu przypadkach działa, tak naprawdę zmęczyliśmy się java 6, 7,8 i jej działaniem nie było dla nas żadnego problemu. Po prostu zdebuguj swój kod lub sprawdź go krzyżowo.
Narayan Yerrabachu
67

Jak zauważyłeś, ten wyjątek nie stanowi prawdziwego problemu. Dzieje się tak podczas uruchamiania, gdy Hibernate próbuje pobrać metadane z bazy danych. Jeśli to Cię denerwuje, możesz je wyłączyć:

hibernate.temp.use_jdbc_metadata_defaults false
jpkrohling
źródło
1
Dzięki Partenon. Zdaję sobie sprawę z opcji wyłączenia go, ale próbuję znaleźć przyczynę tego wyjątku. Jakieś wskazówki?
GiriByaks
6
O ile rozumiem, nie jest to problem z twoją aplikacją, Hibernate po prostu sprawdza, czy DB obsługuje niektóre funkcje i dostosowuje się, jeśli nie. Sprawdziłbym, czy wyzwala to jakieś mapowanie (jak pole LOB), ale nie ma się czym martwić.
jpkrohling
5
OSTRZEŻENIE : Używanie tego rozwiązania z Oracle jest niebezpieczne ! Prowadzi do nieoczekiwanych COMMITów . Kiedy hibernacja tworzy tabele tymczasowe, musi otworzyć nową transakcję, ponieważ instrukcje DDL w Oracle DB implikują COMMIT. Ustawiając tę ​​opcję na fałsz, wyłączasz otwieranie nowej transakcji i DDL powoduje problemy w ramach transakcji, ZATWIERDZAJĄ to.
Boris Brodski
@BorisBrodski, czy na pewno opisane zachowanie jest spowodowane ustawieniem tej właściwości na wartość false? Patrząc na kod, nie widzę nic więcej wykonywanego, gdy jest to fałszywe: github.com/hibernate/hibernate-orm/blob/… .
jpkrohling
3
@jpkrohling Tak, debugowany hibernate4.2.7 i zobaczyła jeśli ja: Ustawienie useJdbcMetadatado falsezapobiega metaReportsDDLCausesTxnCommitbyć ustawiony i pozostaje false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski
28

Patrząc na komentarze w źródle :

Zasadniczo sprawdzamy tutaj po prostu, czy możemy wywołać metody java.sql.Connection do tworzenia LOB dodane w JDBC 4. Nie tylko sprawdzamy, czy java.sql.Connection deklaruje te metody, ale także czy rzeczywista java.sql.Connection instancja je implementuje (tzn. można ją wywołać bez rzucania wyjątku).

Próbuje więc określić, czy może użyć nowych metod JDBC 4. Domyślam się, że twój sterownik może nie obsługiwać nowej metody tworzenia LOB.

Steve K.
źródło
5
Czy to oznacza, że Driver does not support LOB featureczy Database does not support LOB feature?
Marek Sebera
@MarekSebera Driver. Mam ten problem, ponieważ coś w tajemniczy sposób zastępuje moją bibliotekę C3P0 starą wersją. Baza danych obsługuje to dobrze.
Nyerguds
24

Aby ukryć wyjątek:

W przypadku Hibernate 5.2 (i Spring Boot 2.0) możesz użyć właściwości use_jdbc_metadata_defaults, którą wskazali inni:

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

Lub, jeśli nie chcesz mieć żadnych skutków ubocznych z powyższego ustawienia (jest komentarz ostrzegający nas o niektórych skutkach ubocznych Oracle, nie wiem, czy jest ważny, czy nie), możesz po prostu wyłączyć rejestrowanie wyjątku takiego jak ten :

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

Aby pozbyć się wyjątku

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

W hibernate.cfg.xmlpliku Dodaj poniżej właściwość

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
UdayKiran Pulipati
źródło
5
To ta sama odpowiedź, co u Steve'a K. Dlaczego odpowiadasz na nią ponownie?
Bevor
4
@Bevor on wyjaśnił problem, ale dałem odpowiedź.
UdayKiran Pulipati
2
Chcesz tylko nakazać aktualizacje, kopiując już udzieloną odpowiedź. Twoja odpowiedź nie różni się od Steve K.
Bevor
2
Dzięki. Na tej podstawie dodałem <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> do persistence.xmlpliku i rozwiązałem problem. Używam JPA z Hibernate.
dschulz
4
@Bevor być szczerym dla nowicjusza takiego jak ja, ta odpowiedź jest znacznie jaśniejsza po części, gdzie powinienem umieścić tę właściwość
Anatoly Yakimchuk
14

Zaktualizuj to, aby używać Hibernate 4.3.x / 5.0.x - możesz po prostu ustawić tę właściwość na true:

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

aby pozbyć się tego komunikatu o błędzie. Ten sam efekt, ale bez szczegółu „rzucony wyjątek”. Aby uzyskać szczegółowe informacje, zobacz źródło LobCreatorBuilder.

Torsten Krah
źródło
ustaw to w persistence.xml
user961954
10

Po prostu dodaj poniższy wiersz w pliku application.properties

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
Rupesh Patil
źródło
6

Jak wspomniano w innych komentarzach, używając

hibernate.temp.use_jdbc_metadata_defaults = false

... naprawi irytującą wiadomość, ale może prowadzić do wielu innych zaskakujących problemów. Lepszym rozwiązaniem jest po prostu wyłączenie kontekstowego tworzenia LOB za pomocą tego:

hibernate.jdbc.lob.non_contextual_creation = true

Spowoduje to, że Hibernate (w moim przypadku 5.3.10.Final) pominie sondowanie sterownika JDBC i wyświetli następujący komunikat:

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

Jak dotąd wygląda na to, że to ustawienie nie powoduje żadnych problemów.

Jacek Prucia
źródło
4

Jeśli ustawisz:

hibernate.temp.use_jdbc_metadata_defaults: false

może to powodować problemy z PostgreSQL, jeśli nazwa Twojej tabeli zawiera zarezerwowane słowo, takie jak user. Po wstawieniu spróbuje znaleźć sekwencję id z:

select currval('"user"_id_seq');

co oczywiście się nie powiedzie. To przynajmniej z Hibernate 5.2.13 i Spring Boot 2.0.0.RC1. Nie znalazłem innego sposobu, aby zapobiec tej wiadomości, więc teraz po prostu ją zignoruj.

kettunen
źródło
2

Podczas pracy ze Spring boot 2.1.x ten komunikat ostrzegawczy pojawia się podczas uruchamiania aplikacji.

Jak wskazano tutaj, być może ten problem nie pojawił się we wcześniejszych wersjach, ponieważ powiązana właściwość była domyślnie ustawiona na true, a teraz jest fałszywa:

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

W rezultacie rozwiązanie tego jest tak proste, jak dodanie następującej właściwości do pliku spring application.property.

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
migueldoctor
źródło
Dzięki za to. Śledzenie wyjątku w trybie INFO dziennika jest naprawdę denerwujące!
Daniel Fernández
1

Problem występuje, ponieważ nie wybrałeś odpowiedniego JDBC. Wystarczy pobrać i używać JDBC dla Oracle 10g zamiast 11g.

sami
źródło
Huh. To całkowicie przeczy odpowiedzi Borysa Brodskiego. Jesteś pewien, że to ma znaczenie?
Nyerguds
1

Używam hibernacji 5.3.17 i działa dobrze, dodając podane właściwości

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

Dzięki

SK
źródło
0

Wystąpił ten błąd, gdy moja aplikacja internetowa została uruchomiona w systemie Linux przez użytkownika zalogowanego z niewystarczającymi prawami dostępu. Ten błąd

org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: Wyłączenie kontekstowego tworzenia LOB jako metody createClob () spowodowało błąd: java.lang.reflect.InvocationTargetException

zwykle poprzedzone innymi błędami / wyjątkami, szczególnie z serwera aplikacji, np. dla Tomcat:

org.apache.catalina.LifecycleException: nie udało się zainicjować składnika ...

lub

java.lang.UnsatisfiedLinkError: ... nie można otworzyć pliku obiektu współdzielonego: nie ma takiego pliku lub katalogu

Rozwiązanie:

  1. Zatrzymaj bieżące wystąpienie aplikacji internetowych.

  2. Zaloguj się jako superużytkownik lub z odpowiednimi prawami dostępu, np. Root

  3. Uruchom ponownie aplikację internetową lub ponownie wywołaj poprzednią funkcję.

peterong
źródło
0

Dla każdego, kto boryka się z tym problemem dzięki Spring Boot 2

Domyślnie spring boot korzystał z wersji hibernacji 5.3.x, dodałem następującą właściwość w moim pom.xml

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

i błąd zniknął. Przyczyna błędu została już wyjaśniona w powyższych postach

Shailesh Chandra
źródło
-1

Usuń adnotacje @Temporal, jeśli używasz go z klasami java.sql. *.

Amr El-Demerdash
źródło
-3

Sprawdź, czy nie korzystasz z VPN. Miałem ten sam problem, ale zdałem sobie sprawę, że db, z którym łączyłem się zdalnie!

logixplayer
źródło