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

来源:互联网 发布:达斯汀霍夫曼 知乎 编辑:程序博客网 时间:2024/05/09 12:50
最近做了一个项目,中间要用到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

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