Hibernate操作数据库的回调机制--Callback


1:一般情况下,在使用Hibernate Session存取数据库的代码中,基本上大部分是相同的,如下两个方法所示,

 
  1. //查询Teacher操作  
  2. ublic Teacher getTeacher(Long id) throws DataAccessException {  
  3. Session session = getSession();  
  4. Teacher teacher = null;  
  5. try {  
  6.     teacher = (Teacher)session.get(Teacher.class, id);  
  7.     ...  
  8.       
  9. } catch(HibernateException ex) {  
  10.     throw convertHibernateAccessException(ex);  
  11. } catch(SQLException ex) {  
  12.     throw convertJdbcAccessException(ex);  
  13. } catch(RuntimeException ex) {  
  14.     throw ex;  
  15. } finally {  
  16.     session.close();  
  17.     return teacher;  
  18. }  
 
  1. //查询Class操作  
  2. ublic classInfo getTeacher(Long id) throws DataAccessException {  
  3. Session session = getSession();  
  4. ClassInfo classInfo = null;  
  5. try {  
  6.     classInfo = (ClassInfo)session.get(ClassInfo.class, id);  
  7.     ...  
  8.       
  9. } catch(HibernateException ex) {  
  10.     throw convertHibernateAccessException(ex);  
  11. } catch(SQLException ex) {  
  12.     throw convertJdbcAccessException(ex);  
  13. } catch(RuntimeException ex) {  
  14.     throw ex;  
  15. } finally {  
  16.     session.close();  
  17.     return classInfo;  
  18. }  
上面这两种方法的做法是不对的,大量重复的代码会导致后期维护困难,这里可以考虑把具体的业务逻辑处理部分剥离出来,而只对公共的Session获取及释放

和异常处理部分进行封装,形成一个公共的方法,如下面代码所示,

 
  1. //封装后公用方法  
  2. ublic Object process(HibernateCallback action) throws DataAccessException {  
  3. Session session = getSession();  
  4. Object obj = null;  
  5. try {  
  6.     obj = action.doInHibernate(session);  
  7. } catch(HibernateException ex) {  
  8.     throw convertHibernateAccessException(ex);  
  9. } catch(SQLException ex) {  
  10.     throw convertJdbcAccessException(ex);  
  11. } catch(RuntimeException ex) {  
  12.     throw ex;  
  13. }  

 

  1. //查询Teacher操作  
  2. public Teacher getTeacher(final Long id) throws DataAccessException {  
  3.     return (Teacher)process(new HibernateCallback(){  
  4.         public Object doInHibernate(Session session) throws HibernateException, SQLException {  
  5.             Teacher teacher = (Teacher)session.get(Teacher.class, id);  
  6.             return teacher;  
  7.         }  
  8.     });  
  9. }  
回调,就是由被调用者调用由调用者提供的对象实现具体的业务操作。回调机制一般与模板方法结合起来作为一种模式使用,回调机制让应用程序人员只关心业务逻辑实现,

而不用处理一些底层通用操作,从而可以实现通用操作和业务逻辑相分离。比如在Java数据库操作中,使用回调机制,不用关心数据库连接的打开和关闭,只需要在Callback实现相关的数据存取即可,这样可以从一定程度上保证数据库连接总是被及时关闭。

相关内容