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上测试过.
| 归档时间: |
|
| 查看次数: |
51195 次 |
| 最近记录: |