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

Hibernate3支持DetachedCriteria 在spring上的应用

阅读更多
示例代码片段如下:

  web层程序构造查询条件:

  java代码:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); 
detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20))); 

Department和Employee是一对多关联,查询条件为:

  名称是“department”开发部门;
  部门里面的雇员年龄大于20岁;

  业务层对象使用该条件执行查询:

  java代码:
detachedCriteria.getExecutableCriteria(session).list();

  最大的意义在于,业务层代码是固定不变的,所有查询条件的构造都在web层完成,业务层只负责在session内执行之。这样代码就可放之四海而皆准,都无须修改了。

  然而Spring和Hibernate3的DetachedCriteria有不兼容的问题,因此在Spring环境下面使用Hibernate3需要注意: ()

  Spring的HibernateTemplate提供了Hibernate的完美封装,即通过匿名类实现回调,来保证Session的自动资源管理和事务的管理。其中核心方法是:

  java代码:
HibernateTemplate.execute(new HibernateCallback() {
 public Object doInHibernate(Session session) throws HibernateException {
  ....
 }
}
  回调方法提供了session作为参数,有了session,就可以自由的使用Hibernate API编程了。使用了spring的之后,代码修改如下:

  web层代码:

  java代码:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); 
detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20))); 
departmentManager.findByCriteria(detachedCriteria); 

构造detachedCriteria,作为参数传递给departmentManager

  业务层代码使用spring,DepartmentManager的findByCriteria如下:

  java代码:
public List findByCriteria(final DetachedCriteria detachedCriteria) { 
 return (List) getHibernateTemplate().execute(new HibernateCallback() { 
  public Object doInHibernate(Session session) throws HibernateException { 
   Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
   return criteria.list(); 
  } 
 }); 
} 

  实际上也就是:

  java代码:
Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
return criteria.list(); 

  而已

  但是该程序代码执行,会抛出强制类型转换异常!

  我跟踪了一下spring和Hibernate源代码,原因如下:

  spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数,但是实际上,默认情况下,HibernateTemplate传递给回调接口的session并不是org.hibernate.impl.SessionImpl类,而是SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类,HibernateTemplate的注释说明,Proxy提供了一些额外的功能,包括自动设置Cachable,Transaction的超时时间,Session资源的更积极的关闭等等。

  java代码:
private boolean exposeNativeSession = false;


execute方法内部:
Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session)); 



  但是遗憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl,但是spring传过来的却是一个Proxy类,因此就报错了。

  java代码:
public Criteria getExecutableCriteria(Session session) { 
 impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring传递的是Proxy 
 return impl; 
} 




  解决方法,禁止Spring的HibernateTemplate传递Proxy类,强制要求它传递真实的SessionImpl类,即给exexute方法增加一个参数,提供参数为true,如下:

  java代码:

public List findByCriteria(final DetachedCriteria detachedCriteria) { 
 return (List) getHibernateTemplate().execute(new HibernateCallback() { 
  public Object doInHibernate(Session session) throws HibernateException { 
   Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
   return criteria.list(); 
  } 
 }, true); 
} 

分享到:
评论
1 楼 javaSunStar 2013-04-14  
呵呵,木意思

