CreateClob () yöntemi hata verdiğinden bağlamsal LOB oluşturmayı devre dışı bırakmak


87

Hibernate 3.5.6'yı Oracle 10g ile kullanıyorum. Başlatma sırasında aşağıdaki istisnayı görüyorum, ancak uygulamanın kendisi iyi çalışıyor. Bu istisnanın nedeni nedir? ve nasıl düzeltilebilir?

İstisna Yöntem hata
verdiğinden bağlamsal LOB oluşturmayı devre dışı bırakma createClob():java.lang.reflect.InvocationTargetException

Bilgi
Oracle sürümü: Oracle Database 10g Enterprise Edition Sürüm 10.2.0.4.0 JDBC sürücüsü: Oracle JDBC sürücüsü, sürüm: 11.1.0.7.0


LOB'ları kullanmayı denemediğiniz sürece "uygulamanın kendisi iyi çalışıyor" sanırım.
Nyerguds

Yanıtlar:


76

Aşağıya özellik ekleyerek bu uyarıyı devre dışı bırakın.

Bahar uygulaması için:

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

Normal JPA:

hibernate.temp.use_jdbc_metadata_defaults=false

1
Bunu hangi java sürümüyle denediniz? Intellij bu özelliği bulamıyor.
comiventor

Tutulma ile Intellij'i denedik. Her iki durumda da çalışıyor. Aslında java 6, 7,8 ve bizim için sorunsuz çalışmasıyla yorulduk. Kodunuzda hata ayıklayın veya kodunuzu çapraz kontrol edin.
Narayan Yerrabachu

67

Fark ettiğiniz gibi, bu istisna gerçek bir sorun değil. Hibernate veritabanından bazı meta bilgileri almaya çalıştığında, önyükleme sırasında olur. Bu sizi rahatsız ediyorsa, devre dışı bırakabilirsiniz:

hibernate.temp.use_jdbc_metadata_defaults false

1
Teşekkürler Partenon. Devre dışı bırakma seçeneğinin farkındayım, ancak bu istisnanın nedenini bulmaya çalışıyorum. Herhangi bir işaret var mı?
GiriByaks

6
Anladığım kadarıyla, uygulamanızla ilgili bir sorun değil, Hibernate sadece DB'nin bazı özellikleri destekleyip desteklemediğini doğruluyor ve desteklememesi durumunda kendini ayarlıyor. Herhangi bir eşlemenin bunu tetikleyip tetiklemediğini kontrol ederim (bir LOB alanı gibi), ancak endişelenecek bir şey yok.
jpkrohling

5
UYARI : Bu çözümü Oracle ile kullanmak tehlikelidir ! Beklenmedik COMMIT'lere yol açar . Hibernate, geçici tablolar oluşturduğunda, Oracle DB'deki DDL ifadeleri COMMIT anlamına geldiğinden, yeni bir işlem açmak zorundadır. Bu seçeneği false olarak ayarlayarak, yeni işlem açmayı devre dışı bırakırsınız ve DDL, COMMITing işleminizde sorunlar alır.
Boris Brodski

@BorisBrodski, tarif ettiğiniz davranışın bu özelliğin yanlış olarak ayarlanmasından kaynaklandığından emin misiniz? Koda baktığımda , bu yanlış olduğunda çalıştırılan fazladan bir şey görmüyorum: github.com/hibernate/hibernate-orm/blob/… .
jpkrohling

3
Ayar: kendim Evet @jpkrohling, ben hibernate4.2.7 ve testere debug useJdbcMetadataetmek falseönler metaReportsDDLCausesTxnCommitayarlanması ve kalır false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski

28

Kaynaktaki yorumlara bakıldığında :

Temel olarak burada, JDBC 4'e eklenen LOB oluşturma için java.sql.Connection yöntemlerini çağırıp çağıramayacağımızı kontrol ediyoruz. Sadece java.sql.Connection'ın bu yöntemleri bildirip bildirmediğini, aynı zamanda gerçek java.sql.Connection olup olmadığını da kontrol ediyoruz. örnek onları uygular (yani sadece bir istisna atmadan çağrılabilir).

Bu nedenle, bazı yeni JDBC 4 yöntemlerini kullanıp kullanamayacağını belirlemeye çalışıyor. Sanırım sürücünüz yeni LOB oluşturma yöntemini desteklemiyor olabilir.


5
Bu demek mi Driver does not support LOB featureyoksa Database does not support LOB feature?
Marek Sebera

@MarekSebera Sürücüsü. Bu sorunu yaşıyorum çünkü bir şey eski bir sürümle C3P0 kitaplığımı gizemli bir şekilde geçersiz kılıyor. Veritabanı bunu gayet iyi destekliyor.
Nyerguds

24

İstisnayı gizlemek için:

Hibernate 5.2 (ve Spring Boot 2.0) için, diğerlerinin belirttiği use_jdbc_metadata_defaults özelliğini kullanabilirsiniz :

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

Veya yukarıdaki ayardan herhangi bir yan etkiye sahip olmak istemiyorsanız (bazı Oracle yan etkileri hakkında bizi uyaran bir yorum var, bunun geçerli olup olmadığını bilmiyorum), sadece bu gibi istisnanın günlüğünü devre dışı bırakabilirsiniz :

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

21

İstisnadan kurtulmak için

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

