文档章节

转-could not initialize a collection

司马他
 司马他
发布于 2014/09/03 14:04
字数 828
阅读 48
收藏 0


 

   其实并不是本身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目录的构件路径下。

本文转载自:http://smartan.iteye.com/blog/1542160

司马他

司马他

粉丝 13
博文 47
码字总数 1633
作品 1
海淀
程序员
私信 提问
需要清除memcach缓存方能解决的几个报错

错误一: 2014-11-10 17:34:36 de.javakaffee.web.msm.serializer.javolution.ReflectionFormat readElements 严重: Could not set field value for field private java.util.Set cn.zan.po......

余二五
2017/11/14
0
0
Set vs. Set

You may know that an unbounded wildcard Set can hold elements of any type, and a raw type Set can also hold elements of any type. What is the difference between them? Two facts ......

泳泳啊泳泳
2018/01/07
0
0
org.hibernate.LazyInitializationException(用hibernate带出从表数据报错),求帮助!

2013-07-20 15:53:56,297 [ERROR] org.hibernate.LazyInitializationException.(LazyInitializationException.java:19) - failed to lazily initialize a collection of role: com.yu.bill.e......

养生程序猿
2013/07/20
10.7K
2
SpringMVC返回json时,Hibernate报懒加载异常

使用ajax访问后端资源,返回json数据时,在Hibernate查询一对多数据时,使用了懒加载,但是等到返回给前端json数据的时候,会报懒加载异常的错误,网上说修改json的转换方式,具体要怎么修改...

SeizeMissing
2017/03/29
333
1
Hibernate的强制加载策略

推迟加载: 推迟加载机制是号码大全为了防止一些无谓的功用开支而提出来关键词挖掘工具的,所谓推迟加载即是当在真实需求数据的时分,才真实履行数据加载操作。在Hibernate中供给了对实体方针...

haomad
2014/08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
5
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
6
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
4
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部