项目架构:
Webwork + Spring + Hibernate + Oracle10g
问题描述:
数据库中某个表中的一个字段为 Date类型,PO中映射类型为 java.sql.Date,保存一个特殊的日期的时候出现问题,这个日期为 1940-6-3 ,通过PLSQL 查询数据中的日期数据正确(1940-6-3),但是再通过程序将数据取出,这是这个日期就会变成 1940-6-2 ,而且只有这个日期会出现问题,其他的日期存取都正常。
问题原因:
经过分析初步怀疑是 Hibernate 在Date类型转换中出现的问题或是Hibernate缓存问题,按照这个思路将Hibernate缓存去掉,再试问题依旧。
由于对使用了很久的Oracle JDBC Driver 很信任,认为 Driver不会出现问题,但还是报着试试看的想法写了一段直接用JDBC 存取数据的代码,令人惊讶的是这个日期问题依旧, 用 ResultSet的getDate方法和getString方法取出的数据就是不同的,用getString取出的数据是 1940-6-3 ,是正确的,用getDate取出的日期是1940-6-2是错误的, 问题终于找到了,去Oracle网站找新的驱动(其实我们用的驱动也不是很旧),浏览Oracle的网站才发现,Oracle10g的不同的小版本如:Oracle 10.2.0.1 至 Oracle 10.2.0.4 都提供了不同的驱动程序。
解决方法:
针对不同的数据库版本下载对应的驱动,问题解决!
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
写了一段小程序,从1900年开始向数据库插入200年的数据(每天一条),然后取出逐条对比没有发现问题!