Hibernate could not inittialize proxy-no Session 以及cannot simultaneously fetch multiple bags

1.hibernate3中出现 could not initialize proxy - no Session 错误的解决办法以及lazy load的介绍 :
这是一个经典的问题:
当一个对象的关联对象采用的是lazy懒加载时,这样hibernate在从数据库中调数据的时候是不会吧关联的对象查出来的,而是保存一个获取值的方法,在你使用getXXX()调用的时候,hibernate会利用这个保存的方法去从数据库中取数据。而往往我们在jsp页面中使用getXXX()准备显示数据时候,session早已经dao中就关闭了,我们该如何解决这个问题呢?

简单的说有三种:
1.把lazy设成false,最2的办法,但是最简单,简单就是美嘛,也依然会有很多再使用这个方式再解决类似问题。

2.在web.xml中加入 以下拦截器

<filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate4.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>*.action</url-pattern>
    </filter-mapping>

重点:org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个 Session,直到这个请求结束,具体是通过一个Filter来实现的。由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个 LazyLoad的Exception。所以为了解决这个问题,Spring引入了这个Filter,使得Hibernate的Session的生命周期变长。
用到srping的filter(要加在strutsfilter有前面,因为它也有先后顺序,有先进先出的原则)

这里写图片描述

2.Hibernate出现cannot simultaneously fetch multiple bags
出现这个问题的原因是一个对象里面有两个关联的list,如:
AppBasic 对象与GameCustomDayNewUserCount、
GameCustomDayActiveUserCount这两个对象多存在一对多的关系,如果fetchType采用eager会出现以上的错误。
当(fetch = FetchType.EAGER)多余一个时,持久框架抓取一方的对象时,同时又将多方的对象加载进容器中,多方又可能关联其它对象,Hibernate 实现的JPA,默认最高抓取深度含本身级为四级(它有个属性配置是0-3),若多方(第二级)存在重复值,则第三级中抓取的值就无法映射,就会出现 multiple bags。
所有解决办法就是将eager都改成lazy,如以下例子所示。

其他方法参照:
http://blog.sina.com.cn/s/blog_697b968901017w9p.html

@Entity
@Table(name = “app_basic”,catalog=”app_data”)
public class AppBasic implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = “uuid”)

//一的一方的配置
@OneToMany(mappedBy = "appBasic", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<GameCustomDayActiveUserCount> gameCustomDayActiveUserCounts;

//一的一方的配置
@OneToMany(mappedBy = "appBasic", cascade = CascadeType.ALL, fetch = FetchType.LAZY )
private List<GameCustomDayNewUserCount> gameCustomDayNewUserCounts;


public List<GameCustomDayActiveUserCount> getGameCustomDayActiveUserCounts() {
    return gameCustomDayActiveUserCounts;
}
public void setGameCustomDayActiveUserCounts(
        List<GameCustomDayActiveUserCount> gameCustomDayActiveUserCounts) {
    this.gameCustomDayActiveUserCounts = gameCustomDayActiveUserCounts;
}
public List<GameCustomDayNewUserCount> getGameCustomDayNewUserCounts() {
    return gameCustomDayNewUserCounts;
}
public void setGameCustomDayNewUserCounts(
        List<GameCustomDayNewUserCount> gameCustomDayNewUserCounts) {
    this.gameCustomDayNewUserCounts = gameCustomDayNewUserCounts;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值