Spring - Должен ли я установить источник данных в TransactionManager или в SessionFactory? - PullRequest
0 голосов
/ 27 февраля 2019

Я настраиваю приложение Spring MVC, используя Hibernate, MySQL и DBCP2.

Я пытаюсь понять, где мне установить dataSource.

Представьте себе ситуацию, когда я использую 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.setDataSource и LocalSessionFactoryBean.setDataSource?

В LocalSessionFactoryBean

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

    // omitted for brevity..

    return factory;
}

В транзакцииManager

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

    // omitted for brevity

    return txManager;
}

1 Ответ

0 голосов
/ 28 февраля 2019

Согласно javadoc для HibernateTransactionManager , я думаю, вам следует установить DataSource для вашего TransactionManager и SessionFactory.

Эти две части:

Этот диспетчер транзакций подходит для приложений, которые используют один Hibernate SessionFactory для доступа к транзакционным данным, но он также поддерживает прямой доступ к источникам данных в транзакции

и

Примечание.чтобы иметь возможность зарегистрировать соединение DataSource для простого кода JDBC, этот экземпляр должен знать о DataSource (setDataSource (javax.sql.DataSource)).Данный DataSource, очевидно, должен совпадать с тем, который используется данным SessionFactory.

, что заставляет меня поверить, что вы можете просто установить DataSource на свой SessionFactory, если вы не планируете использовать простой код JDBC, но этовероятно, не мешало бы просто установить DataSource на обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...