Gelen hibernate.cfg.xmldosyanın özelliği aşağıda ekle

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

5
Bu Steve K ile aynı cevap. Neden tekrar cevap veriyorsun?
Bevor

4
@Bevor sorunu açıkladı ama ben cevap verdim.
UdayKiran Pulipati

2
Güncellemeleri yalnızca önceden verilmiş bir cevabı kopyalayarak yönetmek istiyorsunuz. Cevabınız Steve
K.'den

2
Teşekkürler. Buna dayanarak, diye ekledim <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> için persistence.xmldosya ve bu benim için sorun çözüldü. JPA'yı Hibernate ile kullanıyorum.
dschulz

4
@ Benim gibi bir acemi için dürüst olmak gerekirse, bu cevap kısmen bu mülkü nereye koymam gerektiği konusunda çok daha net
Anatoly Yakimchuk

14

Hibernate 4.3.x / 5.0.x'i kullanmak için bunu güncelleyin - bu özelliği doğru olarak ayarlayabilirsiniz:

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

bu hata mesajından kurtulmak için. Aynı etki, ancak "istisna atıldı" ayrıntısı olmadan. Ayrıntılar için LobCreatorBuilder kaynağına bakın.


bunu persistence.xml'de ayarlayın
user961954

10

Application.properties bölümünde aşağıdaki satıra eklemeniz yeterli

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

6

Kullanarak diğer yorumlarda belirtildiği gibi

hibernate.temp.use_jdbc_metadata_defaults = false

... sinir bozucu mesajı düzeltir, ancak diğer birçok şaşırtıcı soruna yol açabilir. Daha iyi bir çözüm, yalnızca bununla bağlamsal LOB oluşturmayı devre dışı bırakmaktır:

hibernate.jdbc.lob.non_contextual_creation = true

Bu, Hazırda Bekletme'nin (benim durumumda 5.3.10.Final) JDBC sürücüsünü araştırmayı atlamasına ve aşağıdaki mesajı vermesine neden olacaktır:

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

Şimdiye kadar bu ayar herhangi bir soruna neden olmuyor gibi görünüyor.



4

Eğer ayarlarsanız:

hibernate.temp.use_jdbc_metadata_defaults: false

tablo adınız user gibi rezerve edilmiş kelime içerdiğinde PostgreSQL ile sorunlara neden olabilir. Ekledikten sonra, kimlik sırasını şu şekilde bulmaya çalışacaktır:

select currval('"user"_id_seq');

ki bu açıkça başarısız olacaktır. Bu, en azından Hibernate 5.2.13 ve Spring Boot 2.0.0.RC1 ile. Bu mesajı engellemenin başka bir yolunu bulamadım, bu yüzden şimdi onu görmezden gelin.


2

Spring boot 2.1.x ile çalışırken, uygulama başlatılırken bu uyarı mesajı görünür.

Burada belirtildiği gibi, ilgili özellik varsayılan olarak true değerine ayarlandığı ve şimdi yanlış olduğu için bu sorun daha önceki sürümlerde ortaya çıkmamış olabilir:

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

Sonuç olarak, bunu çözmek, aşağıdaki özelliği spring application.property dosyasına eklemek kadar basittir.

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

Bunun için teşekkürler. Günlük BİLGİ modunda bir istisna izleme gerçekten can sıkıcıdır!
Daniel Fernández

1

Sorun, uygun JDBC'yi seçmediğiniz için ortaya çıkıyor. 11g yerine oracle 10g için JDBC'yi indirin ve kullanın.


Huh. Bu, Boris Brodski'nin cevabıyla tamamen çelişiyor. Bunun bir fark yaratacağına emin misin?
Nyerguds

1

Hazırda bekletme 5.3.17 kullanıyorum ve verilen özellikleri ekleyerek iyi çalışıyor

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

Teşekkürler


0

Web uygulamam Linux'ta yetersiz erişim haklarıyla oturum açan kullanıcı tarafından başlatıldığında bu hataya çarptım. Bu hata

org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: createClob () yöntemi hata verdiğinden bağlamsal LOB oluşturmayı devre dışı bırakma: java.lang.reflect.InvocationTargetException

genellikle diğer hatalar / istisnalardan önce gelir, özellikle uygulama sunucunuzdan, yani Tomcat için:

org.apache.catalina.LifecycleException: Bileşen başlatılamadı ...

veya

java.lang.UnsatisfiedLinkError: ... paylaşılan nesne dosyasını açamıyor: Böyle bir dosya veya dizin yok

Çözüm:

  1. Web uygulamalarınızın mevcut örneğini durdurun.

  2. Süper kullanıcıyla veya yeterli erişim haklarına sahip olanlarla, yani root ile giriş yapın

  3. Web uygulamanızı yeniden başlatın veya önceki işlevi tekrar arayın.


0

Spring Boot 2 ile bu sorunla karşılaşan herkes için

Spring boot varsayılan olarak hibernate 5.3.x sürümünü kullanıyordu, pom.xml dosyama aşağıdaki özelliği ekledim

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

ve hata gitti. Hatanın nedeni yukarıdaki yazılarda zaten açıklanmıştır



-3

Bir VPN'de olup olmadığınızı kontrol edin. Aynı sorunu yaşadım ama uzaktan kumandaya bağlandığım db'yi fark ettim!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.