如何使用Spring和Hibernate的会话工厂处理多个数据库连接

时间:2011-07-08 19:02:09

标签: hibernate spring

我是Hibernate的新手,现在已经考虑了一段时间了。我有两个数据库,我在Tomcat的context.xml中定义了JNDI连接字符串。在我使用Spring和Hibernate的应用程序中,我有2个会话工厂,第一个工厂如下 - >

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="hibernateProperties">
  <props>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    <prop key="hibernate.connection.pool_size">10</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.transaction.auto_close_session">true</prop>
    <prop key="hibernate.transaction.flush_before_completion">true</prop>
    <prop key="current_session_context_class">true</prop>

    <!--HSQL-->
    <prop key="hibernate.connection.datasource">java:comp/env/jdbc/xxx</prop>
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>

  </props>
</property>
<property name="annotatedClasses">
  <list>
    <value>com.mytest.examples.Person</value>
    <value>com.mytest.examples.Customer</value>
    <value>com.mytest.examples.Employee</value>
  </list>
</property>

第二个sessionFactory指向第二个数据库,如下所示

<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="hibernateProperties">
  <props>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    <prop key="hibernate.connection.pool_size">10</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.transaction.auto_close_session">true</prop>
    <prop key="hibernate.transaction.flush_before_completion">true</prop>
    <prop key="current_session_context_class">true</prop>

    <!--HSQL-->
    <prop key="hibernate.connection.datasource">java:comp/env/jdbc/yzz</prop>
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>

  </props>
</property>
<property name="annotatedClasses">
  <list>
    <value>com.mytest.examples.Container</value>
    <value>com.mytest.examples.Credentials</value>
  </list>
</property>

现在,当我尝试使用以下

来使用这些工厂时
Session session = getHibernateTemplate().getSessionFactory().openSession();

我总是默认获得第一个工厂,并且能够访问其架构中的所有表,但不能访问第二个工厂。如何指定要使用的工厂?

1 个答案:

答案 0 :(得分:1)

HibernateTemplate构造函数以SessionFactory为参数。我不知道你的代码中getHibernateTemplate()做了什么,但它应该返回一个HibernateTemplate,它是用你定义的一个SessionFactory bean构建的(通过在spring上下文xml文件中声明它们,或者通过构造它们)它们是Java中的一个注入会话工厂。)

请注意,正如HibernateTemplate的文档所述(粗体):

  

从Hibernate 3.0.1开始,具有事务性   Hibernate访问代码也可以   以简单的Hibernate风格编码。因此,   对于新开工项目,请考虑   采用标准的Hibernate3风格   而是编码数据访问对象,   基于   SessionFactory.getCurrentSession()。

我会直接注入会话工厂,并直接使用Hibernate API。 HibernateTemplate并没有为Hibernate API带来太多影响,而且经常会阻碍它,恕我直言。 (例如,未提供等同于Query.uniqueResult())。