Oracle 10gでHibernate 3.5.6を使用しています。初期化中に以下の例外が表示されますが、アプリケーション自体は正常に動作しています。この例外の原因は何ですか?そしてそれをどのように修正できますか?
例外
コンテキストLOBの作成を無効にすると、createClob()
メソッドがエラーをスローしました:Java.lang.reflect.InvocationTargetException
情報
Oracleバージョン:Oracle Database 10g Enterprise Editionリリース10.2.0.4.0 JDBCドライバー:Oracle JDBCドライバー、バージョン:11.1.0.7.0
お気づきのように、この例外は実際の問題ではありません。 Hibernateがデータベースからメタ情報を取得しようとすると、ブート中に発生します。これが気になる場合は、無効にすることができます。
hibernate.temp.use_jdbc_metadata_defaults false
以下のプロパティを追加して、この警告を無効にします。
Springアプリケーションの場合:
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
通常のJPA:
hibernate.temp.use_jdbc_metadata_defaults=false
source のコメントを見る:
基本的に、ここでは、JDBC 4で追加されたLOB作成用のJava.sql.Connectionメソッドを呼び出すことができるかどうかを確認しています。Java.sql.Connectionがこれらのメソッドを宣言するかどうかだけでなく、実際のJava.sql.Connectionインスタンスはそれらを実装します(つまり、単に例外をスローすることなく呼び出すことができます)。
そのため、新しいJDBC 4メソッドを使用できるかどうかを判断しようとしています。ドライバーが新しいLOB作成方法をサポートしていない可能性があります。
例外を取り除くには
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>
例外を非表示にするには:
Hibernate 5.2(およびSpring Boot 2.0)の場合、他の人が指摘したse_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
Hibernate 4.3.x/5.0.xを使用するためにこれに更新します-このプロパティをtrueに設定するだけです:
<prop key="hibernate.jdbc.lob.non_contextual_creation">true</prop>
そのエラーメッセージを取り除きます。同じ効果ですが、「例外をスロー」の詳細はありません。詳細については、LobCreatorBuilderソースを参照してください。
Application.propertiesに次の行を追加するだけです
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
設定した場合:
hibernate.temp.use_jdbc_metadata_defaults: false
テーブル名にユーザーのような予約語が含まれていると、PostgreSQLで問題が発生する可能性があります。挿入後、IDシーケンスを見つけようとします:
select currval('"user"_id_seq');
これは明らかに失敗します。これは、少なくともHibernate 5.2.13およびSpring Boot 2.0.0.RC1で発生します。このメッセージを防ぐ他の方法を見つけていないので、今は無視してください。
JDBCドライバーを最新バージョンに更新すると、厄介なエラーメッセージが削除されました。
ここからダウンロードできます:
http://www.Oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
ただし、無料の登録が必要です。
を使用して他のコメントで述べたように
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
これまでのところ、この設定は問題を引き起こさないようです。
問題は、適切なJDBCを選択しなかったために発生します。 11gではなくOracle 10g用のJDBCをダウンロードして使用します。
不十分なアクセス権でログインしたユーザーがLinuxでWebアプリを起動したときに、このエラーが発生しました。このエラー
org.hibernate.engine.jdbc.internal.LobCreatorBuilder-HHH000424:createClob()メソッドがコンテキストLOBの作成を無効にするとエラーがスローされる:Java.lang.reflect.InvocationTargetException
通常、他のエラー/例外が先行します。特に、Tomcatの場合はアプリケーションサーバーからです。
org.Apache.catalina.LifecycleException:コンポーネントの初期化に失敗しました...
または
Java.lang.UnsatisfiedLinkError:...共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません
解決:
Webアプリの現在のインスタンスを停止します。
スーパーユーザーまたは十分なアクセス権(root)を持つユーザーでログインします
Webアプリを再起動するか、以前の関数を再度呼び出します。