`
kitssilence
  • 浏览: 12993 次
  • 性别: Icon_minigender_1
  • 来自: 襄樊
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

对于Hibernate callback()的理解

阅读更多

HibernateTemplate提供了非常多的常用方法来完成数据库的基本操作,使得持久层访问摸板化,只要创建HibernateTemplate 实例后,注入一个SessionFactory的引用就可以了.无须手动创建sessionFactory,更加智能的管理Hibernate 的Session,没有大量的try/catch操作, 
   void delete(Object entity)删除指定持久化实例 
   deleteAll(Collection entities)删除集合内全部持久化实例 
   find(String queryString)根据HQL查询字符串返回实例集合 
   findByNamedQuery(Striing QueryName)根据命名查询返回实例集合 
   Get(Class entityClass,Serializable id)割据主键加载特定持久化类的实例 
   save(Object entity)保存实例 
   saveOrUpdate(Object entity)根据实例状态,选择保存或者更新 
   update(Object entity)更新实例的状态 
   setMaxResults(int maxResults)设置分页大小 
 
Hibernate的复杂用法HibernateCallback
HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。
HibernateTemplate的灵活访问方式是通过如下两个方法完成:
 
(1)Object execute(HibernateCallback action)
  
(2)List execute(HibernateCallback action)
 
这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。
程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。
HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),
该方法只有一个参数Session。通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,
方法doInHibernate的方法体就是Spring执行的持久化操作。
         做分页:
public List findByPage(final String hql,
        final int offset, final int pageSize)
    {
        //通过一个HibernateCallback对象来执行查询
        List list = getHibernateTemplate()
            .executeFind(new HibernateCallback()
        {
            //实现HibernateCallback接口必须实现的方法
            public Object doInHibernate(Session session)
                throws HibernateException, SQLException
            {
                //执行Hibernate分页查询
                List result = session.createQuery(hql)
                    .setFirstResult(offset)
                    .setMaxResults(pageSize)
                    .list();
                return result;
            }
        });
        return list;
    }

    /**
    * 使用hql语句进行分页查询
    * @param hql 需要查询的hql语句
    * @param value 如果hql有一个参数需要传入,value就是传入hql语句的参数
    * @param offset 第一条记录索引
    * @param pageSize 每页需要显示的记录数
    * @return 当前页的所有记录
    */
    public List findByPage(final String hql , final Object value ,
        final int offset, final int pageSize)
    {
        //通过一个HibernateCallback对象来执行查询
        List list = getHibernateTemplate()
            .executeFind(new HibernateCallback()
        {
            //实现HibernateCallback接口必须实现的方法
            public Object doInHibernate(Session session)
                throws HibernateException, SQLException
            {
                //执行Hibernate分页查询
                List result = session.createQuery(hql)
                    //为hql语句传入参数
                    .setParameter(0, value)
                    .setFirstResult(offset)
                    .setMaxResults(pageSize)
                    .list();
                return result;
            }
        });
        return list;
    }

    /**
    * 使用hql语句进行分页查询
    * @param hql 需要查询的hql语句
    * @param values 如果hql有多个个参数需要传入,values就是传入hql的参数数组
    * @param offset 第一条记录索引
    * @param pageSize 每页需要显示的记录数
    * @return 当前页的所有记录
    */
    public List findByPage(final String hql, final Object[] values,
        final int offset, final int pageSize)
    {
        //通过一个HibernateCallback对象来执行查询
        List list = getHibernateTemplate()
            .executeFind(new HibernateCallback()
        {
            //实现HibernateCallback接口必须实现的方法
            public Object doInHibernate(Session session)
                throws HibernateException, SQLException
            {
                //执行Hibernate分页查询
                Query query = session.createQuery(hql);
                //为hql语句传入参数
                for (int i = 0 ; i < values.length ; i++)
                {
                    query.setParameter( i, values[i]);
                }
                List result = query.setFirstResult(offset)
                    .setMaxResults(pageSize)
                    .list();
                return result;
            }
        });
        return list;
    }
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/J2EEWEIWEI/archive/2009/08/01/4399671.aspx

分享到:
评论

相关推荐

    hibernate2.1

    Hibernate 2.1 是一个历史悠久的Java对象关系映射(ORM)框架,它允许开发者将数据库操作转换为对Java对象的操作,...虽然Hibernate 2.1相对较旧,但理解其基本原理对于理解现代版本的Hibernate(如5.x)仍然很有帮助。

    Hibernate Quickly 源代码

    9. Callback事件:Hibernate支持在对象生命周期中的特定时刻触发回调方法,如预加载、加载、保存、更新和删除。源码中可能包含这些事件的监听器实现。 通过深入研究《Hibernate Quickly 源代码》,开发者可以全面...

    hibernate-3.2源码包

    通过深入学习和分析 Hibernate 3.2 的源代码,开发者可以更全面地理解其内部工作原理,从而更好地利用这个强大的工具,提高开发效率,减少数据库操作的复杂度。源码包中的内容包括了核心库、示例项目、文档等,为...

    hibernate中文文档

    这个“hibernate中文文档”压缩包包含的是Hibernate框架的中文版API文档,对于学习和理解Hibernate的各种功能和用法有着重要的参考价值。 在Hibernate中,主要涉及以下几个核心概念: 1. **实体(Entities)**:在...

    hibernate需要用到的core及annotations jar包

    7. Callback事件: Hibernate允许在特定操作前后触发回调方法,如预加载(PreLoad)、加载(Load)、预更新(PreUpdate)、更新(Update)、预删除(PreDelete)和删除(Delete)。开发者可以通过实现这些回调接口...

    hibernate教材

    本教程将深入讲解Hibernate的核心概念和技术,帮助开发者更好地理解和运用这个强大的工具。 一、Hibernate 概述 Hibernate 是Java开发中的一个持久化框架,它允许开发者用面向对象的方式处理数据库操作,将Java对象...

    Hibernate中的sessionFactory

    在Java的持久化框架Hibernate中,`SessionFactory`是核心组件之一,它扮演着数据库会话的工厂角色。SessionFactory是通过`Configuration`接口配置并初始化的,这个...理解并熟练运用这些接口,是掌握Hibernate的关键。

    Hibernate 参考实例

    10. **Callback事件处理**: Hibernate 提供了一些预定义的生命周期回调方法,如`@PrePersist`, `@PostLoad`等,可以在对象的生命周期中的特定时刻执行自定义逻辑。 在"Hibernate Example-1"中,你可以找到一个具体...

    hibernate-3.4.0

    《深入探索Hibernate 3.4.0:一个经典持久化框架的解析》 Hibernate,作为Java领域中的一个著名...对于Java开发者来说,掌握Hibernate不仅能够提升开发效率,也有助于深入理解面向对象编程与关系型数据库的融合之道。

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day03

    7. 深入理解Callback事件:Hibernate支持在特定生命周期阶段触发回调方法,如预加载、加载、持久化、更新、删除等,通过这些回调,开发者可以进行额外的业务逻辑处理。 8. 性能优化:学习如何通过批处理、缓存、...

    hibernate annotations 3.4.0.GA API

    《Hibernate Annotations 3.4.0.GA API详解》 Hibernate是Java开发中广泛使用的对象关系映射...深入理解Hibernate Annotations,不仅可以提高开发效率,还能帮助我们更好地管理和维护数据库与Java对象之间的映射关系。

    Hibernate使用技巧共2页.pdf.zip

    6. **事务管理**:Hibernate支持编程式和声明式的事务管理,理解何时及如何使用事务对于数据一致性至关重要。 7. **关联映射**:包括一对一、一对多、多对一、多对多等各种关联关系的映射,以及懒加载和立即加载...

    Hibernate3.2API文档

    Hibernate 3.2 API 文档是开发者们学习和使用 Hibernate 框架的重要参考资料,它详细阐述了该...通过深入学习 Hibernate 3.2 API 文档,开发者能够更好地理解和掌握这个强大的 ORM 框架,从而提升开发效率和代码质量。

    hibernate API

    这个“hibernate API”压缩包文件包含的是Hibernate的英文帮助文档,对于Java开发者尤其是初学者来说,是深入理解和使用Hibernate的重要参考资料。 Hibernate的核心功能在于ORM(Object-Relational Mapping),即...

    Hibernate学习代码(最经典)

    11. **Callback事件**:Hibernate支持在特定操作前后触发回调方法,如`@PrePersist`、`@PostPersist`等,开发者可以通过这些接口实现自定义逻辑。 通过《Hibernate学习代码(最经典)》中的示例,学习者可以动手实践...

    hibernate-3.3.2.API帮助HTML版本

    《Hibernate 3.3.2 API 帮助HTML版本详解》 Hibernate,作为一个流行的Java对象关系映射(ORM)框架,为开发者提供了强大的数据...对于任何Java开发者而言,理解和掌握Hibernate都是提升开发技能不可或缺的一部分。

    hibernate3源码

    这个压缩包文件包含了Hibernate3的源代码,对于深入理解其内部工作原理、优化性能以及自定义扩展有着极大的帮助。以下是关于Hibernate3的一些关键知识点: 1. **对象关系映射(ORM)**:Hibernate3是ORM的一种实现...

    Hibernate3[1].2_en 英文API

    《Hibernate3[1].2_en 英文API》是一个针对Hibernate3.1.2版本的英文官方文档,它是Java开发者的重要参考资料,特别是对于那些正在学习或已经在项目中使用Hibernate框架的人来说。Hibernate是一个开源的对象关系映射...

    Hibernate API

    对于Java开发者来说,深入理解Hibernate API是构建高效、可维护的持久层代码的关键。 **1. Hibernate核心概念** - **对象关系映射(ORM)**: ORM是将数据库表映射为Java类,通过对象的方式来操作数据,避免了直接...

    Hibernate培训教程.doc

    【Hibernate培训教程】 ...本教程旨在帮助开发者深入理解和掌握Hibernate,通过实践操作,可以提升数据库操作的效率,降低维护成本。学习Hibernate不仅能够提高开发速度,还能让代码更加简洁、易于维护。

Global site tag (gtag.js) - Google Analytics