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

2022-09-01 22:53:58

我正在创建SessionFactory,并且我将数据源作为我正在创建SessionFactory的代码中的对象,但我无法将数据源设置为Hibernate Configuration对象。那么,如何将我的数据源设置为我的会话网站呢?

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();

答案 1

如果您碰巧将代码存储在 JNDI 中,则只需使用:DataSource

configuration.setProperty(
    "hibernate.connection.datasource",
    "java:comp/env/jdbc/yourDataSource");

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

//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());

请注意,如果使用此方法,则无需再将连接参数置于休眠状态.cfg.xml。以下是使用上述方法时兼容的休眠.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>

上面的代码在Hibernate 4.3上测试。


答案 2

要向会话提供 JDBC 连接,您需要实现 ConnectionProvider

缺省情况下,休眠使用从 JNDI 获取实例的功能。DatasourceConnectionProviderDataSource

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

InjectedDataSourceConnectionProvider上有TODO说明

注意:setDataSource(javax.sql.DataSource)必须在配置(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

根据连接提供者的合同

实现程序应提供公共默认构造函数。

如果通过配置实例设置了自定义连接提供程序,则休眠将调用此构造函数。

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

推荐