我正在创建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();
要提供与Session的JDBC连接,您需要实现ConnectionProvider。
默认情况下,Hibernate使用DatasourceConnectionProvider它DataSource从JNDI 获取实例。
DatasourceConnectionProvider
DataSource
要使用自定义DataSource实例,请使用实例并将其InjectedDataSourceConnectionProvider注入DataSource其中。
InjectedDataSourceConnectionProvider
在InjectedDataSourceConnectionProvider上有TODO注释
注意:必须先调用setDataSource(javax.sql.DataSource)才能进行configure(java.util.Properties)。 TODO:找不到setDataSource实际调用的位置。不能仅通过此方法进行配置吗???
注意:必须先调用setDataSource(javax.sql.DataSource)才能进行configure(java.util.Properties)。
TODO:找不到setDataSource实际调用的位置。不能仅通过此方法进行配置吗???
根据说明,setDataSource()从configure()方法调用方法。
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);