创建 Hibernate SessionFactory 时如何设置数据源? [英] How can I set Datasource when I'm creating Hibernate SessionFactory?

查看:27
本文介绍了创建 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