我正在编写一个Hibernate应用程序(目前使用Hibernate 3)应该是独立于数据库的;目前我正在使用Derby和Oracle(版本10g企业版10.2.0.4.0版)。
我的几个数据库列都包含布尔值。很久以前就决定将它们存储为“Y”或“N”,然后使用UserType将它们映射到Java布尔值。用于单元测试的大量数据文件依赖于此配置,因此我不想更改它。
当应用程序使用Derby数据库使用Session.load()构建包含其中一列的对象时,一切正常;特别是,为每个布尔列执行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)
...
代码在AbstractStandardBasicType.nullSafeGet而不是我的用户类型的nullSafeGet这一事实似乎表明我的代码没有被调用;在调试器中设置断点确认了这一点。
我已将hibernate.dialect属性设置为org.hibernate.dialect.Oracle10gDialect
并使用oracle.jdbc.OracleDriver
作为JDBC驱动程序。