我正在用 Hibernate 编写一个应用程序(目前使用 Hibernate 3),它应该是独立于数据库的;目前我正在使用 Derby 和 Oracle(版本 10g Enterprise Edition Release 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 驱动程序。