创建 Hibernate SessionFactory 时如何设置数据源? [英] How can I set Datasource when I'm creating Hibernate SessionFactory?
问题描述
我正在创建 SessionFactory 并且我在创建 SessionFactory 的代码中将我的数据源作为对象,但是我无法将数据源设置为 Hibernate Configuration 对象.那么如何将我的数据源设置为我的 SessionFactory?
I'm creating SessionFactory and I have my datasource as object in code where I'm creating SessionFactory, but i cannot set datasource to Hibernate Configuration object. So how can I set my datasource to my SessionFactory?
Configuration configuration = new Configuration();
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
configuration.setProperties(properties);
configuration.setProperty("packagesToScan", "com.my.app");
SessionFactory sessionFactory = configuration.configure().buildSessionFactory();
推荐答案
要向 Session 提供 JDBC 连接,您需要实现 ConnectionProvider.
To supply JDBC connections to Session, you need an implementation of ConnectionProvider.
默认情况下,Hibernate 使用 DatasourceConnectionProvider
从 JNDI 获取 DataSource
实例.
By default, Hibernate uses DatasourceConnectionProvider
which obtains a DataSource
instance from JNDI.
要使用自定义 DataSource
实例,请使用 InjectedDataSourceConnectionProvider
并将 DataSource
实例注入其中.
To use a custom DataSource
instance, use InjectedDataSourceConnectionProvider
and inject the DataSource
instance into it.
有关于 InjectedDataSourceConnectionProvider
注意:设置数据源(javax.sql.DataSource)必须在调用之前配置(java.util.Properties).
NOTE : setDataSource(javax.sql.DataSource) must be called prior to configure(java.util.Properties).
TODO : 找不到位置实际上调用了 setDataSource.难道这不能只是传递给配置???
TODO : could not find where setDataSource is actually called. Can't this just be passed in to configure???
根据注释,从 configure()
方法调用 setDataSource()
方法.
As per the note, call setDataSource()
method from configure()
method.
public class CustomConnectionProvider extends InjectedDataSourceConnectionProvider {
@Override
public void configure(Properties props) throws HibernateException {
org.apache.commons.dbcp.BasicDataSource dataSource = new BasicDataSource();
org.apache.commons.beanutils.BeanUtils.populate( dataSource, props );
setDataSource(dataSource);
super.configure(props);
}
}
您还可以扩展 UserSuppliedConnectionProvider一>.
根据ConnectionProvider的约定
According to the contract of ConnectionProvider
实施者应该提供一个公开的默认构造函数.
Implementors should provide a public default constructor.
如果自定义 ConnectionProvider 通过 Configuration 实例设置,Hibernate 将调用此构造函数.
Hibernate will invoke this constructor if custom ConnectionProvider is set through Configuration instance.
Configuration cfg = new Configuration();
Properties props = new Properties();
props.put( Environment.CONNECTION_PROVIDER, InjectedDataSourceConnectionProvider.class.getName() );
cfg.addProperties(props);
这篇关于创建 Hibernate SessionFactory 时如何设置数据源?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!