春季-我应该在TransactionManager还是SessionFactory上设置数据源?

时间:2019-02-27 20:01:39

标签: java spring spring-mvc

我正在使用Hibernate,MySQL和DBCP2配置Spring MVC应用程序。

我正在努力了解应该在哪里设置数据源。

设想一下Im使用LocalSessionFactoryBean获取Hibernate Session实例的情况。

配置数据源

@Bean
public BasicDataSource dataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    // dataSource configurations...
    return dataSource;
}

配置LocalSessionFactoryBean

@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
    LocalSessionFactoryBean factory = new LocalSessionFactoryBean();

    factory.setHibernateProperties(new PropertiesBuilder() {

        Properties properties = new Properties();

        @Override
        public Properties build() {
            return this.properties;
        }

        @Override
        public PropertiesBuilder put(String key, String value) {
            properties.put(key, value);

            return this;
        }

    }.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect").build());


    return factory;
}

配置TransactionManager

@Bean
public HibernateTransactionManager transactionManager(LocalSessionFactoryBean sessionFactory) {
    HibernateTransactionManager txManager = new HibernateTransactionManager();
    txManager.setSessionFactory(sessionFactory.getObject());

    return txManager;
}

现在,我应该在哪里设置数据源? 我的意思是transactionManager.setDataSourceLocalSessionFactoryBean.setDataSource有什么区别?

在LocalSessionFactoryBean

@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
    LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
    factory.setDataSource(dataSource);

    // omitted for brevity..

    return factory;
}

transactionManager

@Bean
public HibernateTransactionManager transactionManager(LocalSessionFactoryBean sessionFactory, DataSource dataSource) {
    HibernateTransactionManager txManager = new HibernateTransactionManager();
    txManager.setDataSource(dataSource);

    // omitted for brevity

    return txManager;
}

1 个答案:

答案 0 :(得分:0)

根据HibernateTransactionManager的javadoc,我认为您应该同时为TransactionManager和SessionFactory设置数据源。

这两个部分:

  

此事务管理器适用于使用单个Hibernate SessionFactory进行事务数据访问的应用程序,但它还支持事务内的直接数据源访问

  

注意:为了能够为简单的JDBC代码注册数据源的连接,此实例需要知道数据源(setDataSource(javax.sql.DataSource))。显然,给定的DataSource应该与给定的SessionFactory使用的数据源匹配。

让我相信,如果您不打算使用纯JDBC代码,则可以在SessionFactory上设置数据源,但是无论如何只要对这两个数据源进行设置,可能不会受到损害。