在创建Hibernate SessionFactory时如何设置Datasource?

new*_*bie 19 java hibernate sessionfactory

我正在创建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();
Run Code Online (Sandbox Code Playgroud)

dir*_*ira 15

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

默认情况下,Hibernate使用从JNDI DatasourceConnectionProvider获取DataSource实例.

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

InjectedDataSourceConnectionProvider上有TODO注释

注意:必须在configure(java.util.Properties)之前调用setDataSource(javax.sql.DataSource).

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以扩展UserSuppliedConnectionProvider.

根据ConnectionProvider的合同

实现者应该提供公共默认构造函数.

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

Configuration cfg = new Configuration();
Properties props = new Properties();
props.put( Environment.CONNECTION_PROVIDER, InjectedDataSourceConnectionProvider.class.getName() );
cfg.addProperties(props);
Run Code Online (Sandbox Code Playgroud)


Lui*_*oza 14

如果您碰巧DataSource存储在JNDI中,那么只需使用:

configuration.setProperty(
    "hibernate.connection.datasource",
    "java:comp/env/jdbc/yourDataSource");
Run Code Online (Sandbox Code Playgroud)

但是如果您使用自定义数据源提供程序(如Apache DBCP或BoneCP)并且您不想使用像Spring这样的依赖注入框架,那么您可以StandardServiceRegistryBuilder在创建之前将其注入到SessionFactory:

//retrieve your DataSource
DataSource dataSource = ...;
Configuration configuration = new Configuration()
    .configure();
//create the SessionFactory from configuration
SessionFactory sf = configuration
    .buildSessionFactory(
        new StandardServiceRegistryBuilder()
            .applySettings(configuration.getProperties())
            //here you apply the custom dataSource
            .applySetting(Environment.DATASOURCE, dataSource)
            .build());
Run Code Online (Sandbox Code Playgroud)

请注意,如果使用此方法,则无需再将连接参数放在hibernate.cfg.xml中.以下是使用上述方法时兼容的hibernate.cfg.xml文件的示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
        <property name="show_sql">false</property>
        <!-- your mappings to classes go here -->
    </session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)

上面的代码在Hibernate 4.3上测试过.