データベースに依存しないHibernate(現時点ではHibernate 3を使用)でアプリケーションを作成しています。現在、Derby と Oracle (バージョン 10g Enterprise Edition リリース 10.2.0.4.0) を使用しています。
私のデータベース列のいくつかは、ブール値を保持しています。これらを "Y" または "N" として格納し、UserType を使用して Java ブール値にマップするという決定がかなり前に行われました。この構成に依存する単体テストに使用されるデータ ファイルは多数あるため、変更したくありません。
アプリケーションが Derby データベースを使用して、Session.load(); を使用してこれらの列の 1 つを含むオブジェクトを構築すると、すべてが正常に機能します。特に、UserType コードは各ブール列に対して実行されます。
ただし、Oracle に接続すると、nullSafeGet の UserType コードが呼び出されることはありません。これにより、例外がスローされます: org.hibernate.util.JDBCExceptionReporter SEVERE: Fail to convert to internal representation
、次のスタック トレース:
at oracle.jdbc.driver.CharCommonAccessor.getBoolean(CharCommonAccessor.java:185)
at oracle.jdbc.driver.T4CCharAccessor.getBoolean(T4CCharAccessor.java:699)
at oracle.jdbc.driver.OracleResultSetImpl.getBoolean(OracleResultSetImpl.java:626)
at oracle.jdbc.driver.OracleResultSet.getBoolean(OracleResultSet.java:386)
at org.hibernate.type.descriptor.sql.BitTypeDescriptor$2.doExtract(BitTypeDescriptor.java:64)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:229)
...
コードがユーザー タイプの nullSafeGet ではなく AbstractStandardBasicType.nullSafeGet にあるという事実は、コードが呼び出されていないことを示しているようです。デバッガーでブレークポイントを設定すると、これが確認されます。
hibernate.dialect プロパティをに設定し、JDBC ドライバーとしてorg.hibernate.dialect.Oracle10gDialect
使用しています。oracle.jdbc.OracleDriver