createClob()メソッドがエラーをスローしたため、コンテキストLOBの作成を無効にする


87

Oracle10gでHibernate3.5.6を使用しています。初期化中に以下の例外が発生しますが、アプリケーション自体は正常に動作しています。この例外の原因は何ですか?そしてそれをどのように修正することができますか?

例外メソッドがエラーを
スローしたときにコンテキストLOBの作成を無効にするcreateClob()java.lang.reflect.InvocationTargetException

情報
Oracleバージョン:Oracle Database 10g EnterpriseEditionリリース10.2.0.4.0JDBCドライバー:Oracle JDBCドライバー、バージョン:11.1.0.7.0


「アプリケーション自体は正常に動作しています」... LOBを使用しない限り、私は想像します。
Nyerguds 2015年

回答:


76

以下にプロパティを追加して、この警告を無効にします。

Springアプリケーションの場合:

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

通常のJPA:

hibernate.temp.use_jdbc_metadata_defaults=false

1
どのJavaバージョンでこれを試しましたか?Intellijはこのプロパティを見つけることができません。
comiventor 2017

IntellijだけでなくEclipseでも試してみました。どちらの場合も動作します。実際、Java 6、7、8に飽きてしまい、問題なく動作しました。コードをデバッグするか、コードをクロスチェックするだけです。
Narayan Yerrabachu 2017

67

お気づきのように、この例外は実際の問題ではありません。これは、起動中にHibernateがデータベースからメタ情報を取得しようとしたときに発生します。これが気になる場合は、無効にすることができます。

hibernate.temp.use_jdbc_metadata_defaults false

1
パルテノンに感謝します。私はそれを無効にするオプションを知っていますが、私はこの例外の理由を見つけようとしています。ポインタはありますか?
GiriByaks 2011年

6
私が理解している限り、これはアプリケーションの問題ではありません。Hibernateは、DBが一部の機能をサポートしているかどうかを確認し、サポートしていない場合は調整しているだけです。(LOBフィールドのように)マッピングがこれをトリガーしているかどうかを確認しますが、心配する必要はありません。
jpkrohling 2011年

5
警告:Oracleでこのソリューションを使用することは危険です!予期ないCOMMITにつながります。Oracle DBのDDLステートメントはCOMMITを意味するため、hibernateが一時テーブルを作成するときは、新しいトランザクションを開く必要があります。このオプションをfalseに設定すると、新しいトランザクションを開くことが無効になり、トランザクション内でDDLが問題を取得してそれをコミットします。
Boris Brodski 2014

@BorisBrodski、あなたが説明した動作は、このプロパティをfalseに設定したことが原因であると確信していますか?コードを見ると、これがfalseの場合、余分な実行は見られません:github.com/hibernate/hibernate-orm/blob/…
jpkrohling 2014

3
設定:自分自身があればはい@jpkrohling、私はhibernate4.2.7とのこぎりをデバッグuseJdbcMetadataするfalse防止をmetaReportsDDLCausesTxnCommit設定すると、それ滞在falsegrepcode.com/file/repo1.maven.org/maven2/org.hibernate/…–
Boris Brodski

28

ソースのコメントを見てください:

基本的にここでは、JDBC 4で追加されたLOB作成のためにjava.sql.Connectionメソッドを呼び出すことができるかどうかをチェックしています。java.sql.Connectionがこれらのメソッドを宣言しているかどうかだけでなく、実際のjava.sql.Connectionもチェックしています。インスタンスはそれらを実装します(つまり、単に例外をスローせずに呼び出すことができます)。

そのため、新しいJDBC4メソッドを使用できるかどうかを判断しようとしています。あなたのドライバーは新しいLOB作成方法をサポートしていないかもしれません。


5
それはそれを意味していますDriver does not support LOB featureDatabase does not support LOB feature
マレクセベラ2012年

@MarekSeberaドライバー。何かが私のC3P0ライブラリを古いバージョンで不思議に上書きしているので、私はこの問題を抱えています。データベースはそれをうまくサポートしています。
Nyerguds 2015年

24

例外を非表示にするには:

Hibernate 5.2(およびSpring Boot 2.0)の場合、他の人が指摘したuse_jdbc_metadata_defaultsプロパティを使用できます。

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

または、上記の設定による副作用を発生させたくない場合(Oracleの副作用について警告するコメントがありますが、それが有効かどうかはわかりません)、次のように例外のログを無効にすることができます。 :

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

21

例外を取り除くには

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

