一尘不染

创建Hibernate SessionFactory时如何设置数据源?

hibernate

我正在创建SessionFactory,并在创建SessionFactory的代码中将数据源作为对象,但是无法将数据源设置为Hibernate
Configuration对象。那么如何将数据源设置为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();

阅读 453

收藏
2020-06-20

共1个答案

一尘不染

要提供与Session的JDBC连接,您需要实现ConnectionProvider

默认情况下,Hibernate使用DatasourceConnectionProviderDataSource从JNDI 获取实例。

要使用自定义DataSource实例,请使用实例并将其InjectedDataSourceConnectionProvider注入DataSource其中。

InjectedDataSourceConnectionProvider上有TODO注释

注意:必须先调用setDataSource(javax.sql.DataSource)才能进行configure(java.util.Properties)。

TODO:找不到setDataSource实际调用的位置。不能仅通过此方法进行配置吗???

根据说明,setDataSource()configure()方法调用方法。

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的合同

实现者应提供一个公共的默认构造函数。

如果通过Configuration实例设置了自定义ConnectionProvider,则Hibernate将调用此构造函数。

Configuration cfg = new Configuration();
Properties props = new Properties();
props.put( Environment.CONNECTION_PROVIDER, InjectedDataSourceConnectionProvider.class.getName() );
cfg.addProperties(props);
2020-06-20