本帖最后由 xmkgx 于 2010-06-23 17:17:17 编辑

解决方案 »

  1.   

    唉,太专业了,只做过WEB开发,没想过这个问题,帮你顶下
    等待高手
      

  2.   

    <one-to-many> <set> 中设置 lazy="false" 
      

  3.   


    我还是要用lazy load的
      

  4.   


    写HQL也有同样的问题啊。
    我是想解决这个问题,换JDBC改动太大而且不方便
      

  5.   

    自己写个延时加载管理器,使用当前SESSION的GET方法获取级联对象,使用QUERY对象的缓存机制获取多方对象标示,利用标示在查询该对象,返回一方的集合..........
      

  6.   

     public static void main(String[] args) {
            CiTables table = MetaServiceUtils.getCiTablesService().findById(
                    60000000);
            if (table != null && table.getCiAttributes() != null) {            System.out.println(table.getTableId());
                for (Object obj : table.getCiAttributes()) {
                    CiAttribute attr = (CiAttribute) obj;
                    System.out.println(attr.getFldName());
                }
            }
        }
    这个有问题,不应该这样,如果像你这样想,那程序就不用写了,直接可以从一个导航到另一个,这样一个一个下去,
    table.getCiAttributes()换成MetaServiceUtils.getCiTablesService().getCiAttribute()至于里面的具体方法你自己搞了.也让它从服务里得到一个集合.
      

  7.   

    把它们放到一个事务里处理,就可以避开这个问题(下面用到了声明式事务,注意在Spring context进行配置)。
    @Transactional
     public void update() {
            CiTables table = MetaServiceUtils.getCiTablesService().findById(
                    60000000);
            if (table != null && table.getCiAttributes() != null) {            System.out.println(table.getTableId());
                for (Object obj : table.getCiAttributes()) {
                    CiAttribute attr = (CiAttribute) obj;
                    System.out.println(attr.getFldName());
                }
            }
        }
      

  8.   

    我也遇到相同问题,不知楼主问题解决么?no session or session was closed--猜想应该是这个原因,hibernate如果需要访问lazy的属性,必须要有一个session,而spring的hibernateTemplate默认是执行一个方法一个session,所以当你用hibernateTemplate的方法得到数据的时候,那个session已经关闭了,也就无法lazy load了。查阅文档说将访问方法写在hibernateTemplate的executeFind(new HibernateCallBack(doInHibernate(Session)))中可以访问同一个session,不知楼主试过成功没?