我正在使用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.setDataSource
和LocalSessionFactoryBean.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;
}
答案 0 :(得分:0)
根据HibernateTransactionManager的javadoc,我认为您应该同时为TransactionManager和SessionFactory设置数据源。
这两个部分:
此事务管理器适用于使用单个Hibernate SessionFactory进行事务数据访问的应用程序,但它还支持事务内的直接数据源访问
和
注意:为了能够为简单的JDBC代码注册数据源的连接,此实例需要知道数据源(setDataSource(javax.sql.DataSource))。显然,给定的DataSource应该与给定的SessionFactory使用的数据源匹配。
让我相信,如果您不打算使用纯JDBC代码,则可以在SessionFactory上设置数据源,但是无论如何只要对这两个数据源进行设置,可能不会受到损害。