`

java回调机制及Hibernate中的HibernateTemplate实现

阅读更多

谈谈回调吧,以前学java的时候居然没接触到这个词汇,汗,最近研究hibernate和spring结合时,发现spring实现hibernate时应用了回调机制,于是google了很多次,终于有所体会了,现在做下小小的总结,以便加深印象!

 java回调机制:

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。

同步调用是一种阻塞式调用,调用 方要等待对方执行完毕才返回,它是一种单向调用;

回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口

异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

这是搜索的一点比较枯燥的理论解释了,算是红体部分让我稍微明白了一点是怎么个回事,然后又看到一个例子,又让我明白不少。

看看在JAVA里的例子:

public class Test{

   public static void main(String[] args){

     FooBar foo=new FooBar();

/**注意下面的这项代码片段,它给foo对象传递了一个实现ICallBack接口的匿名类,这样FooBar类的对象就取

得了一个实现接口的类,因此FooBar可以在任何时候调用接口中的方法*/

     foo.setCallBack(new ICallBack(){

     public void postExec(){System.out.println("我(postExec)是在Test类中实现的,但我不能被Test的对象引用,"+

     "而由FooBar对象调用");}

     });

   }

}

public interface ICallBack(){

  void postExec();

}

public class FooBar..{

  private ICallBack callBack;

  public void setCallBack(ICallBack callBack){

    this.callBack=callBack;

  }

/*我没有实现接口,但是我取得了一个实现接口的对象,而这个对象是其他类调用我的方法( setCallBack ())

时所赋给我的,因此我可以在业务需要的地方来调用实现接口的类里面的方法*/

  public void doSth(){

     ....

     callBack.postExec();

  }

  ..

}

上述两个类的描述:

  1.class   A,class   B  

  2.class   A实现接口ICallBack  

  3.class   B拥有一个参数为ICallBack接口类型的函数setCallBack(ICallBack   o)  

  4.class   A运行时调用class   B中setCallBack函数,以自身传入参数  

  5.class   B已取得A,就可以随时回调A所实现的ICallBack接口中的方法

 

下面在来看看在Hibernate中如何构造自己的HibernateTemplate模版

使用模板模式简化DAO操作Hibernate


在使用Spring + Hibernate做开发过时,在写DAO的时候使用过Spring的HibernateDaoSupport类,然后在实现的时候就可以很轻松的使用getHibernateTemplate()方法之后就可以调用save()、delete()、update()等Hibernate的Session的操作,很简单。比如:
  
  getHibernateTemplate().save(user);

 但是我们在使用Hibernate的时候不一定会使用Spring,所以我们可以模仿Spring的处理方式,做一个Hibernate的模板,使用模板模式来简化我们的开发,其主要的目的就是为了简化开发,使代码达到最大化的重用,另外呢,是帮助自己对回调机制有一个更深层的了解。

1.我们现来实现一个Hibernate模板:
  
  package kick.hibernate;
  
  import net.sf.hibernate.HibernateException;
  import net.sf.hibernate.Session;
  import net.sf.hibernate.Transaction;
  
  public class HibernateTemplate{
  public static Object run(HibernateCallback callback) throws HibernateException{
  Session session = null;
  Transaction tx = null;
  try {
  session = HibernateSessionutil.currentSession();
  tx = session.beginTransaction();
  Object result = callback.execute(session);
  tx.commit();
  session.flush();
  return result;
  } catch (HibernateException e) {
  tx.rollback();
  return null;
  } finally {
  HibernateSessionutil.closeSession();
  }

  }


这里类很简单,就是使用一个实现HibernateCallBack接口的一个回调类,在调用的时候根据具体的需求实现HibernateCallBack类。

强调一下偶,仔细体会红色部分的代码,其实这部分就是对回调的最好的体现,callbak肯定是一个实现了HibernateCallback 接口的类的对象,而execute(Session s)的具体实现就是在这个实现类中实现的,但是我们没法显示的调用该实现类里面的具体方法,如execute(),而只是通过接口的形式来调用方法,晕,说了一大堆,把我自己都快整糊涂了,算了,还是继续写例子吧,结合例子看,可能明白的更快一些。

2.回掉接口HibernateCallBack:
  package kick.hibernate;
  
  import net.sf.hibernate.HibernateException;
  import net.sf.hibernate.Session;
  
  public interface HibernateCallBack {
  Object execute(Session session)throws HibernateException;
  }

好了,到此为止我们就可以使用这个模板了,可以用如下的方式使用:

//调用的时候根据具体的需求实现HibernateCallBack类。 我在这里是实现保存的业务

HibernateTemplate.run(

new HibernateCallback() {
  public Object execute(Session session) throws HibernateException {
  session.save(user);
  return null;
  }
  }   //这其实是一个匿名类

);

不过这还没有达到想Spring里面那样简单,不要着急,“面包会有的”呵呵,我们会达到的。

3.实现我们自己的HibernateSupport类:
  
  从上面的代码可以看出,我们要自己实现HibernateCallback接口,而每次我们实现的时候又重复代码了。因此我们再抽象,讲这些实现放到我们的HibernateSupport类里面去。看看我们上面的代码就知道我们实现HibernateCallback接口的目的就是为了调用session.save()方法,即session的方法。代码如下:
  
  package kick.hibernate;
  
  import java.io.Serializable;
  
  import net.sf.hibernate.HibernateException;
  import net.sf.hibernate.Session;
  
  public class HibernateSupport{
  
  public Object save(final Object object) throws HibernateException{
  return HibernateTemplate.run(new HibernateCallBack(){
  
  public Object execute(Session session) throws HibernateException {
  session.save(object);
  return null;
  }
  
  });
  }
  public Object save(final Object object,final Serializable id) throws HibernateException{
  return HibernateTemplate.run(new HibernateCallBack(){
  
  public Object execute() throws HibernateException {
  session.save(object,id);
  return null;
  }
  
  });
  }
  
  public Object saveOrUpdate(final Object object) throws HibernateException{
  return HibernateTemplate.run(new HibernateCallBack(){
  
  public Object execute(Session session) throws HibernateException {
  session.saveOrUpdate(object);
  return null;
  }
  
  });
  }
  ……………………………………………………………………………………
  ……………………………………………………………………………………
  ……………………………………………………………………………………
  
  调用一些其他的session的方法。
  
  }
  
  4.抽象RootDao:
  
  该类为抽象类,在实现自己的DAO类的时候继承该类。该类的有一个HibernateSupport的对象,在子类中使用getHibernateTemplate()方法就可以得到该对象,然后调用它对应的方法。实现代码如下:
  
  package kick.hibernate.dao;
  
  import net.sf.hibernate.Session;
  import kick.hibernate.HibernateTemplateImpl;
  
  public abstract class RootDao {
  private HibernateSupport temp = null;
  
  /**
  * @return Returns the temp.
  */
  public HibernateTemplateImpl getHibernateTemplate(Session session) {
  return new HibernateSupport();
  }
  }
  
  5.使用例子:
  
  定义一个自己的DAO类,实现代码如下:
  
  public class UserDaoImpl extends RootDao implements UserDaoInterface{
  public void saveUser(User user) throws KickException {
  getHibernateTemplate().saveOrUpdate(user);
  }
  ……………………………………………………………………………………
  实现其他的方法
  ……………………………………………………………………………………
  }
  看到没有?红色的代码,就实现了Spring的HibernateSupport了吧

好了,回调暂时这这里就告一段落了......

分享到:
评论

相关推荐

    HibernateTemplate的方法使用

    - **功能**:执行指定的回调方法,并返回其结果。 - **示例代码**: ```java template.execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, ...

    HibernateTemplate源代码

    `HibernateTemplate`提供了一种统一的异常处理机制,可以将Hibernate抛出的各种异常转换为Spring的`DataAccessException`异常层次结构中的异常。这有助于应用程序以一致的方式处理所有数据访问异常。 ```java ...

    ssh框架整合分页--内部类回调函数

    4. **内部类回调函数**:在Action类中,我们可以创建一个内部类来实现分页逻辑。这个内部类通常继承自Struts2的ResultSupport类,覆盖execute方法,这样我们可以在回调函数中处理分页的相关逻辑,例如计算总页数、...

    HibernateS整合pring

    此外,`HibernateTemplate`还支持`HibernateCallback`接口,允许开发者在回调方法`doInHibernate(Session session)`中使用原生的Hibernate API,以应对更复杂的数据访问需求。这种方法确保了灵活性,即使在Spring的...

    Hibernate方法总结

    在Java持久化框架Hibernate中,HibernateTemplate是一个便捷的工具类,它封装了常见的数据库操作,使得开发者能够更方便地与数据库交互。以下是对标题和描述中提到的HibernateTemplate方法的详细总结: A. `get` 和...

    HibernateTemplate原理代码-模版设计模式

    // 回调 callback.doInHibernate(s); s.getTransaction().commit(); } catch (Exception e) { s.getTransaction().rollback(); } finally { s.close(); s = null; } } private Session getSession() { ...

    spring hibernatetemplate

    但是,如果在`HibernateTemplate`的`execute`方法中手动调用了`session.flush()`,那么这个事务就会被立即提交,而不是等待整个回调方法执行完毕。因此,如果需要确保多个操作都在同一个事务中,开发者需要自己控制...

    hibernate-release-4.2.2.Final

    1. 支持JPA 2.1规范:提供了新的查询元素,如TemporalType,以及更丰富的实体生命周期回调。 2. 强化了第二级缓存:引入了对查询结果的缓存支持,提高了系统响应速度。 3. 优化了HQL和JPQL查询:增强了类型安全性和...

    spring+hibernate详解

    通过`HibernateTemplate`的`execute`方法传入一个实现了`HibernateCallback`接口的对象,可以在回调方法中执行任意的Hibernate操作。 ```java public class PersonDaoImpl extends HibernateDaoSupport implements ...

    Spring整合Hibernate 详解.doc

    通过实现这个接口,可以在执行特定数据库操作前后的回调函数中进行额外的工作,如事务控制、日志记录等。 6.5.6 使用IoC容器组装各种组件 Spring的IoC容器是其核心特性之一,它负责管理应用中的对象及其依赖关系。...

    Struts+Spring+Hibernate之选课系统

    Spring还支持使用回调机制(如HibernateCallback)处理特殊查询和分页。 Hibernate的核心在于对象关系映射,它允许我们将Java对象直接映射到数据库表。开发者需要正确配置实体类(Entity)和数据访问对象(DAO),...

    hibernate分页技术.doc

    在回调方法`doInHibernate`中,通过`createQuery()`创建Query对象,然后使用`setFirstResult()`设置起始位置(即偏移量),`setMaxResults()`设置每页条目数量,最后执行`list()`获取结果集。 2. `findByPage...

    spring学习之八--Hibernate编程式事务

    在这个例子中,如果在事务回调方法中抛出未检查异常(继承自RuntimeException的异常)或者受检异常(需要在方法签名中声明的异常),那么事务将会自动回滚。否则,当事务回调方法正常结束时,事务会自动提交。 然而...

    Struts2,hibernate,Spring分页方法

    `getHibernateTemplate().executeFind()`方法允许我们在回调方法中像操作原生Hibernate一样设置分页参数。 接下来,为了更好地管理分页信息,我们可以创建一个名为`PaginationInfo`的类,该类通常包含以下属性: - ...

    HibernateSpringStruts2整合开发中的一个分页显示方案.doc

    `queryForPage()`通过`HibernateTemplate`执行一个回调函数,该函数创建并配置Query对象,设置起始位置和最大结果数来实现分页。`getAllRowCount()`则直接使用`HibernateTemplate.find(hql)`的大小来获取记录总数。 ...

    Hibernate+Spring+Struts2整合开发中的一个分页显示方案参考.pdf

    在`queryForPage`方法中,通过`HibernateTemplate`的`executeFind`方法,我们可以传递一个`HibernateCallback`实例,该回调内部创建`Query`对象并设置分页参数`setFirstResult`和`setMaxResults`。`getAllRowCount`...

    DWR集合Spring实现异步提交

    DWR会自动处理请求的异步发送和结果的回调。 ```javascript var myService = new MyService(); myService.someMethod(param1, param2, function(response) { // 处理返回的结果 }); ``` **Struts 1.2和Hibernate ...

    Spring学习工程1

    9. **Spring_1300_IOC_Pre_Post_Scope**:这里可能讨论的是Spring的生命周期回调方法,如初始化(@PostConstruct)和销毁(@PreDestroy)注解,以及bean的作用域,如单例(singleton)、原型(prototype)等。...

    Spring对DAO的支持.doc

    - **HibernateCallback**:定义了一个回调接口,允许在事务内部执行自定义的Hibernate操作。 通过使用HibernateTemplate,开发者可以专注于业务逻辑,而无需关注底层的SessionFactory和Session管理。 总结来说,...

Global site tag (gtag.js) - Google Analytics