相关推荐

    Hibernate - DetachedCriteria 的完整用法

    Hibernate 的 Criteria 和 DetachedCriteria 是两个不同的概念,虽然它们都是用于查询数据的,但它们在创建和使用上有所不同。 首先,Criteria 是在线的,需要通过 Hibernate Session 来创建,即使用 `session....

    struts2+spring+hibernate分页查询

    综上所述,Struts2、Spring和Hibernate的整合使得开发者能够便捷地实现分页查询,从而优化Web应用的性能和用户体验。在实际项目中,需要根据具体需求和业务场景,选择合适的分页策略和实现方式,同时注意性能优化和...

    hibernate3API

    - DetachedCriteria:支持离线查询,可以在不开启Session的情况下构造查询条件。 7. Criteria 查询示例 ```java Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.eq(...

    Hibernate_DEV_GUIDE

    Hibernate 是一款在Java开发领域广泛应用的持久化框架,它极大地简化了数据库与Java对象之间的交互,使得开发者可以更加专注于业务逻辑的实现,而非底层的数据库操作。结合Struts和Spring,Hibernate能构建出高度...

    hibernate in action 中文版书籍

    8. **Hibernate与其他技术的整合**:介绍Hibernate如何与Spring框架、EJB、Web应用等进行集成,以及在实际项目中的应用案例。 9. **高级特性**:涵盖动态模型、多态性、集合元素类型、子查询、联合实体、继承策略等...

    浅谈DetachedCriteria和Criteria的使用方法(必看)

    Spring框架对DetachedCriteria的支持: Spring框架提供了对离线查询的支持,非常简洁地使用DetachedCriteria。Spring框架提供了getHibernateTemplate().findByCriteria(detachedCriteria)方法,可以很方便地根据...

    孙卫琴 精通Hibernate.pdf

    10. **Hibernate与其他技术的整合**:如Spring框架与Hibernate的集成,以及在Web应用中的实际应用等。 通过《孙卫琴 精通Hibernate》,读者不仅能全面理解Hibernate的各个核心组件和使用技巧,还能掌握如何在实际...

    Hibernate 手册中文版chm格式

    5. Criteria API和DetachedCriteria:进一步深入,探讨如何使用Criteria API执行复杂的查询,并介绍DetachedCriteria,用于在不同会话间构建和执行查询。 6. Native SQL:当需要充分利用数据库特定特性时,可以使用...

    Hibernate

    12. ** Hibenate与Spring的整合**:介绍如何在Spring框架中集成Hibernate,利用Spring的事务管理,实现DAO和Service层的解耦。 13. **案例分析**:通过实际例子演示如何在项目中应用Hibernate,解决具体问题。 每...

    Hibernate框架知识点的练习代码

    通过分析并实践这些练习代码,你可以深入理解Hibernate的工作原理,提升在实际项目中的应用能力。同时,结合作者的博客,相信会对每个知识点有更清晰的理解。在实践中不断探索和学习,才能更好地掌握Hibernate这一...

    Hibernate的Criteria用法总结

    Criteria用于在线查询,直接与Hibernate Session关联,而DetachedCriteria则可在不依赖Session的情况下创建,适用于离线或延迟执行的查询。DetachedCriteria可以通过`forClass(Class)`或`forEntityName(String)`静态...

    DetachedCriteria Criteria 使用方法

    `DetachedCriteria` 提供了一种高效且灵活的方式来处理动态查询需求,特别是在多层架构的应用程序中,它能够显著降低各层之间的耦合度,提高代码的可维护性和扩展性。通过合理使用 `DetachedCriteria` 和 `...

    Hibernate全部笔记

    在实际项目中,结合Spring框架使用Hibernate,如Spring Data JPA,可以进一步简化开发,提供更多的自动化功能。 总之,Hibernate作为Java ORM框架的代表,为开发者提供了强大而灵活的数据持久化解决方案。掌握...

    hibernate中文帮助pdf

    1. **Hibernate概述**:Hibernate的核心理念、历史背景及其在Java应用中的重要性。它解释了如何通过ORM将Java对象与数据库表进行映射,从而实现数据的持久化。 2. **环境配置**:包括JDBC驱动、Hibernate库的引入、...

    Hibernate中Criteria的完整用法

    Spring 的框架提供了 getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据 DetachedCriteria 来返回查询结果。 Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置...

    Hibernate经典入门教程

    通过DetachedCriteria可以构建复杂的查询条件,然后在Session上执行。 七、事务处理 Hibernate支持编程式和声明式事务管理。编程式事务管理使用Transaction接口,而声明式事务管理常通过Spring框架实现。 八、性能...

    孙卫琴.精通Hibernate.zip

    最后,书中还涵盖了Hibernate的最新特性和一些高级主题,如Hibernate的事件监听器、动态模型以及与Spring框架的集成。这些内容为读者提供了进一步深入学习和应用Hibernate的路径。 总的来说,《孙卫琴.精通...

    hibernate学习资料

    在实际项目中,Hibernate广泛应用于企业级应用开发,如Web应用、B/S系统等。结合Spring框架,可以构建出高效、灵活的数据访问层。 通过深入学习《Hibernate Reference》和官方文档,你将能够熟练掌握Hibernate的...

    hibernate查询详解

    在实际应用中,开发者可以根据项目需求和团队习惯选择合适的查询方式。例如,对于简单的查询,HQL和Criteria查询可能更为合适;对于复杂的SQL操作,可能需要使用SQL查询;而对于需要复用的查询,命名查询则很有价值...

    hibernate-jar

    SessionFactory是线程安全的,一般在应用启动时创建并全局共享。 7. **Criteria查询**: Hibernate提供了一种强大的API,可以基于对象模型进行查询,无需编写SQL语句。通过Criteria、Projection和DetachedCriteria等...

Global site tag (gtag.js) - Google Analytics