今天幸而把该问题解决,目的在于希望以后碰到这类问题的朋友能尽快的找到问题的答案,不至于再像我这般苦恼而重蹈覆辙.
好了,废话不多说了~
首先来看看问题引起的原因.下面是我的代码:
ItemDAO itemDAO = new ItemDAO();
Item item2 =new Item();
item2 = itemDAO.findById(item.getItemId());
Hibernate.initialize(item2.getStoreItems());
...事务...关闭Session...
也就是在代码执行到Hibernate.initialize(item2.getStoreItems());出现了这般问题.
出现这个问题是因为我使用的是Tomcat+JDBC驱动连接MSSQL数据库导致的.
其实并不是本身JDBC驱动不好.问题是MS的JDBC驱动(也就是3个JAR包)不支持二次查询导致的.
而用过Hibernate的人都知道,在用*.hbm.xml文件中通常用Set的时候需要采用延时的检索机制来减少不必要的开销.当如果我们需要采取立即检索的时候,通常是在代码中调用Hibernate.initialize()方法,而不是将lasy改为false,理由是这样程序员可以根据业务需要来控制检索策略.
当我们之前调用itemDAO.findById(item.getItemId());的时候,Hibernate会到DB中去检索一次数据,由于set的lasy属性为true,因此只是单纯的执行:
select * from table where ID=?
而当执行Hibernate.initialize(item2.getStoreItems());则Hibernate会根据上次查询的结果再次去DB中检索数据,但是...JDBC不支持二次查询,因此最后就直接反馈给我们
could not initialize xxxxxx....
最后解决问题的办法:更换驱动
用JTDS驱动,也就是采用jtds-1.2.jar而不用msbase.jar、mssqlserver.jar、msutil.jar这三个JAR包。将jtds-1.2.jar放到我们的lib目录的构件路径下。再次测试,成功通过。^-^
兄弟我只是一个初学者,以上只是我个人的理解,如果不正确的话,还请各位高人多多指点,同时希望大家能在学习的过程多多帮帮我这个新人,有高人指点明灯,我们会少走许多弯路。最后祝CSDN的朋友身体健康,毕竟做这行,身体最要紧,这年头医院忒黑,没准上一次医院,半年时间就白干了。
呸呸~~平安是福平安是福~
MSN:z7swf@hotmail.com
留个MSN,希望以后多多交流,共同进步~
5 个解决方案
#1
对了,留个jtds-1.2.jar的下载地址,大家可以去下http://prdownloads.sourceforge.net/jtds/jtds-1.2-dist.zip?use_mirror=jaist
#2
学习。。。
#3
ding
#4
恭喜。。。
#5
顶
#1
对了,留个jtds-1.2.jar的下载地址,大家可以去下http://prdownloads.sourceforge.net/jtds/jtds-1.2-dist.zip?use_mirror=jaist
#2
学习。。。
#3
ding
#4
恭喜。。。
#5
顶