jdbcTemplate和hibernateTemplate之二

xiaoxiao2023-11-21  13

HibernateTemplate: 在我们dao层使用hibernate时,一种把dao层extends HibernateDaoSupport, 再得到HibernateTemplate,无论调用HiberanteTemplate关于crud数据库时都会调用execute(HibernateCallback(),boolean exposeNativeSession)方法, 我们一般只关心业务,所以只要实现hiberanteCallback方法,在里面实现业务就行了.execute的作用,使用我们不要控制事务,打开session,session.flush,session.close,这些都自动完成. execute源代码: public Object execute(HibernateCallback action, boolean exposeNativeSession) throws DataAccessException { Assert.notNull(action, "Callback object must not be null"); Session session = getSession();//得到session boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory()); if (existingTransaction) { logger.debug("Found thread-bound Session for HibernateTemplate"); } FlushMode previousFlushMode = null; try { previousFlushMode = applyFlushMode(session, existingTransaction); enableFilters(session); Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session)); Object result = action.doInHibernate//调用我们写的业务方法(sessionToExpose); flushIfNecessary(session, existingTransaction);//session.flush()保存数据到数据库去 return result; } catch (HibernateException ex) { throw convertHibernateAccessException(ex); } catch (SQLException ex) { throw convertJdbcAccessException(ex); } catch (RuntimeException ex) { // Callback code threw application exception... throw ex; } finally { if (existingTransaction) { logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate"); disableFilters(session); if (previousFlushMode != null) { session.setFlushMode(previousFlushMode); } } else { // Never use deferred close for an explicitly new Session. if (isAlwaysUseNewSession()) { SessionFactoryUtils.closeSession(session);//session.close(); } else { SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory()); } } } } 这里最重要的是看flushIfNecessary(session, existingTransaction);这个方法在HiberanteTemplate的父类HiberanteAccessor中: protected void flushIfNecessary(Session session, boolean existingTransaction) throws HibernateException { if (getFlushMode() == FLUSH_EAGER || (!existingTransaction && getFlushMode() != FLUSH_NEVER)) { logger.debug("Eagerly flushing Hibernate session"); session.flush(); } } 如果我们dao层一个方法中调用,hiberanteTemplate.save(1),hibernateTemplate.save(2).那么,就和jdbcTemplate.update(1),jdbcTemplate(2),一样了,如果同时保存成功或失败.我们也样设置事务.其实原理上面的jdbcTemplate一样.
转载请注明原文地址: https://www.6miu.com/read-5011342.html

最新回复(0)