`
DigitalSonic
  • 浏览: 210225 次
社区版块
存档分类
最新评论

都是JDBC-ODBC惹得祸

阅读更多

前阵子的一个项目需要使用SQL2K作为后台数据库,本人一向认为Java配合MS SQL不是一个好选择,但往往也有不得不这么做的时候。一直听说MS的JDBC驱动不怎么样,所以我的第一反应是使用JDBC-ODBC桥,这样不用为项目添加额外的jar(其实是个很奇怪的理由,估计当时神游了,没怎么考虑)。系统使用了Hibernate 3.1.3和Spring Framework 2.0 RC2。

考虑到减少持久化层的开发,当然是使用工具从现有的数据库生成Hibernate的PO和DAO。但是在生成时发生了点意外,使用JDBC-ODBC桥竟然无法导出。。。无奈,只能暂时用下MS的驱动进行生成,其实这时就该醒悟了,放弃JDBC-ODBC,不过当时没怎么在意,以为在使用时不会有问题。

真正的问题发生在使用Hibernate保存修改时,保存使用了Spring的HibernateTemplate,主要是saveOrUpdate方法。在测试时我发现所有被修改或新增记录的字符型字段全被用空格填满了,比如:name varchar(10),在页面上我只输了"abc",可数据库中保存的却是"abc       "。起初我觉得是MultiActionController里取回表单数据时出问题了,但我一路追踪代码,从自己的代码一直看到Spring的代码,没发现什么问题;接着想想会不会是Hibernate中用的MS SQL Dialect有问题(其实又犯傻了,如果是这里有问题,早就别人被发现了),于是我又看了Hibernate的部分代码,依然无果。在Google上找相关内容,也看到了些遇到此类情况的,但貌似解决方案在我这里都不管用。

突然想到了生成时的情况,于是我修改了下applicationContext中dataSource的定义,直接使用MS的JDBC驱动,一切都好了。就在这时我也在国外的一个网站上找到了和我的情况完全一样的一篇文章,解决方法就是直接使用MS SQL2K的JDBC驱动替代JDBC-ODBC桥。

看来JDBC-ODBC桥也不是万能的,这里的情况实际是它的一个Bug,不巧被我撞上了。因为自己在解决这个问题时花了不少时间,所以记上一笔,如果有人遇上同样的问题,他就可以用中文Google到解决方法了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics