Menonaktifkan pembuatan LOB kontekstual sebagai metode createClob () membuat kesalahan

87

Saya menggunakan Hibernate 3.5.6 dengan Oracle 10g. Saya melihat pengecualian di bawah ini selama inisialisasi tetapi aplikasi itu sendiri berfungsi dengan baik. Apa penyebab pengecualian ini? dan bagaimana itu bisa diperbaiki?

Pengecualian
Menonaktifkan pembuatan LOB kontekstual sebagai createClob()metode melempar kesalahan:java.lang.reflect.InvocationTargetException

Info
Versi Oracle: Oracle Database 10g Enterprise Edition Rilis 10.2.0.4.0 Driver JDBC: Driver Oracle JDBC, versi: 11.1.0.7.0

GiriByaks
sumber
"aplikasinya sendiri berfungsi dengan baik" ... selama Anda tidak mencoba menggunakan LOB, saya membayangkan.
Nyerguds

Jawaban:

76

Nonaktifkan peringatan ini dengan menambahkan properti di bawah.

Untuk aplikasi Spring:

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

JPA normal:

hibernate.temp.use_jdbc_metadata_defaults=false
Narayan Yerrabachu
sumber
1
Versi java apa yang Anda coba? Intellij tidak dapat menemukan properti ini.
comiventor
Kami mencoba dengan gerhana dan Intellij. Dalam kedua kasus itu bekerja. Sebenarnya, kami lelah dengan java 6, 7,8 dan bekerja tanpa masalah bagi kami. Cukup debug kode Anda atau periksa ulang kode Anda.
Narayan Yerrabachu
67

Seperti yang Anda perhatikan, pengecualian ini bukanlah masalah nyata. Itu terjadi selama boot, ketika Hibernate mencoba mengambil beberapa informasi meta dari database. Jika ini mengganggu Anda, Anda dapat menonaktifkannya:

hibernate.temp.use_jdbc_metadata_defaults false
jpkrohling.dll
sumber
1
Terima kasih Partenon. Saya mengetahui opsi untuk menonaktifkannya, tetapi saya mencoba menemukan alasan untuk pengecualian ini. Ada petunjuk?
GiriByaks
6
Sejauh yang saya pahami, ini bukan masalah dengan aplikasi Anda, Hibernate hanya memverifikasi apakah DB mendukung beberapa fitur dan menyesuaikan sendiri jika tidak. Saya akan memverifikasi jika ada pemetaan yang memicu ini (seperti bidang LOB), tetapi tidak ada yang perlu dikhawatirkan.
jpkrohling
5
PERINGATAN : Menggunakan solusi ini dengan Oracle berbahaya ! Ini mengarah ke COMMIT yang tidak terduga . Ketika hibernate membuat tabel sementara itu harus membuka transaksi baru, karena pernyataan DDL di Oracle DB menyiratkan COMMIT. Dengan menyetel opsi ini ke false, Anda menonaktifkan pembukaan transaksi baru dan DDL mendapatkan masalah dalam transaksi Anda BERKOMITMEN.
Boris Brodski
@BorisBrodski, apakah Anda yakin bahwa perilaku yang Anda jelaskan disebabkan oleh pengaturan properti ini ke false? Melihat kodenya, saya tidak melihat sesuatu yang ekstra dieksekusi ketika ini salah: github.com/hibernate/hibernate-orm/blob/… .
jpkrohling
3
@jpkrohling Ya, saya men-debug hibernate4.2.7 dan melihat apakah diri saya sendiri: Pengaturan useJdbcMetadatake falsemencegah metaReportsDDLCausesTxnCommituntuk diatur dan tetap false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski
28

Melihat komentar di sumber :

Pada dasarnya di sini kita hanya memeriksa apakah kita dapat memanggil metode java.sql.Connection untuk pembuatan LOB yang ditambahkan di JDBC 4. Kita tidak hanya memeriksa apakah java.sql.Connection mendeklarasikan metode ini, tetapi juga apakah java.sql.Connection sebenarnya Instance mengimplementasikannya (yaitu bisa dipanggil tanpa hanya melempar pengecualian).

Jadi, ia mencoba menentukan apakah ia dapat menggunakan beberapa metode JDBC 4 baru. Saya kira driver Anda mungkin tidak mendukung metode pembuatan LOB yang baru.

Steve K
sumber
5
Apakah itu berarti Driver does not support LOB featureatau Database does not support LOB feature?
Marek Sebera
@Marekeberry Driver. Saya mengalami masalah ini karena ada sesuatu yang secara misterius menimpa library C3P0 saya dengan versi kuno. Database mendukungnya dengan baik.
Nyerguds
24

Untuk menyembunyikan pengecualian:

Untuk Hibernate 5.2 (dan Spring Boot 2.0), Anda dapat menggunakan properti use_jdbc_metadata_defaults yang ditunjukkan oleh orang lain:

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

Atau, jika Anda ingin tidak memiliki efek samping dari pengaturan di atas (ada komentar yang memperingatkan kami tentang beberapa efek samping Oracle, saya tidak tahu apakah itu valid atau tidak), Anda dapat menonaktifkan logging pengecualian seperti ini :

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

Untuk menghilangkan pengecualian

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

