2012-03-26 3 views
0

사이트에서이 주제에 대한 토론이 여러 번 있었지만 모든 주석을 사용하여 sessionFactory를 작성했습니다.주석 스타일에서 최대 절전 모드를 사용하는 다중 데이터베이스

private SessionFactory sessionFactory; 

@Autowired 
public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 

이이 내가이 경우 여러 DB의 통합을 달성하려면 어떻게 applicationContext.xml

<!-- add tomcat datasource instance to springs context --> 
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/XXXXDS" /> 
    <property name="resourceRef" value="true" /> 
</bean> 

입니다

<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
    <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.password">xxxxx</property> 
    <property name="hibernate.connection.url">xxxxx</property> 
    <property name="hibernate.connection.username">XXXX</property> 
    <property name="hibernate.connection.characterEncoding">utf-8</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> 
    <property name="hibernate.format_sql">true</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="hibernate.use_sql_comments">true</property> 
    <mapping class="XXXX" /> 
</session-factory> 
</hibernate-configuration> 

처럼 hibernate.cfg.xml로 보이는 방법이다. 한 가지 해결책은 여러 hibernate.cfg.xml 파일을 만들고 다른 세션 팩토리를 만드는 것입니다.

그러나 나는 두 가지 의문의 여지가있다. 1) autowiring에서 어느 sessionFactory를 선택해야하는지, 2) hibernate.xml에서 많은 정보를 복제해야한다. 이 문제에 대해 더 명확한 접근법이 있습니까?

+0

DAO에 콩 주입을 사용하고 싶지 않거나 사용할 수없는 이유가 있습니까? 그것은 당신의 문제를 해결할 것입니다. – bvulaj

+0

죄송합니다. 더 구체적으로 말씀해 주시겠습니까?이 접근 방식에 대한 링크를 몇 가지 예를 들어 설명해주십시오. 나는 Spring + Hibernate에 익숙해 져서 나에게 유일한 상황이다. –

+0

답변은 아래에 게시되었습니다. – bvulaj

답변

2

첫 번째 질문 : @Qualifier ("이름")으로 @Autowired는 어떤 sessionFatory를 선택하는 데 도움이 될 것입니다.

@Autowired 
@Qualifier("sessionFactoryName") 
public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
... 
} 

두 번째 질문 : 최대 절전 모드 속성을 설정할 수 있습니다. 스키마 및 카탈로그는 여러 데이터베이스에서 작업 할 때 데이터베이스를 지정합니다. MS SQL Server에 대한 경험이 있으므로 엔티티에서 주석 @Table ("[database]. [tablename]")을 추가하고 여러 데이터베이스의 특정 테이블에 매핑했습니다.

+0

예이 솔루션은 완벽하게 작동합니다. 감사. 나는 이것을 더 일찍 추가했지만 어쨌든 코멘트는 누락되었다. –

0

의견과 관련하여 게시 됨.

세션 공장 :

<bean id="mySessionFactory1" class="..."> 
    ... 
</bean> 
<bean id="mySessionFactory2" class="..."> 
    ... 
</bean> 

의 DAO :

<bean id="myHibernateDao1" abstract="true" p:sessionFactory-ref="mySessionFactory1" /> 
<bean id="myHibernateDao2" abstract="true" p:sessionFactory-ref="mySessionFactory2" /> 

<bean id="myObj1Dao" parent="myHibernateDao1" class="..." /> 
<bean id="myObj2Dao" parent="myHibernateDao1" class="..." /> 
<bean id="myObj3Dao" parent="myHibernateDao1" class="..." /> 
<bean id="myObj4Dao" parent="myHibernateDao2" class="..." /> 
<bean id="myObj5Dao" parent="myHibernateDao2" class="..." /> 
0
import java.util.Properties; 

import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.context.annotation.PropertySources; 
import org.springframework.core.env.Environment; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.hibernate4.HibernateTransactionManager; 
import org.springframework.orm.hibernate4.LocalSessionFactoryBean; 

@Configuration 
@ComponentScan({ "component.name" }) 
@PropertySources(@PropertySource(value = {"file:/file1.properties", "classpath:file2.properties"})) 
public class HibernateConfiguration { 

    @Bean 
    public LocalSessionFactoryBean firstSessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(firstDataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.test" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource firstDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("DRIVER_NAME"); 
     dataSource.setUrl("DATABASE_URL"); 
     dataSource.setUsername("DATABASE_USER"); 
     dataSource.setPassword("DATABASE_PASS"); 
     return dataSource; 
    } 

    @Bean 
    public LocalSessionFactoryBean secondSessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(secondDataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.test" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource secondDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("DRIVER_NAME"); 
     dataSource.setUrl("DATABASE_URL"); 
     dataSource.setUsername("DATABASE_USER"); 
     dataSource.setPassword("DATABASE_PASS"); 
     return dataSource; 
    } 


    private Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", org.hibernate.dialect.DB2Dialect); 
     properties.put("hibernate.show_sql", true); 
     properties.put("hibernate.format_sql", true); 
     properties.put("hibernate.default_schema", SCHEMA_NAME); 
     return properties;   
    } 

    @Bean 
    public HibernateTransactionManager firstTransactionManager() { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(firstSessionFactory().getObject()); 
     return txManager; 
    } 

    @Bean 
    public HibernateTransactionManager rdsaTransactionManager() { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(rdsaSessionFactory().getObject()); 
     return txManager; 
    } 


} 
관련 문제