最近做了一个项目,中间要用到mysql和oracle两种数据库.这就要求在Hibernate中同时配置两个数据源.
这是我第一次遇到这个问题,所以写点资料记录配置过程.
做过SSH框架开发的人都知道,Spring包装Hibernate的话所有的基本配置都写在applicationContext.xml文件中.
所以两个数据源的配置也是写在这个文件中.
我们要做的就是在里面写入这样的配置:
第一个数据源:
<bean id="数据源1"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="驱动类">
</property>
<property name="url"
value="数据地址">
</property>
<property name="username" value="用户名"></property>
<property name="password" value="密码"></property>
</bean>
<bean id="数据工厂1"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="数据源1" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>表的配置文件地址</value>
</list>
</property>
</bean>
第二个数据源:
<bean id="数据源2"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="驱动类">
</property>
<property name="url"
value="数据地址">
</property>
<property name="username" value="用户名"></property>
<property name="password" value="密码"></property>
</bean>
<bean id="数据工厂2"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="数据源2" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>表的配置文件地址</value>
</list>
</property>
</bean>
当然你的事务封装也的写两种配置,最后你使用IOP思想向DAO中注入数据源的时候选择一下就可以了.
本来我也是向上面这样配置的.不过我发现了一个问题.
页面总是出现这样的错误提示(如下):
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory' is defined
org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:360)
org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:686)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:219)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:149)
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:541)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:223)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:207)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:146)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
com.by.yy.filter.MyFilter.doFilter(MyFilter.java:32)
好像是找不到SessionFactory这个bean.
如果遇到这样的情况有两种解决方式:
1.检查你是否有jta.jar这个文件
2.将上面的两个数据源配置改为:
第一个数据源:
<bean id="数据源1"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="驱动类">
</property>
<property name="url"
value="数据地址">
</property>
<property name="username" value="用户名"></property>
<property name="password" value="密码"></property>
</bean>
<bean id="数据工厂1" name="别名"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="数据源1" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>表的配置文件地址</value>
</list>
</property>
</bean>
第二个数据源:
<bean id="数据源2"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="驱动类">
</property>
<property name="url"
value="数据地址">
</property>
<property name="username" value="用户名"></property>
<property name="password" value="密码"></property>
</bean>
<bean id="数据工厂2" name="别名"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="数据源2" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>表的配置文件地址</value>
</list>
</property>
</bean>
注意两个数据工厂的别名不能一样.而且其中一个必须是sessionFactory. 因为他需要一个默认的sessionFactory
到此为止两个数据源就算配置好了..有可能遇到的环境不一样,解决方法不一样.以上所写,只是个人见解.
这是我第一次遇到这个问题,所以写点资料记录配置过程.
做过SSH框架开发的人都知道,Spring包装Hibernate的话所有的基本配置都写在applicationContext.xml文件中.
所以两个数据源的配置也是写在这个文件中.
我们要做的就是在里面写入这样的配置:
第一个数据源:
<bean id="数据源1"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="驱动类">
</property>
<property name="url"
value="数据地址">
</property>
<property name="username" value="用户名"></property>
<property name="password" value="密码"></property>
</bean>
<bean id="数据工厂1"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="数据源1" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>表的配置文件地址</value>
</list>
</property>
</bean>
第二个数据源:
<bean id="数据源2"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="驱动类">
</property>
<property name="url"
value="数据地址">
</property>
<property name="username" value="用户名"></property>
<property name="password" value="密码"></property>
</bean>
<bean id="数据工厂2"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="数据源2" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>表的配置文件地址</value>
</list>
</property>
</bean>
当然你的事务封装也的写两种配置,最后你使用IOP思想向DAO中注入数据源的时候选择一下就可以了.
本来我也是向上面这样配置的.不过我发现了一个问题.
页面总是出现这样的错误提示(如下):
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory' is defined
org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:360)
org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:686)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:219)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:149)
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:541)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:223)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:207)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:146)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
com.by.yy.filter.MyFilter.doFilter(MyFilter.java:32)
好像是找不到SessionFactory这个bean.
如果遇到这样的情况有两种解决方式:
1.检查你是否有jta.jar这个文件
2.将上面的两个数据源配置改为:
第一个数据源:
<bean id="数据源1"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="驱动类">
</property>
<property name="url"
value="数据地址">
</property>
<property name="username" value="用户名"></property>
<property name="password" value="密码"></property>
</bean>
<bean id="数据工厂1" name="别名"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="数据源1" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>表的配置文件地址</value>
</list>
</property>
</bean>
第二个数据源:
<bean id="数据源2"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="驱动类">
</property>
<property name="url"
value="数据地址">
</property>
<property name="username" value="用户名"></property>
<property name="password" value="密码"></property>
</bean>
<bean id="数据工厂2" name="别名"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="数据源2" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>表的配置文件地址</value>
</list>
</property>
</bean>
注意两个数据工厂的别名不能一样.而且其中一个必须是sessionFactory. 因为他需要一个默认的sessionFactory
到此为止两个数据源就算配置好了..有可能遇到的环境不一样,解决方法不一样.以上所写,只是个人见解.