日期:2014-05-17  浏览次数:20735 次

Struts2+Spring2.5+Hibernate3.2 could not initialize proxy - no Session
小弟,在做一个ssh的项目遇上了could not initialize proxy - no Session问题,我看了一个上午了,还是没结果,现在在这请求大虾相助。。

情况是Employee实体类中有一个Position实体类的字段,现在我要在加载Employee时随便把Position也加载进去,不使用 lazy=false。。

Dao层代码
Java code
    public List<Employee> find(Employee condition) {
        String hql = "from Employee e where 1=1 ";
        Object[] values = null;
        if(null!=condition){
            hql += "and e.sn=? and e.password=?";
            values = new Object[]{condition.getSn(),condition.getPassword()};
            List<Employee> list = super.getHibernateTemplate().find(hql, values);
            
            for(int i=0;i<list.size();i++){
                list.get(i).getPosition();//报错地点
            }

            return list;
        }else{
            return super.getHibernateTemplate().find(hql);
        }
        
    }


项目中还用了spring的声明式管理

XML code

   <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
      <!-- HibernateTransactionManager bean 需要依赖注入一个 SessionFactory bean的引用 -->
      <property name="sessionFactory" ref="sessionFactory"/>
   </bean>
   
   <!-- 定义事务通知,需要指定一个事务管理器 -->
   <tx:advice id="txAdvice" transaction-manager="txManager">
     <!-- 定义属性,声明事务规则 -->
     <tx:attributes>
       <!-- 对get/find/search/query 开头的方法要求只读事务 -->
       <tx:method name="get*" read-only="true"/>
       <tx:method name="find*" read-only="true"/>
       <tx:method name="search*" read-only="true"/>
       <tx:method name="query*" read-only="true"/>
       <tx:method name="add*" propagation="REQUIRED"/>
       <tx:method name="del*" propagation="REQUIRED"/>
       <tx:method name="update*" propagation="REQUIRED"/>
       <tx:method name="do*" propagation="REQUIRED"/>
       <tx:method name="*" propagation="REQUIRED"/>
     </tx:attributes>
   </tx:advice>
   
   <aop:config>
     <!-- 定义哪些方法应用这些规则 -->
     <aop:pointcut id="serviceMethod" expression="execution(* cn.jbit.jboa.service.*.*(..))"/>
     <!-- 将事务通知于引用规则的方法组合 -->
     <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
   </aop:config>



在web.xml中使用了OpenSessionInViewFilter

XML code

    <filter>
         <filter-name>hibernateFilter</filter-name>
         <filter-class>
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
         </filter-class>
    </filter>
    
    <filter-mapping>
         <filter-name>hibernateFilter</filter-name>
         <url-pattern>*</url-pattern>
    </filter-mapping>



虽然使用了OpenSessionInViewFilter,但是还是没效果。。望大虾们指点一二。。

------解决方案--------------------
程序中有个懒加载,session中是有边缘的,如果这样的话,加大session的时长。
------解决方案--------------------
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*&l