hibernate一些底层实现的解析
2015-12-17 10:59
344 查看
一、SessionFactory.openSession()
1、获取Connection
这里会通过调用hibernate的ConnectionProvider接口的getConnection()获取Connection,而实际执行的有三个类继承ConnectionProvider:
1、DatasourceConnectionProviderImpl通过数据源获取:dataSource.getConnection();
2、DriverManagerConnectionProviderImpl通过ConnectionCreator获取:connectionCreator.createConnection();
3、UserSuppliedConnectionProviderImpl仅仅是抛出异常;
这里详细说明一下第一种:hibernate和各种连接池的联系是通过java的DateSource,hibernate使用DateSource的接口,各种连接池提供DateSource的实现类。而我们则是把该实现类定义为Bean。比如在tomcat.jdbc.pool中,dataSource.getConnection()这个方法实际上是通过连接池的ConnectionPool的ProxyClassConstructor.newInstance()获取Connection。
2、openSession()的实现代码(hibernate),简略:
package org.hibernate.internal;
import java.sql.Connection;
import org.hibernate.Interceptor;
import org.hibernate.Session;
import org.hibernate.SessionEventListener;
import org.hibernate.engine.spi.SessionBuilderImplementor;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SessionOwner;
import org.hibernate.internal.SessionImpl;
public final class SessionFactoryImpl implements SessionFactoryImplementor {
static class SessionBuilderImpl implements SessionBuilderImplementor {
private final SessionFactoryImpl sessionFactory;
private Connection connection;
@Override
public Session openSession() {
final SessionImpl session = new SessionImpl(
connection,
sessionFactory,
sessionOwner,
getTransactionCoordinator(),
getTransactionCompletionProcesses(),
autoJoinTransactions,
sessionFactory.settings.getRegionFactory().nextTimestamp(),
interceptor,
flushBeforeCompletion,
autoClose,
connectionReleaseMode,
tenantIdentifier
);
for ( SessionEventListener listener : listeners ) {
session.getEventListenerManager().addListener( listener );
}
return session;
}
}
}因此有时候我们说:Hibernate session就是java.sql.Connection的一层高级封装,一个session对应了一个Connection。
1、获取Connection
这里会通过调用hibernate的ConnectionProvider接口的getConnection()获取Connection,而实际执行的有三个类继承ConnectionProvider:
1、DatasourceConnectionProviderImpl通过数据源获取:dataSource.getConnection();
2、DriverManagerConnectionProviderImpl通过ConnectionCreator获取:connectionCreator.createConnection();
3、UserSuppliedConnectionProviderImpl仅仅是抛出异常;
这里详细说明一下第一种:hibernate和各种连接池的联系是通过java的DateSource,hibernate使用DateSource的接口,各种连接池提供DateSource的实现类。而我们则是把该实现类定义为Bean。比如在tomcat.jdbc.pool中,dataSource.getConnection()这个方法实际上是通过连接池的ConnectionPool的ProxyClassConstructor.newInstance()获取Connection。
2、openSession()的实现代码(hibernate),简略:
package org.hibernate.internal;
import java.sql.Connection;
import org.hibernate.Interceptor;
import org.hibernate.Session;
import org.hibernate.SessionEventListener;
import org.hibernate.engine.spi.SessionBuilderImplementor;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SessionOwner;
import org.hibernate.internal.SessionImpl;
public final class SessionFactoryImpl implements SessionFactoryImplementor {
static class SessionBuilderImpl implements SessionBuilderImplementor {
private final SessionFactoryImpl sessionFactory;
private Connection connection;
@Override
public Session openSession() {
final SessionImpl session = new SessionImpl(
connection,
sessionFactory,
sessionOwner,
getTransactionCoordinator(),
getTransactionCompletionProcesses(),
autoJoinTransactions,
sessionFactory.settings.getRegionFactory().nextTimestamp(),
interceptor,
flushBeforeCompletion,
autoClose,
connectionReleaseMode,
tenantIdentifier
);
for ( SessionEventListener listener : listeners ) {
session.getEventListenerManager().addListener( listener );
}
return session;
}
}
}因此有时候我们说:Hibernate session就是java.sql.Connection的一层高级封装,一个session对应了一个Connection。
相关文章推荐
- Hibernate Oracle sequence的使用技巧
- jsp Hibernate批量更新和批量删除处理代码
- jsp hibernate的分页代码第1/3页
- JAVA+Hibernate 无限级分类
- SSH整合中 hibernate托管给Spring得到SessionFactory
- jsp hibernate 数据保存操作的原理
- hibernate中的增删改查实现代码
- Lost connection to MySQL server during query的解决
- 解决hibernate+mysql写入数据库乱码
- java优化hibernate性能的几点建议
- java Hibernate延迟加载
- hibernate 常用方法介绍
- 详解Java的Hibernate框架中的注解与缓存
- JQuery+Ajax+Struts2+Hibernate框架整合实现完整的登录注册
- 深入理解Hibernate中的flush机制
- 简单的手工hibernate程序示例
- 解析使用jdbc,hibernate处理clob/blob字段的详解
- 浅析java程序中hibernate的应用总结
- java面试常见问题之Hibernate总结
- 使用Hibernate