`
xbcoil
  • 浏览: 125940 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]Hibernate的复杂用法HibernateCallback

 
阅读更多

getHibernateTemplate已经封装好了一些基本的方法,可以直接去用,也就是template嘛, 
而getSession只是获取一个数据工厂的session,然后大部分方法都需要自己写,加hql语句,然后用query方法执行 

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

      Object execute(HibernateCallback action)

              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 int update(String hql) {

final String hql1 = hql; 

return ((Integer)getHibernateTemplate().execute(new HibernateCallback(){

public Object doInHibernate(Session session) throws HibernateException{

Query query = session.createQuery(hql1);

return query.executeUpdate();

}

})).intValue();

}

 

同样的,this.getSession() 也能执行灵活的sql,hql,那么为什么要用 HibernateCallback().?

 

1.this.getSession() 是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,它可以从当前事务或者一个新的事务获得一个hibernate session,需要程序维护session(手动关闭session) 
2.this.getHibernateTemplate().getSessionFactory().getCurrentSession()/openSession()则从spring中获取session 
getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。 
采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭 
3.通过new HibernateCallback(){XXX}获得的session是当前线程中的session 
4.hibernateTemplate会确保当前hibernate的session对象的正确打开和关闭,并直接参与到事物管理中去,template实例不仅是线程安全的同时也是可重用的 
5.不提倡用getSession()来获得session实现,因为这样拿到的session是hibernate最原始的session不享有spring提供的模板支持需要手动的关闭session,可以使用new HibernateCallback(){xxx}得到session 

分享到:
评论

相关推荐

    hibernate执行原生sql语句

    在上面的代码中,我们使用 `HibernateCallback` 接口来执行原生 SQL 语句,该接口提供了一个 `doInHibernate()` 方法,该方法将在 Hibernate 事务中执行。我们可以在该方法中执行原生 SQL 语句,并使用 `Connection`...

    第24次课-1 Spring与Hibernate的整合

    开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决了Spring封装Hibernate后灵活性不足的缺陷。 24.3 Spring对Hibernate的简化 24.3.4 HibernateTemplate的复杂用法 ...

    Hibernate方法总结

    总的来说,HibernateTemplate提供了一组强大的方法来简化Hibernate的日常操作,涵盖了从简单的数据存取到复杂的数据库操作,极大地提升了开发效率。在实际应用中,根据数据量、性能需求以及业务逻辑,选择合适的方法...

    对hibernate的封装 HibernateTemplate

    这个类将复杂的Hibernate API隐藏在后面,使得开发者可以更专注于业务逻辑,而不是数据库操作的细节。 **二、主要功能** 1. **事务管理**:HibernateTemplate自动管理Hibernate Session和Transaction,确保在事务...

    spring+hibernate详解

    本文详细介绍了Spring与Hibernate集成的过程,包括如何配置`SessionFactory`、使用`HibernateTemplate`简化数据操作、通过`HibernateDaoSupport`提高代码可维护性以及利用`HibernateCallback`实现更复杂的业务逻辑。...

    Hibernate学习笔记,使用Hibernate做数据层非常方便

    【Hibernate学习笔记,使用Hibernate做数据层非常方便】 在Java开发中,Hibernate是一个非常流行的ORM(Object-Relational Mapping)框架,它简化了数据库操作,将数据库中的表映射为Java对象,使得开发者可以像...

    struts2+spring+hibernate分页显示完整代码

    `queryForPage` 方法通过`getHibernateTemplate().executeFind()`方法执行HQL查询,并利用`HibernateCallback`接口回调来设置查询的起始位置和最大结果数,从而实现分页。`getAllRowCount` 方法则直接返回HQL查询后...

    HibernateS整合pring

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

    Spring整合hibernate

    例如,你可以通过实现HibernateCallback接口的doInHibernate方法,传入一个回调函数,执行特定的Hibernate操作。此外,HibernateTemplate会自动处理HibernateException,并将其转化为Spring的DataAccessException,...

    hibernate API

    虽然`HibernateTemplate`提供了很多便利,但它在处理复杂查询时可能需要创建内部类(inner class),如在分页查询时使用`execute(HibernateCallBack)`,这可能会增加调试的复杂性。相比之下,直接使用`Session`进行...

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

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

    HbernateTemplate的使用.pdf

    **二、Hibernate的复杂用法** 1. **HibernateCallback** HibernateTemplate支持`HibernateCallback`接口,允许在回调方法中执行自定义的Hibernate操作。这提供了一种方式在事务内部执行复杂操作,例如批量处理或...

    getHibernateTemplate

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

    SSH整合文档

    3. **使用HibernateCallback**: HibernateCallback是一个接口,可以在Session中执行回调方法,例如查询数据。 ```java HibernateCallback<List<Dept>> callback = new HibernateCallback<List<Dept>>() { @...

    Spring学习笔记

    - 接口注入:已逐渐淘汰,不推荐使用,因为它需要实现特定的接口,增加了复杂性。 6. bean中的scope属性: scope属性定义了bean的作用域,常见的有singleton(单例)、prototype(多例)等。单例模式下,Spring容器...

    常用的HQL语句下载

    另一种格式(第10-16行)展示了如何在一个匿名内部类中使用`HibernateCallback`接口执行删除操作,这种方式在处理更复杂的逻辑时更为灵活。 3. **HQL单表查询**: HQL可以轻松地执行针对单个表的查询。第19行的HQL...

    spring hibernatetemplate

    `HibernateCallback`的`doInHibernate`方法会在Hibernate的Session上下文中执行,使得开发者可以直接操作Session。 描述中的示例代码展示了如何使用`HibernateTemplate`执行事务操作。在这个例子中,开发者试图保存...

    HibernateTemplate分组统计

    ### HibernateTemplate 分组统计知识点详解 #### 一、概述 在Java Web开发中,尤其是在使用...这不仅有助于更好地理解和掌握Spring与Hibernate的集成方式,同时也为解决实际项目中的复杂数据处理问题提供了有效途径。

    Oracle存储过程

    如示例所示,通过`getHibernateTemplate().execute()`方法传递一个`HibernateCallback`,然后在回调方法中创建并执行`CallableStatement`。这使得在Java应用程序中直接调用数据库的存储过程成为可能,提高性能并简化...

    常用的HQL语句!!!!

    在实际开发中,开发者可以根据需求构建更复杂的查询,包括使用JOIN、GROUP BY、HAVING等子句,以及使用更复杂的查询构造。同时,需要注意的是,HQL执行时需要考虑事务管理,以确保数据的一致性和完整性。

Global site tag (gtag.js) - Google Analytics