【问题标题】:How to configure multiple datasources using java Hibernate configuration class如何使用 java Hibernate 配置类配置多个数据源
【发布时间】:2015-09-21 02:54:56
【问题描述】:

我们正在使用 java 配置 Hibernate,这是我们配置 hibernate 的代码。

@Configuration
@EnableTransactionManagement
@ComponentScan({ "org.npcc.ccms.config" })
@PropertySource(value = { "classpath:application.properties" })
public class HibernateConfiguration {
    final static Logger logger = LogManager.getLogger(HibernateConfiguration.class);

    @Autowired
    private Environment environment;

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[] { "org.npcc.ccms.model" });
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
     }

    @Bean(destroyMethod="")
    public DataSource dataSource() {
        JndiTemplate jndi = new JndiTemplate();
        DataSource dataSource = null;
        try {
            dataSource = (DataSource) jndi.lookup(environment.getRequiredProperty("datasource"));
        } catch (NamingException e) {
            logger.error("NamingException for java:comp/env/jdbc/ccms_cp1_orcl", e);
        }
        return dataSource;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
        return properties;        
    }

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory s) {
       HibernateTransactionManager txManager = new HibernateTransactionManager();
       txManager.setSessionFactory(s);
       return txManager;
    }
}

我的问题是如何在同一个休眠配置类中配置另一个数据源?我找到了解决方案here,但使用 xml 配置,使用 java 配置如何工作?提前致谢。

【问题讨论】:

    标签: spring hibernate annotations


    【解决方案1】:

    您将需要两个不同的 bean,注释如下:

    @Bean(name="SessionFactory")
    public SessionFactory sessionFactory() {
    
    }
    

    和:

    @Bean(name="OtherSessionFactory")
    public SessionFactory otherSessionFactory() {
    
    }
    

    并且适当配置了两个数据源。

    那么当你想使用其他 SessionFactory 时你只需要:

    @Autowired
    @Qualifier("SessionFactory")
    SessionFactory sessionFactory
    

    @Autowired
    @Qualifier("OtherSessionFactory")
    SessionFactory sessionFactory
    

    【讨论】:

    • 感谢 Alex 的回复,我将为每个数据源创建单独的配置类,并在我的服务中使用 Propagation.REQUIRED 创建单独的事务管理器。
    • 好的。如果您有多个相同类型的 bean,则无论如何都需要使用 @Qualifier。
    • 如何泛化基础DAO类? @Autowired @Qualifier("SessionFactory") private SessionFactory sessionFactory; public T getByKey(PK key) { return (T) getSession().get(persistentClass, key); }
    • 如果您使用的是@Qualifier,我认为这是正确的答案 ;-)
    • 我们如何编写具有多个会话工厂的 GenericDAO 类?假设我有带有 delete() 方法的 GenericDao 类,它删除会话中的记录,但如何在其他数据库中推广它。这意味着我们必须为每个 SessionFactory 创建 GenericDAO ????请指教
    猜你喜欢
    • 2015-09-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2013-12-30
    • 2015-09-08
    • 2016-01-02
    • 2017-01-16
    相关资源
    最近更新 更多