天天看点

Spring包装下Hibernate配置多个数据源

最近做了一个项目,中间要用到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

到此为止两个数据源就算配置好了..有可能遇到的环境不一样,解决方法不一样.以上所写,只是个人见解.

Spring包装下Hibernate配置多个数据源