Spring包装Hibernate的话所有的基本配置都写在applicationContext.xml文件中.
我遇到的情况是配置完后tomcat6能启动,但是访问是就抛出no bean named 'sessionFactory'is defined
原因是在web.xml中有配置sessionFilter的过滤器,它用来控制session的开关,它指向的类是
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
这个类中有个setSessionFactoryBeanName的方法默认值是“sessionFactory”,而我把sessionFactory的名字改为了readSessionFactory和wirteSessionFactory。
这时可以去web.xml中设置sessionFactory的beanName为
readSessionFactory或wirteSessionFactory,但是只能设置一个值,而我要用的是双数据库。最后的解决方案是我在web.xml配置了两个filter把sessionFactoryBeanName初始化成不同的值代码如下
这时你在配置dao时就可选择不同的sessionFactory,而且他们的session就交由不同的filter控制开关了。
<!-- (读) 数据源 -->
<bean id="readDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${readDataSource.driver}</value>
</property>
<property name="url">
<value>${readDataSource.url}</value>
</property>
<property name="username">
<value>${readDataSource.name}</value>
</property>
<property name="password">
<value>${readDataSource.password}</value>
</property>
</bean>
<!-- (写) 数据源 -->
<bean id="writeDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${writeDataSource.driver}</value>
</property>
<property name="url">
<value>${writeDataSource.url}</value>
</property>
<property name="username">
<value>${writeDataSource.name}</value>
</property>
<property name="password">
<value>${writeDataSource.password}</value>
</property>
</bean>
<!-- hibernate配置文件 -->
<bean id="hibernateconfig" class="org.springframework.core.io.ClassPathResource">
<constructor-arg value="hibernate.cfg.xml"></constructor-arg>
</bean>
<!-- (读)hibernate数据库链接 -->
<bean id="readSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="readDataSource"></property>
<property name="configLocation" ref="hibernateconfig"></property>
</bean>
<!-- (写)hibernate数据库链接 -->
<bean id="writeSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="writeDataSource"></property>
<property name="configLocation" ref="hibernateconfig"></property>
</bean>
<!-- (读)jdbc模板 -->
<bean id="readJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"><ref local="readDataSource"/></property>
</bean>
<!-- (写)jdbc模板 -->
<bean id="writeJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"><ref local="writeDataSource"/></property>
</bean>
我遇到的情况是配置完后tomcat6能启动,但是访问是就抛出no bean named 'sessionFactory'is defined
原因是在web.xml中有配置sessionFilter的过滤器,它用来控制session的开关,它指向的类是
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
这个类中有个setSessionFactoryBeanName的方法默认值是“sessionFactory”,而我把sessionFactory的名字改为了readSessionFactory和wirteSessionFactory。
这时可以去web.xml中设置sessionFactory的beanName为
readSessionFactory或wirteSessionFactory,但是只能设置一个值,而我要用的是双数据库。最后的解决方案是我在web.xml配置了两个filter把sessionFactoryBeanName初始化成不同的值代码如下
<filter>
<filter-name>readSessionFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>readSessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>readSessionFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter>
<filter-name>writeSessionFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>writeSessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>writeSessionFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
这时你在配置dao时就可选择不同的sessionFactory,而且他们的session就交由不同的filter控制开关了。