Welcome 微信登录

首页 / 数据库 / MySQL / 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实现相关的数据存取即可,这样可以从一定程度上保证数据库连接总是被及时关闭。Oracle隐式游标小例子Spring和Hibernate集成的HibernateTemplate的一些常用方法总结相关资讯      hibernate 
  • Hibernate利用@DynamicInsert和@  (今 07:09)
  • Hibernate某些版本(4.3)下报错   (04月20日)
  • Hibernate 5.1.0 正式版发布下载  (02月12日)
  • Hibernate的get和load的区别  (08月07日)
  • Hibernate3.1.2_中文文档PDF  (02月17日)
  • Hibernate ORM 5.0.6 发布下载  (12/17/2015 17:12:55)
本文评论 查看全部评论 (0)
表情: 姓名: 字数