转-could not initialize a collection


 

   其实并不是本身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 a collection

 

   最后解决问题的办法:更换驱动  

   用JTDS驱动,也就是采用jtds-1.2.jar而不用msbase.jar、mssqlserver.jar、msutil.jar这三个JAR包。将jtds-1.2.jar放到我们的lib目录的构件路径下。再次测试,成功通过。

 

\

 

 

这几天很郁闷,一直在为这个问题苦恼~代码也看过了,配置文件也都没有错.在百度GOOGLE上泡了几天,虽然也有出现同样的问题,在问题的最后都没有回复的答案,最后都是些已经沉得不能再沉的死帖啦!  

 

今天幸而把该问题解决,目的在于希望以后碰到这类问题的朋友能尽快的找到问题的答案,不至于再像我这般苦恼而重蹈覆辙.  

 

好了,废话不多说了~  

 

首先来看看问题引起的原因.下面是我的代码:  

 

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目录的构件路径下。

你可能感兴趣的:(数据库,Hibernate,ssh,Collection,initialize,could,a,not)