1.Spring中,不提供具体的ORM实现,而只是为应用提供对ORM产品的集成环境和使用平台,Spring将Hibernate的会话工厂通过IoC容器管理起来,并且将数据源注入,同时Spring为Hibernate提供了更上层的API封装,方便应用调用,本文通过分析相应源码了解Spring对Hibernate支持的实现。
2.AbstractSessionFactoryBean管理Hibernate会话工厂:
使用过Hibernate的人都知道,Hibernate的SessionFactory(会话工厂)是Hibernate的基础,SessionFactory管理Hibernate的相关配置和映射资源,Spring中通过AbstractSessionFactoryBean抽象类来管理Hibernate的会话工厂,AbstractSessionFactoryBean实现Spring的工厂Bean(FactoryBean)接口,因此AbstractSessionFactoryBean是一个Spring的工厂Bean,即Spring管理Hibernate的IoC容器,AbstractSessionFactoryBean的源码如下:
[java] view plaincopyprint public abstract class AbstractSessionFactoryBean implements FactoryBean
, InitializingBean, DisposableBean, PersistenceExceptionTranslator { protected final Log logger = LogFactory.getLog(getClass()); //数据源 private DataSource dataSource; //Hibernate会话使用Spring事务管理器包装的数据源 private boolean useTransactionAwareDataSource = false; //从Hibernate会话工厂中获取的当前会话是否暴露给Spring事务来包装 private boolean exposeTransactionAwareSessionFactory = true; //Hibernate SQL相关异常转换器 private SQLExceptionTranslator jdbcExceptionTranslator; //Hibernate会话工厂 private SessionFactory sessionFactory; //为会话工厂设置数据源,如果设置,则覆盖Hibernate配置文件中的数据源设置 public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public DataSource getDataSource() { return this.dataSource; } //设置Hibernate会话工厂是否使用Spring事务(jdbc事务)包装的数据源, //true,则使用Spring的jdbc事务;false,则使用Hibernate事务或者JTA public void setUseTransactionAwareDataSource(boolean useTransactionAwareDataSource) { this.useTransactionAwareDataSource = useTransactionAwareDataSource; } protected boolean isUseTransactionAwareDataSource() { return this.useTransactionAwareDataSource; } //为通过Hibernate会话工厂getCurrentSession()方法获得的当前会话设置 //是否使用Spring会话包装 public void setExposeTransactionAwareSessionFactory(boolean exposeTransactionAwareSessionFactory) { this.exposeTransactionAwareSessionFactory = exposeTransactionAwareSessionFactory; } protected boolean isExposeTransactionAwareSessionFactory() { return this.exposeTransactionAwareSessionFactory; } //为Hibernate会话工厂设置JDBC异常转换器,当Hibernate产生的任何由jdbc异常 //引起的SQL异常时,使用jdbc异常覆盖Hibernate默认的SQL方言(Dialect)异常 public void setJdbcExceptionTranslator(SQLExceptionTranslator jdbcExceptionTranslator) { this.jdbcExceptionTranslator = jdbcExceptionTranslator; } //创建Hibernate会话工厂,IoC容器初始化回调方法 public void afterPropertiesSet() throws Exception { //委托模式,调用AbstractSessionFactoryBean子类//LocalSessionFactoryBean实现的方法 SessionFactory rawSf = buildSessionFactory(); //如果需要,将给定的会话工厂使用代理包装 this.sessionFactory = wrapSessionFactoryIfNecessary(rawSf); //钩子方法,Hibernate会话工厂创建成功后,应用自定义处理 afterSessionFactoryCreation(); } //如果有需要,将给定的Hibernate会话工厂用代理封装 protected SessionFactory wrapSessionFactoryIfNecessary(SessionFactory rawSf) { return rawSf; } //应用从Spring管理Hibernate会话工厂的IoC容器中获取SessionFactory protected final SessionFactory getSessionFactory() { if (this.sessionFactory == null) { throw new IllegalStateException("SessionFactory not initialized yet"); } return this.sessionFactory; } //当Spring管理Hibernate会话工厂的IoC容器关闭时关闭所创建的会话工厂 public void destroy() throws HibernateException { logger.info("Closing Hibernate SessionFactory"); try { beforeSessionFactoryDestruction(); } finally {