Spring框架学习[HibernateTemplate对Hibernate的封装](十五)
throw new DataAccessResourceFailureException("Could not open Hibernate Session", ex); } } //获取Hibernate Sessionprivate static Session doGetSession( SessionFactory sessionFactory, Interceptor entityInterceptor, SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate) throws HibernateException, IllegalStateException { Assert.notNull(sessionFactory, "No SessionFactory specified"); //获取和当前线程绑定的Session资源 SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory); //如果当前线程有绑定了Session的资源,即已经有创建了的Session if (sessionHolder != null && !sessionHolder.isEmpty()) { Session session = null; //如果Spring事务管理是activate的 if (TransactionSynchronizationManager.isSynchronizationActive() && sessionHolder.doesNotHoldNonDefaultSession()) { //获取当前线程绑定的有效Session session = sessionHolder.getValidatedSession(); //如果获取了当前线程绑定的有效Session,并且当前线程绑定的Session //资源是事务同步的 if (session != null && !sessionHolder.isSynchronizedWithTransaction()) { logger.debug("Registering Spring transaction synchronization for existing Hibernate Session");//为已有的Hibernate Session注册Spring事务同步 TransactionSynchronizationManager.registerSynchronization( new SpringSessionSynchronization(sessionHolder, sessionFactory, jdbcExceptionTranslator, false)); sessionHolder.setSynchronizedWithTransaction(true); //根据实现级别设置Session刷新模式 FlushMode flushMode = session.getFlushMode(); if (flushMode.lessThan(FlushMode.COMMIT) && !TransactionSynchronizationManager.isCurrentTransactionR
eadOnly()) { session.setFlushMode(FlushMode.AUTO); sessionHolder.setPreviousFlushMode(flushMode); } } } //如果没有Spring管理的事务 else { //使用jta事务同步 session = getJtaSynchronizedSession(sessionHolder, sessionFactory, jdbcExceptionTranslator); } if (session != null) { return session; } } logger.debug("Opening Hibernate Session"); //当前线程没有绑定Session资源,则需要创建新Session Session session = (entityInterceptor != null sessionFactory.openSession(entityInterceptor) : sessionFactory.openSession()); //如果Spring管理的事务是activate的 if (TransactionSynchronizationManager.isSynchronizationActive()) { logger.debug("Registering Spring transaction synchronization for new Hibernate Session"); SessionHolder holderToUse = sessionHolder; //将新创建的Session添加到当前线程局部变量中 if (holderToUse == null) { holderToUse = new SessionHolder(session); } else { holderToUse.addSession(session); } //设置Session刷新模式 if (TransactionSynchronizationManager.isCurrentTransactionReadOnly()) { session.setFlushMode(FlushMode.MANUAL); } //为新创建的Hibernate Session注册Spring事务 TransactionSynchronizationManager.registerSynchronization( new SpringSessionSynchronization(holderToUse, sessionFactory, jdbcExceptionTranslator, true)); holderToUse.setSynchronizedWithTransaction(true); //将新创建的Session与当前线资源程绑定 if (holderToUse != sessionHolder) { TransactionSynchronizationManager.bindResource(sessionFactory, holderToUse); } } //如果没有Spring事务 else { //为Session设置JTA事务 registerJtaSynchronization(session, sessionFactory, jdbcExceptionTra