`

{转}HibernateCallback

阅读更多

今天项目中用到了,HibernateCallback。以前没用过,也不知道这样做的作用有多大。上来存档一下。

HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。HibernateTemplate的灵活访问方式是通过如下两个方法完成:

q      Object execute(HibernateCallback action)

q      List execute(HibernateCallback action)

这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。

通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate的方法体就是Spring执行的持久化操作。具体代码如下:

public class PersonDaoImpl implements PersonDao

{

    //私有实例变量保存SessionFactory

         private SessionFactory sessionFactory;

         //依赖注入必须的setter方法

    public void setSessionFactory(SessionFactory sessionFactory)

         {

           this.sessionFactory = sessionFactory;

    }

         /**

         * 通过人名查找所有匹配该名的Person实例

         * @param name 匹配的人名

         * @return 匹配该任命的全部Person集合

         */

    public List findPersonsByName(final String name)

         {

           //创建HibernateTemplate实例

                   HibernateTemplate hibernateTemplate =

                         new HibernateTemplate(this.sessionFactory);

           //返回HibernateTemplate的execute的结果

                   return (List) hibernateTemplate.execute(

                //创建匿名内部类

                   new HibernateCallback()

                   {

              public Object doInHibernate(Session session) throws HibernateException

                            {

                   //使用条件查询的方法返回

                                     List result = session.createCriteria(Person.class)

                                                                     .add(Restrictions.like(“name”, name+”%”)

                                                                           .list();

                                    return result;

                     }

                });

    }

}

注意:方法doInHibernate方法内可以访问Session,该Session对象是绑定到该线程的Session实例。该方法内的持久层操作,与不使用Spring时的持久层操作完全相同。这保证对于复杂的持久层访问,依然可以使用Hibernate的访问方式。

 

 项目中的源码:

public List getAllByClient(final Client client, final int first, final int pageSize) {      

        List result = (List) this.getHibernateTemplate().execute(            new HibernateCallback() {

     @Override         

public Object doInHibernate(Session session)     

       throws HibernateException, SQLException {           

 List tmp = session.createQuery(          "from Album as ab where ab.client=:client")   

      .setEntity("client", client).setFirstResult(           first).setMaxResults(pageSize).list();    

   return tmp;   

  }

    });   return result;  }

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Luo2008wei/archive/2008/07/04/2610898.aspx

分享到:
评论

相关推荐

    getHibernateTemplate

    5. **回调机制**:当`getHibernateTemplate()`的标准方法无法满足特定需求时,可以使用`HibernateCallback`接口进行自定义操作。这允许你在Hibernate的Session内部执行任意操作,同时仍然享受到Spring提供的事务和...

    HibernateTemplate源代码

    `HibernateTemplate`通过其核心方法`execute`支持Hibernate访问代码的实现,该方法接受一个实现了`HibernateCallback`接口的匿名内部类或Lambda表达式。 #### 二、类结构与继承关系 `HibernateTemplate`类本身并...

    对hibernate的封装 HibernateTemplate

    6. **Callback机制**:通过HibernateCallback接口,可以在Hibernate Session内部执行自定义操作,保持事务的一致性。 **三、使用示例** 在使用HibernateTemplate之前,需要配置SessionFactory,并将其注入到...

    HibernateTemplate类的使用

    `HibernateCallback`是一个功能性接口,包含一个方法`doInHibernate`,开发者可以在该方法中编写具体的Hibernate操作逻辑。当`HibernateTemplate`执行`execute`方法时,它会在内部创建或获取一个`Session`,并调用`...

    HibernateS整合pring

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

    (java web) jsp分页显示

    return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); ...

    Spring基础:数据访问(2)

    - **Hibernate**:Spring通过HibernateTemplate和HibernateCallback接口,提供了对Hibernate的集成,使得我们可以利用Spring的DI和AOP来管理SessionFactory和Session。 - **MyBatis**:Spring支持MyBatis的...

    HibernateTemplate及generator用法.doc

    List<User> userList = ht.find("from User", new Object[]{}, new org.springframework.orm.hibernate3.HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, ...

    Bootstrap Table的使用总结

    例如,通过 `detachedCriteria.getExecutableCriteria(session)` 来获取可执行的 Criteria 对象,然后在 `HibernateCallback` 中处理查询。 返回的数据格式对于前端展示至关重要。在 Bootstrap Table 中,数据通常...

    Spring/泛型Hibernate的实现

    return (List) this.hibernateTemplate.execute(new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session....

    spring struts2 hibernate 整合教程 详细入门

    return getHibernateTemplate().executeFind(new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session....

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

    spring整合hibernate

    3. **模板方法模式**:Spring 为 Hibernate 提供了三种主要的支持方式:`HibernateDaoSupport`、`HibernateTemplate` 和 `HibernateCallback` 接口。其中,`HibernateTemplate` 是一个非常实用的工具类,它可以简化 ...

    ssh(structs,spring,hibernate)框架中的上传下载

    HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的数据操作方法,如execute(HibernateCallback action),load(Class entityClass, Serializable id),save(final ...

Global site tag (gtag.js) - Google Analytics