liuqiang5151

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  0 Posts :: 23 Stories :: 1 Comments :: 0 Trackbacks
拿个例子来看
public void persist(final Object entity, final boolean isFlush) {
        getHibernateTemplate().persist(entity);
 }
HibernateTemplate源码:
public void persist(final Object entity) throws DataAccessException {
        execute(
new HibernateCallback() {
            
public Object doInHibernate(Session session) throws HibernateException {
                checkWriteOperationAllowed(session);
                session.persist(entity);
                
return null;
            }

        }
true);
    }

我们可以看到,在他的内部,执行的是一个名叫execute的方法,这里无论是persist方法还是update方法,到这里都会执行这个方法,看过设计模式的人可能很清楚,这个类似于封装调用。就是调用者不需要知道接受者是如何实现的,只知道调用execute这个方法就行了。方法里的参数是个接口类型。让我们来看看HibernateCallback这个接口是如何定义的。
HibernateCallback.java
public interface HibernateCallback {
    Object doInHibernate(Session session) 
throws HibernateException, SQLException;

}

这个接口就一个方法,我在上面传递的参数就是实现这个方法的类,匿名内部类可能看的不好懂,也可以这么理解。
public void persist(final Object entity) throws DataAccessException {
        HibernateCallbackImplForPersist(),
true);
    }
可以理解为HibernateCallbackImplForPersist这个类实现了HibernateCallback接口,实现代码就是上面的doInHibernate()方法。

execute()方法
 1public Object execute(HibernateCallback action, boolean exposeNativeSession) throws DataAccessException {
 2        Assert.notNull(action, "Callback object must not be null");
 3
 4        Session session = getSession();
 5        boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory());
 6        if (existingTransaction) {
 7            logger.debug("Found thread-bound Session for HibernateTemplate");
 8        }

 9
10        FlushMode previousFlushMode = null;
11        try {
12            previousFlushMode = applyFlushMode(session, existingTransaction);
13            enableFilters(session);
14            Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));
15            Object result = action.doInHibernate(sessionToExpose);
16            flushIfNecessary(session, existingTransaction);
17            return result;
18        }

19        catch (HibernateException ex) {
20            throw convertHibernateAccessException(ex);
21        }

22        catch (SQLException ex) {
23            throw convertJdbcAccessException(ex);
24        }

25        catch (RuntimeException ex) {
26            // Callback code threw application exception
27            throw ex;
28        }

29        finally {
30            if (existingTransaction) {
31                logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
32                disableFilters(session);
33                if (previousFlushMode != null{
34                    session.setFlushMode(previousFlushMode);
35                }

36            }

37            else {
38                // Never use deferred close for an explicitly new Session.
39                if (isAlwaysUseNewSession()) {
40                    SessionFactoryUtils.closeSession(session);
41                }

42                else {
43                    SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
44                }

45            }

46        }

47    }

当执行到 Object result = action.doInHibernate(sessionToExpose);这部的时候,会调用相应的实现类的方法。
至于为什么要这么做,在平常操作Hibernate的时候要进行一些异常处理,写一大堆try catch finally代码,这些代码跟业务逻辑毫无关联,但是还非写不可,而且这些代码在每个操作里都是一样的,这时我们就可以用一个类来封装这些操作。这样,开发人员就不
必为写关注这些与业务逻辑无关的操作,在调用的时候传入实现了HibernateCallback接口的类即可。这样大大加速了开发速度。自己感兴趣的话,也可以自己实现一下。这样对设计模式的理解会更深一步的。
posted on 2008-04-11 18:34 刘强 阅读(880) 评论(0)  编辑  收藏 所属分类: Hibernate

只有注册用户登录后才能发表评论。


网站导航: