拿个例子来看

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()方法
1
public 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接口的类即可。这样大大加速了开发速度。自己感兴趣的话,也可以自己实现一下。这样对设计模式的理解会更深一步的。