首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring源代码解析(8):Spring驱动Hibernate的实现

2012-10-08 
Spring源代码解析(八):Spring驱动Hibernate的实现O/R工具出现之后,简化了许多复杂的信息持久化的开发。Spri

Spring源代码解析(八):Spring驱动Hibernate的实现

O/R工具出现之后,简化了许多复杂的信息持久化的开发。Spring应用开发者可以通过Spring提供的O/R方案更方便的使用各种持久化工具,比如Hibernate;下面我们就Spring+Hibernate中的Spring实现做一个简单的剖析。
Spring对Hinberanate的配置是通过LocalSessionFactoryBean来完成的,这是一个工厂Bean的实现,在基类AbstractSessionFactoryBean中:


        而直接调用org.hibernate.cfg.Configuration来得到需要的SessionFactory:

                private?static?Session?doGetSession( ??????????????SessionFactory?sessionFactory,?Interceptor?entityInterceptor, ??????????????SQLExceptionTranslator?jdbcExceptionTranslator,?boolean?allowCreate) ??????????????throws?HibernateException,?IllegalStateException?{ ????????????Assert.notNull(sessionFactory,?"No?SessionFactory?specified"); ????????????//这个TransactionSynchronizationManager的Resource是一个ThreadLocal变量,sessionFactory是一个单例,但ThreadLocal是和线程绑定的 ??????????//这样就实现了Hiberante中常用的通过ThreadLocal的session管理机制 ??????????SessionHolder?sessionHolder?=?(SessionHolder)?TransactionSynchronizationManager.getResource(sessionFactory); ??????????if?(sessionHolder?!=?null?&&?!sessionHolder.isEmpty())?{ ??????????????//?pre-bound?Hibernate?Session ??????????????Session?session?=?null; ??????????????if?(TransactionSynchronizationManager.isSynchronizationActive()?&& ??????????????????????sessionHolder.doesNotHoldNonDefaultSession())?{ ??????????????????//?Spring?transaction?management?is?active?-> ??????????????????//?register?pre-bound?Session?with?it?for?transactional?flushing. ??????????????????session?=?sessionHolder.getValidatedSession(); ??????????????????if?(session?!=?null?&&?!sessionHolder.isSynchronizedWithTransaction())?{ ??????????????????????logger.debug("Registering?Spring?transaction?synchronization?for?existing?Hibernate?Session"); ??????????????????????TransactionSynchronizationManager.registerSynchronization( ??????????????????????????????new?SpringSessionSynchronization(sessionHolder,?sessionFactory,?jdbcExceptionTranslator,?false)); ??????????????????????sessionHolder.setSynchronizedWithTransaction(true); ??????????????????????//?Switch?to?FlushMode.AUTO,?as?we?have?to?assume?a?thread-bound?Session ??????????????????????//?with?FlushMode.NEVER,?which?needs?to?allow?flushing?within?the?transaction. ??????????????????????FlushMode?flushMode?=?session.getFlushMode(); ??????????????????????if?(flushMode.lessThan(FlushMode.COMMIT)?&& ??????????????????????????????!TransactionSynchronizationManager.isCurrentTransactionReadOnly())?{ ??????????????????????????session.setFlushMode(FlushMode.AUTO); ??????????????????????????sessionHolder.setPreviousFlushMode(flushMode); ??????????????????????} ??????????????????} ??????????????} ??????????????else?{ ??????????????????//?No?Spring?transaction?management?active?->?try?JTA?transaction?synchronization. ??????????????????session?=?getJtaSynchronizedSession(sessionHolder,?sessionFactory,?jdbcExceptionTranslator); ??????????????} ??????????????if?(session?!=?null)?{ ??????????????????return?session; ??????????????} ??????????} ??????????//这里直接打开一个Session ??????????logger.debug("Opening?Hibernate?Session"); ??????????Session?session?=?(entityInterceptor?!=?null?? ??????????????????sessionFactory.openSession(entityInterceptor)?:?sessionFactory.openSession()); ????????????//?Use?same?Session?for?further?Hibernate?actions?within?the?transaction. ??????????//?Thread?object?will?get?removed?by?synchronization?at?transaction?completion. ??????????//?把新打开的Session放到SessionHolder,然后放到ThreadLocal里面去和线程绑定起来,这个ThreadLocal是在?TransactionSynchronizationManager中配置好的,可以根据sessionFactory来索取 ??????????//?同时根据事务处理的状态来配置session的属性,比如把FlushMode设置为Never,同时把session和事务处理关联起来 ??????????if?(TransactionSynchronizationManager.isSynchronizationActive())?{ ??????????????//?We're?within?a?Spring-managed?transaction,?possibly?from?JtaTransactionManager. ??????????????logger.debug("Registering?Spring?transaction?synchronization?for?new?Hibernate?Session"); ??????????????SessionHolder?holderToUse?=?sessionHolder; ??????????????if?(holderToUse?==?null)?{ ??????????????????holderToUse?=?new?SessionHolder(session); ??????????????} ??????????????else?{ ??????????????????holderToUse.addSession(session); ??????????????} ??????????????if?(TransactionSynchronizationManager.isCurrentTransactionReadOnly())?{ ??????????????????session.setFlushMode(FlushMode.NEVER); ??????????????} ??????????????TransactionSynchronizationManager.registerSynchronization( ??????????????????????new?SpringSessionSynchronization(holderToUse,?sessionFactory,?jdbcExceptionTranslator,?true)); ??????????????holderToUse.setSynchronizedWithTransaction(true); ??????????????if?(holderToUse?!=?se

热点排行