论坛首页 Java企业应用论坛

『提问』使用OpenSessionInViewFilter为什么没有效果?

浏览 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有什么必须的参数我没有加上去?
   发表时间:2004-12-10  
应该不用加参数的,我用的时候是配置了事务,否则会报错,不知道为什么。你可以配置一下试试看,不知道是不是这个的问题。还有就是你是通过什么方法得到session的?
最好去看一下日志,可能会有一些提示信息。
0 请登录后投票
   发表时间:2004-12-10  
我也配置了事务,我是用getHibernateTemplate(),没有自己控制session
0 请登录后投票
   发表时间:2004-12-10  
恩。。。楼主给的信息量不够。也可以去spring的官方论坛搜索一下相关的内容,很多问题其实那边已经有人解决了,只是是e文的。
0 请登录后投票
   发表时间: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");;


所有的信息全在这里了
0 请登录后投票
   发表时间: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有关系,还没有仔细看,这种根据拦截代码真的很难懂
0 请登录后投票
   发表时间:2004-12-10  
在log4j.properties里面加一条

log4j.logger.org.springframework.orm.hibernate.support.OpenSessionInViewFilter=debug

跟踪一下输出信息。我使用OpenSessionInView很好用很正常。

OpenSessionInView和你说的HibernateTemplate没有什么关系。OpenSessionInView实际上就是在你每个*.do的请求之前打开Session,在*.do的整个URL请求执行完毕关闭Session而已,还是仔细检查一下你的MVC控制逻辑吧。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics