其实并不是本身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目录的构件路径下。
相关推荐
NULL 博文链接:https://smartgwt.iteye.com/blog/1252268
Laravel开发-laravel-initialize Laravel初始化
解决:oracle_plsql连服务端时 Initialization error could initialize错误处理方法
主要介绍了Plsql Developer连接Oracle时出现Could not initialize oci.dll解决方案,需要的朋友可以参考下
监听COM口启动程序报错 Could not initialize class gnu.io.RXTXCommDriver异常 是因为需要在%JAVA_HOME%/jre/bin目录中添加rxtxParallel.dll、rxtxSerial.dll文件
内涵jacob_1.14.3-x64.dll;jacob_1.14.3-64.jdk(maven地址);解决方法:Could not initialize class com.jacob.com.ComThread
Ajax-jquery.initialize.zip,用于动态创建元素初始化的jquery插件(几年前很好,在2019年 考虑react或其他东西而不是jquery),ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和...
使用javacpp技术,在32位linux系统上实现视频截图功能,注意so文件放在liberary_path里面
java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.AutoloadedDriver40 导致的原因: 在azkaban的server和executor中缺少一个叫derby.jar的包
Could not initialize "D:\app\Happy\product\11.2.0\dbhome_1\bin\oci.dll" Make sure you have the 32 bits Oracle Client installed. OracleHomeKey: OracleHomeDir: D:\app\Happy\product\11.2.0\dbhome_1 ...
instantclient-basic-windows.x64-11.2.0.4.0
IDA6.4中支持pin的动态二进制插桩功能,这是其中的描述文档
Win7 x64 PL/SQL 连接 Oralce 提示 Could not initialize "%ORACLE_HOME%\bin\oci.dll" 缺少oci文件
基恩士LK-GD500激光感测初始化设置和参数的录入
unable to initialize windows sockets interface error code 0 WINSOCK坏了
JSONArray.fromObject(map)报错:Could not initialize class net.sf.json.JsonConfig。ireport 需要高于2.1版本的包。于是就找了这些包。最后2.2.2适合
解决hbase client在windows环境下报Could not initialize class org.fusesource.jansi.internal.Kernel32的问题,把jar包放入hbase client的lib包下,重新运行hbase.cmd shell即可
1. Person#initialize使用名称Person#initialize 在lib/person.rb中定义一个Person类, lib/person.rb提供一个#initialize方法,该方法接受一个#initialize的参数。 该参数应存储在@name实例变量中。2. Dog#...
1. Person#initialize使用名称Person#initialize 在lib/person.rb中定义一个Person类, lib/person.rb提供一个#initialize方法,该方法接受一个#initialize的参数。 该参数应存储在@name实例变量中。2. Dog#...