首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • HibernateTemplate.load(class,id) 出现异常 [已结帖,结帖人:dragon2k]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dragon2k
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-23 20:27:48 楼主
    spring 2.5 + Hibernate 3.1
    使用Spring 的 HibernateTemplate

    Java code
    public class HelloDaoImpl extends HibernateDaoSupport implements HelloDao { public Hello loadHelloById(Long id) { 1. Session session=getSession(); return (Hello) session.load(Hello.class,id); 2. //return (Hello) getHibernateTemplate().load(Hello.class,id); } }


    调用代码:

    Java code
    Hello hello = dao.loadHelloById(new Long(1)); 3: System.out.println(hello.getId());


    1.如果使用 session.load 没有问题,
    2.如果使用 hibernateTemplate.load(),在执行到3处抛出异常:

    Java code
    Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111) at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150) at dragon.spring.hello.orm.module.Hello$$EnhancerByCGLIB$$c60e1fef.setMessage(<generated>) at dragon.spring.hello.orm.HibernateMain.main(HibernateMain.java:41) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)



    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • AWUSOFT
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 20:48:031楼 得分:0
    连接池设置有问题吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dragon2k
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 21:13:592楼 得分:0
    没问题,刚才测了一下,应该放在事务里面就ok了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dragon2k
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 21:15:133楼 得分:0
    连接池没问题,template和session用的同一个sessionFactory
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Aniao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 23:17:304楼 得分:20
    load执行的时候并不会执行SQL语句,只是取得对对象的引用,当你调用object.getXXX()的时候才会执行SQL语句,而如果你执行object.getXXX()的时候,相应的SESSION已经被关闭了,就会出现如上的情况,getHibernateTemplate()就是这样的情况。
    像LZ这种情况,如果要用getHibernateTemplate,然后要在另外一个方法或者类里取得被返回对象的属性而不报这种异常,有着几种方法。
    1。如果是WEB应用,可以在web.xml里加入OpenSessionInView这个filter,这样的话每次请求都会帮你维护一个session对象而不关闭
    2。用Spring的HibernateInterceptor来作为拦截器,或者说代理,也会帮你在某个BEAN的方法执行开始创造一个SESSION。方法结束后关闭。
    3。如果你要里面的XX属性,建议在执行getHibernateTemplate().load()这个方法的方法里面直接运行一次object.getXX(),这样就会把东西取出来了。
      或者直接Hibernate.Initial(Object);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dragon2k
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-28 01:21:375楼 得分:0

    引用 4 楼 Aniao 的回复:
    load执行的时候并不会执行SQL语句,只是取得对对象的引用,当你调用object.getXXX()的时候才会执行SQL语句,而如果你执行object.getXXX()的时候,相应的SESSION已经被关闭了,就会出现如上的情况,getHibernateTemplate()就是这样的情况。
    像LZ这种情况,如果要用getHibernateTemplate,然后要在另外一个方法或者类里取得被返回对象的属性而不报这种异常,有着几种方法。
    1。如果是WEB应用,可以在web.xml里加入OpenSessionInView这个…


    在load()时是不执行sql的?只有get时候才真正执行?
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved