想问一下  我直接 在 spring 注入 一个 bean 的Dao 在 一个 普通的类里 想使用这个dao 进行 延时加载数据 但是 老是说 session 关闭了....可以 使用这个 Dao 查询到 自身的属性 
但是无法 加载 关联对象.......
或者集合想问一下 如何解决这个问题呢

解决方案 »

  1.   

    延时加载并不是缓存到本地,而是需要的时候才去数据库找。
    你在取数据之前关闭了session,当然会有问题了。
      

  2.   

    把异常和配置文件粘贴出来
       console的信息业粘贴出来!
    <property name="connection.autocommit">true</property>
    如果是Hibernate的话, 上面的这个配置属性很重要!
      

  3.   

    org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed异常信息....
      

  4.   

    如果要用延迟加载,就要在session关闭之前,对延迟加载的对象进行手动初始化Hibernate.initialize(对象名);初始化完成以后再把session关闭
      

  5.   

    虽然说 使用 join 属性 可以 抓取 到数据但是 还是很不想用这个属性.....因为这样出来的数据 就不 唯一了不知道有没有其他的 使用 fetch="select"
    的方法 实现 类似于 OpenSessionInView 的效果呢
      

  6.   

    不知道你使用的Hibernate版本是什么,异常呢?里面是不是有Proxy这样的东西,说明是产生了代理 了。版本不同,状况不一样的。
      

  7.   


    在SESSION关闭之后调用了延迟加载的属性 有些人写了个过滤器就是在过滤开始的时候开启SESSION 过滤结束之后关闭SESSION 貌似能够解决这个问题
    http://blog.csdn.net/uciqxkj/archive/2008/09/20/2955469.aspx我并不知道你为什么用了延迟加载还去取属性 如果说东西分两头的话(一个需要延迟 一个不需要) 你可以在不需要延迟加载的地方使用JOIN语句我并不知道HIBERNATE有没有在SESSION中设置是否延迟加载的东西 如果没有真希望有一个..
      

  8.   

    get(class,serializable) 
    直接从数据库加载,不会延迟,直接运行sql语句。
    load(class,serizlizable)
    返回的是代理对象,等到真正用到对象的内容时才会发出sql语句---------
    @Test
    public void testLoad(){
    Session session = sessionfactory.getCurrentSession();
    session.beginTransaction();
    Teacher t = (Teacher)session.load(Teacher.class, 1); session.getTransaction().commit();//关闭了session System.out.println(t.getName());//这里报错

    }
    @Test
    public void testGet(){

    Session session = sessionfactory.getCurrentSession();
    session.beginTransaction();
    Teacher t = (Teacher)session.get(Teacher.class, 1);//已经查询到了数据保存到了对象中 session.getTransaction().commit(); System.out.println(t.getName());//不会报错 }没看你怎么加载数据的。
    希望对你有帮助
      

  9.   

    配置文件**.hbm.xml中 lazy值设为false
       or 在关闭session前访问一下关联的对象
      

  10.   

    上上楼的session.getTransaction.Commit();是关闭了session?  load() 还要用到事务?