dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>java>开源框架>文章内容
关于Hibernate lazy的问题
来源: 作者:
  使用Hibernate时意外报错:
  Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
  at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53)
  at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:84)
  at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:134)
  at com.entry.database.bean.OaLoginLink$EnhancerByCGLIB$a418b18d.getName(<generated>)
  at test.Test.main(Test.java:145)
  很是让我头痛,上网查看相关资料发现这样一个解决方式:
  "org.hibernate.LazyInitializationException: could not initialize proxy"延迟抓取出的错,hb3对many-to-one的默认处理是lazy = "proxy",没有搞懂到底怎么回事,把所有many-to-one,one-to-one都加上lazy="false"...
  这个方法理论上没错,但是会让人产生误解,使人以为只是修改<set>中的lazy值,照做后程序依然会报错,看看下面的文章也许就明白了(注意最后一行红色标记)!
  lazy initialization
  集合(不包括数组)是可以延迟初始化的,意思是仅仅当应用程序需要访问时,才载入他们的值。
  s = sessions.openSession();
  User u = (User) s.find("from User u where u.name=?", userName,
  Hibernate.STRING).get(0);
  Map permissions = u.getPermissions();
  s.connection().commit();
  s.close();
  Integer accessLevel = (Integer) permissions.get("accounts"); //Error!
  因为在commit之前,permissions没有被用到,permission没有被初始化,而session被close了,导致permissions永远都无法load data.
  解决办法:吧最后一行一道session被提交之前.
  设置:
  <set name="names" table="NAMES" lazy="true" order-by="name asc">
  <key column="group_id"/>
  <element column="NAME" type="string"/>
  </set>
  ==================================
  在做Spring1.2 + Hibernate 3 + struts demo时候遇到一个问题,编辑用户数据时候
  用com.jeedev.service.dao.hibernate.UserHibernateDao 中 public TSysuser getUser(int userid) { } 方法,总是不能正常显示编辑数据。具体表现为:
  参考 com.jeedev.service.dao.hibernate.UserHibernateDao 第32-45行
  java代码:
  public TSysuser getUser(int userid) {
  if (this.getHibernateTemplate() == null) {
  System.out.println("error at there");
  return null;
  }
  TSysuser edituser= (TSysuser) getHibernateTemplate().load(TSysuser.class, new Integer(userid));
  System.out.println(edituser.getUsername());
  System.out.println(edituser.getDeptno());
  return edituser;
  }
  如果删除上面的
  java代码:
  System.out.println(edituser.getUsername());
  System.out.println(edituser.getDeptno());
  在点击编号,修改时候就会出现错误:
  2005-10-27 15:35:59,245 ERROR [org.hibernate.LazyInitializationException] - could not initialize proxy - the owning Session was closed
  org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
  经过在javaeye论坛大家一致认为 是hibernate lazy的原因
  在WEB级别应用时候,会出现意想不到的lazy错误,解决方法就是 设置 lazy="false" 例:
  <hibernate-mapping>
  <class name="com.jeedev.hb.TSysuser" table="t_sysuser" lazy="false">

上一篇:struts+hibernate整合   下一篇:Flex 与 javascript 交互
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·关于JSF和Struts的讨论
·Struts教程-Struts模块化编程教
·Struts入门经验
·用科学的思维方法指导软件的设计
·Hibernate配置文件中映射元素详
·Spring中事件处理的小技巧
·struts2.0pring2.0 hibernate3.2
·struts2.0 spring2.0 hibernate3
·浅谈hibernate lazy fetch
·Hibernate的Fetch
·优化hibernate性能的几点建议
·Hibernate中的取策略延迟加载
  相关文章
·struts+hibernate整合
·Hibernate中outer-join、lazy 、
·Hibernate中的取策略延迟加载
·优化hibernate性能的几点建议
·Hibernate的Fetch
·浅谈hibernate lazy fetch
·hibernate增删改查代码实例
·SAXBuilder,Document,Element
·JDOM、Schema验证xml文件
·JDOM入门
·学习装饰者模式(Decorator)
·DAO设计模式
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763