hibernate.cfg.xml、ファイルプロパティの下に追加します。

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

5
これはスティーブKからの答えと同じです。なぜもう一度答えるのですか?
2014

4
@Bevor彼​​は問題を説明しますが、私は答えました。
UdayKiran Pulipati 2014

2
すでに与えられた答えをコピーすることによってのみ更新を命令したい。あなたの答えは、スティーブ・K.から区別しません
Bevor

2
ありがとう。これに基づい<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> て、persistence.xmlファイルに追加し、問題を解決しました。私はHibernateでJPAを使用しています。
dschulz 2015年

4
@私のような初心者に正直に言うと、この答えは、このプロパティをどこに置くべきかという部分ではるかに明確です
Anatoly Yakimchuk 2016

14

Hibernate 4.3.x / 5.0.xを使用するためにこれを更新します-このプロパティをtrueに設定するだけです:

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

そのエラーメッセージを取り除くために。同じ効果ですが、「スローされた例外」の詳細はありません。詳細については、LobCreatorBuilderのソースを参照してください。


persistence.xmlでこれを設定
user961954

10

application.propertiesに以下の行を追加するだけです

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

6

他のコメントで述べたように

hibernate.temp.use_jdbc_metadata_defaults = false

...迷惑なメッセージを修正しますが、他の多くの驚くべき問題につながる可能性があります。より良い解決策は、これを使用してコンテキストLOBの作成を無効にすることです。

hibernate.jdbc.lob.non_contextual_creation = true

これにより、Hibernate(私の場合は5.3.10.Final)はJDBCドライバーのプローブをスキップし、次のメッセージを出力します。

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

これまでのところ、この設定では問題は発生しないようです。



4

設定した場合:

hibernate.temp.use_jdbc_metadata_defaults: false

テーブル名にuserのような予約語が含まれていると、PostgreSQLで問題が発生する可能性があります。挿入後、次のIDシーケンスを検索しようとします。

select currval('"user"_id_seq');

これは明らかに失敗します。これは、少なくともHibernate5.2.13とSpringBoot2.0.0.RC1では可能です。このメッセージを防ぐ他の方法が見つからなかったので、今は無視してください。


2

Spring boot 2.1.xを使用している場合、この警告メッセージはアプリケーションの起動時に表示されます。

ここに示されているように、関連するプロパティがデフォルトでtrueに設定されていて、現在はfalseであるため、この問題は以前のバージョンでは発生しなかった可能性があります。

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

結果として、これを解決するのは、次のプロパティをSpringapplication.propertyファイルに追加するのと同じくらい簡単です。

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

これをありがとう。ログINFOモードでの例外トレースは本当に迷惑です!
ダニエルフェルナンデス

1

適切なJDBCを選択しなかったために、問題が発生します。11gではなくOracle10g用のJDBCをダウンロードして使用するだけです。


ええと。これは、BorisBrodskiの反応と完全に矛盾しています。これで違いが出ると思いますか?
Nyerguds 2015年

1

私はhibernate5.3.17を使用していますが、特定のプロパティを追加することで正常に機能します

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

ありがとう


0

不十分なアクセス権でログインしたユーザーがLinuxでWebアプリを起動したときに、このエラーが発生しました。このエラー

org.hibernate.engine.jdbc.internal.LobCreatorBuilder-HHH000424:createClob()メソッドがエラーをスローしたときにコンテキストLOB作成を無効にする:java.lang.reflect.InvocationTargetException

通常、特にアプリケーションサーバーからの、つまりTomcatの場合、他のエラー/例外が先行します。

org.apache.catalina.LifecycleException:コンポーネントの初期化に失敗しました...

または

java.lang.UnsatisfiedLinkError:...共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません

解決:

  1. Webアプリの現在のインスタンスを停止します。

  2. スーパーユーザーまたは十分なアクセス権を持つユーザー、つまりrootでログインします

  3. Webアプリを再起動するか、前の関数を再度呼び出します。


0

Spring Boot2でこの問題に直面している人のために

デフォルトでは、SpringBootはHibernate5.3.xバージョンを使用していましたが、pom.xmlに次のプロパティを追加しました

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

そしてエラーはなくなりました。エラーの理由は、上記の投稿ですでに説明されています


-1

java.sql。*クラスで使用する場合は、@ Temporalアノテーションを削除してください。


-3

VPNを使用していないかどうかを確認してください。私は同じ問題を抱えていましたが、リモートに接続しているデータベースに気づきました!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.