浏览 7649 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-12-10
使用OpenSessionInViewFilter为什么没有效果? 是不是filter需要参数?我看了这个filter源代码,就是没有找到必须的参数是什么,也没有找到什么文档上面有描述,javadoc也没有描述 topic.hbm.xml,topics这个属性是lazy的 <set name="topics" inverse="true" cascade="all" lazy="true"> <key column="forum_id"></key> <one-to-many class="com.bbs.domain.hibernate.TbbsTopic" /> </set> action中 TbbsForum[] forums = forumService.findAll();; ForumForm[] forumForms = null; if (forums != null); { forumForms = new ForumForm[forums.length]; for (int i = 0; i < forumForms.length; i++); { System.out.println("size=" + forums[i].getTopics();.size(););; } } 我用来测试的代码System.out.println("size=" + forums.getTopics().size());报错,说没有session或者已经关闭! Why ? 配置文件: <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class> org.springframework.orm.hibernate.support.OpenSessionInViewFilter </filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>*.do</url-pattern > [i]url-pattern不能显示 </filter-mapping> 错误提示信息: no session or session was closed 你的分析: 是不是OpenSessionInViewFilter有什么必须的参数我没有加上去? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-12-10
应该不用加参数的,我用的时候是配置了事务,否则会报错,不知道为什么。你可以配置一下试试看,不知道是不是这个的问题。还有就是你是通过什么方法得到session的?
最好去看一下日志,可能会有一些提示信息。 |
|
返回顶楼 | |
发表时间:2004-12-10
我也配置了事务,我是用getHibernateTemplate(),没有自己控制session
|
|
返回顶楼 | |
发表时间:2004-12-10
恩。。。楼主给的信息量不够。也可以去spring的官方论坛搜索一下相关的内容,很多问题其实那边已经有人解决了,只是是e文的。
|
|
返回顶楼 | |
发表时间:2004-12-10
那我把配置和代码都贴出来
web.xml <web-app> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class> org.springframework.orm.hibernate.support.OpenSessionInViewFilter </filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app> spring applicationContext.xml <beans> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>org.gjt.mm.mysql.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/bbs</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>root</value> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> <property name="dataSource"> <ref local="dataSource" /> </property> <property name="mappingResources"> <list> <value> com\bbs\domain\hibernate\TbbsForum.hbm.xml </value> <value> com\bbs\domain\hibernate\TbbsTopic.hbm.xml </value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> net.sf.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">false</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="TransactionProxyBean" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="do*">PROPAGATION_REQUIRED</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <!-- Forum service --> <bean id="ForumService" parent="TransactionProxyBean"> <property name="target"> <bean class="com.bbs.service.imp.ForumServiceImp"> <property name="forumDAO"> <bean class="com.bbs.dao.hibernateimp.ForumDAOHibernateImp"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> </property> </bean> </property> </bean> <bean name="/forumList" class="com.bbs.web.action.ForumListAction"> <property name="forumService"> <ref local="ForumService"></ref> </property> </bean> <bean name="/topicList" class="com.bbs.web.action.TopicListAction"> <property name="topicService"> <ref local="TopicService"></ref> </property> </bean> </beans> client代码 TbbsForum[] forums = forumService.findAll();; if (forums != null); { for (int i = 0; i < forumForms.length; i++); { System.out.println("size=" + forums[i].getTopics();.size(););; } } 取数据代码: getHibernateTemplate();.find("from TbbsForum");; 所有的信息全在这里了 |
|
返回顶楼 | |
发表时间:2004-12-10
我跟踪了一下spring里面HibernateTemplate的find源代码
发现它有用allowCreate来标志从那里得到session,allowCreate默认为true; 得到session的代码是这样: HibernateTemplate.java public Object execute(HibernateCallback action); throws DataAccessException { Session session = (!isAllowCreate(); ? SessionFactoryUtils.getSession(getSessionFactory();, false); : SessionFactoryUtils.getSession( getSessionFactory();, getEntityInterceptor();, getJdbcExceptionTranslator();););; boolean existingTransaction = TransactionSynchronizationManager.hasResource(getSessionFactory(););; if (!existingTransaction && getFlushMode(); == FLUSH_NEVER); { session.setFlushMode(FlushMode.NEVER);; } try { Object result = action.doInHibernate(session);; flushIfNecessary(session, existingTransaction);; return result; } catch (HibernateException ex); { throw convertHibernateAccessException(ex);; } catch (SQLException ex); { throw convertJdbcAccessException(ex);; } catch (RuntimeException ex); { // callback code threw application exception throw ex; } finally { SessionFactoryUtils.closeSessionIfNecessary(session, getSessionFactory(););; } } 这代码是说:如果allowCreate=false;那么得到OpenSessionInViewFilter中创建的session,如果=true,那么create new session 在dao中调用find方法,没有任何地方来置标志位allowCreate=false,也就是说明调用find,没有任何明确的代码来表示让他从ThreadLocal中取session, 又想:由于事务是动态代理的,有没有可能和事务bean有关系,还没有仔细看,这种根据拦截代码真的很难懂 |
|
返回顶楼 | |
发表时间:2004-12-10
在log4j.properties里面加一条
log4j.logger.org.springframework.orm.hibernate.support.OpenSessionInViewFilter=debug 跟踪一下输出信息。我使用OpenSessionInView很好用很正常。 OpenSessionInView和你说的HibernateTemplate没有什么关系。OpenSessionInView实际上就是在你每个*.do的请求之前打开Session,在*.do的整个URL请求执行完毕关闭Session而已,还是仔细检查一下你的MVC控制逻辑吧。 |
|
返回顶楼 | |