Dalam hibernate.cfg.xmlfile Tambahkan properti di bawah ini

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
UdayKiran Pulipati
sumber
5
Ini adalah jawaban yang sama dengan jawaban dari Steve K. Mengapa Anda menjawabnya lagi?
Bevor
4
@Bevor dia menjelaskan masalahnya tetapi saya memberikan jawaban.
UdayKiran Pulipati
2
Anda hanya ingin memperbarui perintah dengan menyalin jawaban yang sudah diberikan. Jawaban Anda tidak berbeda dengan Steve K.
Bevor
2
Terima kasih. Berdasarkan ini, saya menambahkan <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> ke persistence.xmlfile dan itu memecahkan masalah untuk saya. Saya menggunakan JPA dengan Hibernate.
dschulz
4
@Bevor jujur ​​untuk pemula seperti saya jawaban ini jauh lebih jelas sebagian di mana saya harus meletakkan properti ini
Anatoly Yakimchuk
14

Perbarui ini untuk menggunakan Hibernate 4.3.x / 5.0.x - Anda bisa menyetel properti ini ke true:

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

untuk menghilangkan pesan kesalahan itu. Efek yang sama tetapi tanpa detail "lempar pengecualian". Lihat sumber LobCreatorBuilder untuk detailnya.

Torsten Krah
sumber
setel ini di persistence.xml
user961954
10

Cukup tambahkan baris di bawah ini di application.properties

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

Seperti yang disebutkan di komentar lain menggunakan

hibernate.temp.use_jdbc_metadata_defaults = false

... akan memperbaiki pesan yang mengganggu, tetapi dapat menyebabkan banyak masalah mengejutkan lainnya. Solusi yang lebih baik adalah menonaktifkan pembuatan LOB kontekstual dengan ini:

hibernate.jdbc.lob.non_contextual_creation = true

Ini akan menyebabkan Hibernate (dalam kasus saya, 5.3.10.Final) untuk melewati pemeriksaan driver JDBC dan hanya menampilkan pesan berikut:

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

Sejauh ini sepertinya pengaturan ini tidak menimbulkan masalah.

Jacek Prucia
sumber
4

Jika Anda mengatur:

hibernate.temp.use_jdbc_metadata_defaults: false

hal ini dapat menyebabkan Anda bermasalah dengan PostgreSQL ketika nama tabel Anda berisi kata khusus seperti pengguna. Setelah dimasukkan akan mencoba mencari urutan id dengan:

select currval('"user"_id_seq');

yang jelas akan gagal. Ini setidaknya dengan Hibernate 5.2.13 dan Spring Boot 2.0.0.RC1. Belum menemukan cara lain untuk mencegah pesan ini jadi abaikan saja.

kettunen
sumber
2

Saat bekerja dengan Spring boot 2.1.x pesan peringatan ini muncul saat memulai aplikasi.

Seperti yang ditunjukkan di sini, mungkin masalah ini tidak muncul di versi sebelumnya karena properti terkait disetel ke true secara default dan sekarang salah:

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

Akibatnya, menyelesaikan ini semudah menambahkan properti berikut ke file spring application.property.

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
migueldoctor.dll
sumber
Terima kasih untuk ini. Jejak pengecualian dalam mode INFO log benar-benar mengganggu!
Daniel Fernández
1

Masalah terjadi karena Anda tidak memilih JDBC yang sesuai. Cukup unduh dan gunakan JDBC untuk oracle 10g, bukan 11g.

sami
sumber
Hah. Ini sangat bertentangan dengan tanggapan Boris Brodski. Anda yakin ini ada bedanya?
Nyerguds
1

Saya menggunakan hibernate 5.3.17 dan berfungsi dengan baik dengan menambahkan properti yang diberikan

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

Terima kasih

SK
sumber
0

Saya mengalami kesalahan ini ketika aplikasi web saya dimulai di Linux oleh pengguna yang masuk dengan hak akses yang tidak memadai. Kesalahan ini

org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: Menonaktifkan pembuatan LOB kontekstual sebagai metode createClob () membuat kesalahan: java.lang.reflect.InvocationTargetException

biasanya didahului oleh kesalahan / pengecualian lain, terutama dari server aplikasi Anda yaitu untuk Tomcat:

org.apache.catalina.LifecycleException: Gagal menginisialisasi komponen ...

atau

java.lang.UnsatisfiedLinkError: ... tidak dapat membuka file objek bersama: File atau direktori tersebut tidak ada

Larutan:

  1. Hentikan aplikasi web Anda saat ini.

  2. Login dengan pengguna super atau mereka yang memiliki hak akses yang memadai yaitu root

  3. Mulai ulang aplikasi web Anda atau panggil fungsi sebelumnya lagi.

peterong
sumber
0

Untuk siapa saja yang menghadapi masalah ini dengan Spring Boot 2

secara default spring boot menggunakan versi hibernate 5.3.x, saya telah menambahkan properti berikut di pom.xml saya

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

dan kesalahan hilang. Alasan kesalahan sudah dijelaskan dalam posting di atas

Shailesh Chandra
sumber
-1

Hapus anotasi @Temporal jika Anda menggunakannya dengan kelas java.sql. *.

Amr El-Demerdash
sumber
-3

Periksa apakah Anda tidak menggunakan VPN. Saya memiliki masalah yang sama tetapi menyadari db yang saya hubungkan ke remote!

logixplayer
sumber