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. } catch(HibernateException ex) {
  9. throw convertHibernateAccessException(ex);
  10. } catch(SQLException ex) {
  11. throw convertJdbcAccessException(ex);
  12. } catch(RuntimeException ex) {
  13. throw ex;
  14. } finally {
  15. session.close();
  16. return teacher;
  17. }
            //查询Teacher操作
public Teacher getTeacher(Long id) throws DataAccessException {
Session session = getSession();
Teacher teacher = null;
try {
teacher = (Teacher)session.get(Teacher.class, id);
... } catch(HibernateException ex) {
throw convertHibernateAccessException(ex);
} catch(SQLException ex) {
throw convertJdbcAccessException(ex);
} catch(RuntimeException ex) {
throw ex;
} finally {
session.close();
return teacher;
}
}
  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. } catch(HibernateException ex) {
  9. throw convertHibernateAccessException(ex);
  10. } catch(SQLException ex) {
  11. throw convertJdbcAccessException(ex);
  12. } catch(RuntimeException ex) {
  13. throw ex;
  14. } finally {
  15. session.close();
  16. return classInfo;
  17. }
       //查询Class操作
public classInfo getTeacher(Long id) throws DataAccessException {
Session session = getSession();
ClassInfo classInfo = null;
try {
classInfo = (ClassInfo)session.get(ClassInfo.class, id);
... } catch(HibernateException ex) {
throw convertHibernateAccessException(ex);
} catch(SQLException ex) {
throw convertJdbcAccessException(ex);
} catch(RuntimeException ex) {
throw ex;
} finally {
session.close();
return classInfo;
}
}

上面这两种方法的做法是不对的,大量重复的代码会导致后期维护困难,这里可以考虑把具体的业务逻辑处理部分剥离出来,而只对公共的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. }
        //封装后公用方法
public Object process(HibernateCallback action) throws DataAccessException {
Session session = getSession();
Object obj = null;
try {
obj = action.doInHibernate(session);
} catch(HibernateException ex) {
throw convertHibernateAccessException(ex);
} catch(SQLException ex) {
throw convertJdbcAccessException(ex);
} catch(RuntimeException ex) {
throw ex;
}
}
  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. }
        //查询Teacher操作
public Teacher getTeacher(final Long id) throws DataAccessException {
return (Teacher)process(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Teacher teacher = (Teacher)session.get(Teacher.class, id);
return teacher;
}
});
}

回调,就是由被调用者调用由调用者提供的对象实现具体的业务操作。回调机制一般与模板方法结合起来作为一种模式使用,回调机制让应用程序人员只关心业务逻辑实现,

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

Hibernate操作数据库的回调机制--Callback的更多相关文章

  1. JAVA回调机制(CallBack)详解

    序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...

  2. hibernate操作数据库总结

    这篇文章用于总结hibernate操作数据库的各种方法 一.query方式 1.hibernate使用原生态的sql语句执行数据库查询 有些时候有些开发人员总觉得用hql语句不踏实,程序出现了错误,就 ...

  3. Java_Web三大框架之Hibernate操作数据库(三)

    使用Hibernate操作数据库需要七个步骤: (1)读取并解析配置文件 Configuration conf = newConfiguration().configure(); (2)读取并解析映射 ...

  4. [转]JAVA回调机制(CallBack)详解

    看见一篇博客比较通俗的解释了回调机制,转载一下,感谢原文作者Bro__超,原文地址:http://www.cnblogs.com/heshuchao/p/5376298.html 序言 最近学习jav ...

  5. MTK Android 回调机制[CallBack]

    具体步骤: 一.建模 回调函数的关键是:将一段代码作为参数传递,而这段代码将会在某个时刻被执行 我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去 ...

  6. hibernate操作数据库例子

    1.工程目录结构如下 2.引入需要的jar包,如上图. 3.创建持久化类User对应数据库中的user表 package com.hibernate.配置文件.pojo; import java.sq ...

  7. hibernate操作数据库总结(转)

    一.query方式 1.hibernate使用原生态的sql语句执行数据库查询 有些时候有些开发人员总觉得用hql语句不踏实,程序出现了错误,就猜测因为不是原生态的sql语句,数据库不支持,因此情愿选 ...

  8. Hibernate 操作数据库

    com.tao.pojo实体类 package com.tao.pojo; public class User { private int id; private String name; priva ...

  9. 转 使用Hibernate操作数据库时报:No CurrentSessionContext configured! 异常

    没有currentSession配置错误,即在我们使用currentSession的时候要在hibernate.cfg.xml中进行相关的事务配置:1.本地事务<property name=&q ...

随机推荐

  1. 多线程编程学习四(Lock 的使用).

    一.前言 本文要介绍使用Java5中 Lock 对象,同样也能实现同步的效果,而且在使用上更加方便.灵活,主要包括 ReentrantLock 类的使用和ReentrantReadWriteLock ...

  2. 第1阶段——uboot分析之仿照bootm制作hello命令(7)

    仿照bootm命令生成来制作一个hello命令,功能:打印出hello,world!和参数值 1.点击New File ,创建cmd_hello.c将./common/cmd_bootm.c的头文件复 ...

  3. Java web servers 间是如何实现 session 同步的

     Java web servers 间是如何实现 session 同步的 有一个多月的时间没有更新博客了,今天终于忙里偷闲,可以把近期的收获总结一下. 本文是关于Java web servers 之间 ...

  4. JSON与String之间互转

    一,String转json 这个JSON.parse()与eval()都可以实现,但是它们是有区别的, JSON.parse对json字符串要求比eval()更为严格,key名称(例如name)全部必 ...

  5. 201521123040《Java程序设计》第2周学习总结

    1. 本周学习总结 本周学习目录: <1>回顾(Java程序) <2>掌握各种数据类型的使用 <3>掌握运算符和表达式的使用 <4>枚举类.String ...

  6. evak购物车--团队博客

    1. 团队名称.团队成员介绍(需要有照片) 团队名称:evak 团队成员介绍:陈凯欣,计算机工程学院网络工程1512,学号为201521123034:邱晓娴,计算机工程学院网络工程1512,学号为20 ...

  7. Eclipse rap 富客户端开发总结(5): RAP国际化之路

    Eclipse RCP 中的plugin.xml国际化实现 1.  在工程的根目录下面建立一个plugin.properties资源文件:在此资源文件中写入需要国际化的内容(键/值对),举例如下: h ...

  8. Hibernate第三篇【主配置文件、映射文件、复合主键映射】

    前言 目前已经学了如何搭建Hibernate的开发环境,以及Hibernate对应的API了-在快速入门还没讲解的就是配置文件是怎么配置的.因此,本博文主要讲解主配置文件以及映射配置文件.. 主配置文 ...

  9. PowerDesigner连接MySQL和逆向工程图

    0.写在前面的话 最近想梳理公司项目的表间关系,从项目后台管理系统的操作入手,以及代码的hibernate注解入手,都不算特别尽人意,于是最后还是鼓捣了一下PowerDesigner的逆向工程图,这样 ...

  10. Struts+Spring+Hibernate项目整合AJAX+JSON

    1.什么是AJAX AJAX是 "Asynchronous JavaScript and XML" 的简称,即异步的JavaScript和XML. 所谓异步,就是提交一个请求不必等 ...