hibernate一对多取到的set集合 failed to lazily initialize a collection of role

SGroup ,SGroupPrv 一对多关系

在 SGroup .hbm.xml中部门配置



<set name="SGroupPrvs" inverse="true" cascade="all" lazy="true">
<key>
<column name="GROUPID" precision="22" scale="0"/>
</key>
<one-to-many class="com.news.Hibernate.SGroupPrv"/>
</set>



JAVA其中代码:


String groupid=request.getParameter("groupid");
System.out.print("组名id:"+groupid);
SGroup groups=groupManager.getSGroup(groupid);
groups.setGroupid(Integer.parseInt(groupid));
System.out.println("groupid:"+groups.getGroupid());
System.out.println("groupname:"+groups.getName());
System.out.print("是否实例化:"+Hibernate.isInitialized(groups));
if(!Hibernate.isInitialized(groups))
Hibernate.initialize(groups);

//Hibernate.initialize(groups.getSGroupPrvs());
Set<SGroupPrv> set=groups.getSGroupPrvs();
System.out.print("是否实例化:"+Hibernate.isInitialized(set));
if(!Hibernate.isInitialized(set))
Hibernate.initialize(set);
System.out.print("是否实例化:"+Hibernate.isInitialized(set));
System.out.println(set.size());



运行出现failed to lazily initialize a collection of role异常

主要原因是:SGroup 采用了延迟加载策略,根据主键搜索出SGroup 对象时,并没有把Set<SGroupPrv>集合一并的搜索出来,得用到时才加载Set<SGroupPrv>,当用到Set<SGroupPrv>集合时无法获取到SGroup 对象的主键值



解决方法:

1.web.xml中加入OpenSessionInViewFilter过滤机制

<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


2.把LOAD(**.class,主键)方法改成GET(**.class,主键)方法,根据主键得到对应的对象

3.观察项目中cglib所属哪个版本的,如果是cglib_2.1.3.jar版本请升级至cglib_2.2.jar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值