`
yangmeng_3331
  • 浏览: 91685 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

[转]Hibernate的复杂用法HibernateCallback

阅读更多
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