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
Odpowiedzi:
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
źródło
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
źródło
useJdbcMetadata
dofalse
zapobiegametaReportsDDLCausesTxnCommit
być ustawiony i pozostajefalse
! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…Patrząc na komentarze w źródle :
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.
źródło
Driver does not support LOB feature
czyDatabase does not support LOB feature
?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
źródło
Aby pozbyć się wyjątku
INFO - HHH000424: Disabling contextual LOB creation as createClob() method threw error :java.lang.reflect.InvocationTargetException
W
hibernate.cfg.xml
pliku Dodaj poniżej właściwość<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
źródło
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
dopersistence.xml
pliku i rozwiązałem problem. Używam JPA z Hibernate.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.
źródło
Po prostu dodaj poniższy wiersz w pliku application.properties
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
źródło
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.
źródło
Aktualizacja sterownika JDBC do najnowszej wersji usunęła nieprzyjemny komunikat o błędzie.
Możesz go pobrać stąd:
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
Wymagana jest jednak bezpłatna rejestracja.
źródło
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.
źródło
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
źródło
Problem występuje, ponieważ nie wybrałeś odpowiedniego JDBC. Wystarczy pobrać i używać JDBC dla Oracle 10g zamiast 11g.
źródło
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
źródło
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
zwykle poprzedzone innymi błędami / wyjątkami, szczególnie z serwera aplikacji, np. dla Tomcat:
lub
Rozwiązanie:
Zatrzymaj bieżące wystąpienie aplikacji internetowych.
Zaloguj się jako superużytkownik lub z odpowiednimi prawami dostępu, np. Root
Uruchom ponownie aplikację internetową lub ponownie wywołaj poprzednią funkcję.
źródło
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
źródło
Usuń adnotacje @Temporal, jeśli używasz go z klasami java.sql. *.
źródło
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!
źródło