복붙노트

[SPRING] Spring과 Hibernate로 세션 팩토리를 사용하여 여러 데이터베이스 연결을 처리하는 방법

SPRING

Spring과 Hibernate로 세션 팩토리를 사용하여 여러 데이터베이스 연결을 처리하는 방법

나는 정말 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. ==============================

    1.HibernateTemplate 생성자는 인자로 SessionFactory를 취한다. 나는 당신의 코드에서 getHibernateTemplate ()이 무엇인지 모르지만, 당신이 정의한 SessionFactory 빈들 중 하나를 가지고 빌드 된 HibernateTemplate을 리턴해야한다. (스프링 컨텍스트 XML 파일에서 선언하거나, 삽입 된 세션 팩토리).

    HibernateTemplate 생성자는 인자로 SessionFactory를 취한다. 나는 당신의 코드에서 getHibernateTemplate ()이 무엇인지 모르지만, 당신이 정의한 SessionFactory 빈들 중 하나를 가지고 빌드 된 HibernateTemplate을 리턴해야한다. (스프링 컨텍스트 XML 파일에서 선언하거나, 삽입 된 세션 팩토리).

    HibernateTemplate의 문서에서 (굵게 표시) :

    나는 세션 팩토리를 직접 주입 할 것이고 Hibernate API를 직접 사용할 것이다. HibernateTemplate은 Hibernate API보다 많은 것을 가져 오지 않으며 종종 IMHO에 들어간다. (예를 들어, Query.uniqueResult ()에 해당하는 것을 제공하지 않음).

  2. from https://stackoverflow.com/questions/6629182/how-to-handle-multiple-database-connections-using-session-factories-with-spring by cc-by-sa and MIT license