咨询热线:0791-87557233
 您现在的位置:  首页 > Java框架 

Hibernate3.x过滤器的高级应用

来源:网络    更新时间:2014-12-16


  在很多应用程序中不需要一次使用数据表中的所有的数据。在这种情况下,我们就需要使用Hibernate的过滤器(Filter)来得到一个数据字集。过滤器的主要作用是限制我们的应用程序的查询数据。这个过滤器的概念并不是什么新概念,如数据库的视图也属于过滤器范畴。而Hibernate为我们提供的过滤器是在一个抽象的层次,它可以做到和不依赖于数据库的类型,使数据访问层只面对一个解决方案,那就是HibernateFilter。当然,直接在数据库中建立视图也算一种解决方案,但这样做太不灵活。而Hibernate过滤器却能够在Hibernate会话的过程中打开或关闭。另外,另外,Hibernate过滤器可以传递参数,这样将大大增加Hibernate的灵活性。虽然Hibernate2也提供了过滤器,但Hibernate3.x提供了一种全新的过滤器。

  Hibernate3的过滤器可以进行预定义,并可绑定在类和集合层。那么什么叫预定义过滤器呢?就是可以定义象"where"子句的限制性子句,但这些子句是相对类和不同集合的元素的。除了这些过滤器条件可以被参数化外。系统还能决定在运行是指定的过滤器是否应该被打开以及什么值被传入过滤器参数。

  一、什么时候使用过滤器

  为了解释为什么使用过滤器,下面让我们先来看一个例子。假设有一个管理用户信息的Web应用程序。在当前状态,我们的应用程序使用同一个应用接口来处理所有的用户信息。但如果最终用户要求将活动用户和过期用户分开管理。这些状态信息被保存在用户表的某一列中。对于这种需求,我们最容易想到的一个解决方案是重新写每一个SELECTHQL查询语句,也就是在每一个HQL后加一个WHERE条件来过滤这些数据。当然,这种方法的复杂程序取决于你的Web程序是如何建立的,可以很简单,也可以很复杂。但不管是简单还是复杂,都必须得修改我们曾经测试过的代码,这将给我们的程序带来非常大的隐患。而使用Hibernate3.x,将会给我们带来另外一个解决方案。我们将会为应用程序的用户状态创建一个过滤器。当用户选择用户的状态时(活动或过期),应用程序将激活当前Hibernate会话的用户状态过滤器。这样以来,所有的SELECTHQL查询将返回查询结果的子集,而我们只需要在Hibernate会话状态和用户状态过滤器两个地方添加代码,并不需要修改原先的代码。

  从概念上讲,你可以使用WHERE子句在应用程序中完成和Hibernate过滤器同样的工作。当然,我们还可以在数据库中建立视图来完成同样的工作(但所使用的数据库必须支持视图功能)。这三种解决方案都可以通过一个或多个查询条件来限制最终结果。而Hibernate过滤器的优势就在于可以随时在程序中关闭或打开,也就是说过滤器是可编程的,而且过滤器被定义在Hibernate的映射文件中,这样将非常容易维护。当然,过滤器也有不足的地方,主要的不足就是在运行时无法创建新的过滤器。而程序在运行时,所有的过滤器必须要在映射文件中被指定。虽然这将大大限制过滤器的灵活性,但过滤器支持参数化。对于本文的例子,我们可以在映射文件中指定保存用户状态信息的列。我们不需要在映射文件中指定可能的状态值,这些在程序运行时都可以指定。接下来我们就来看看如何使用Hibernate3.x中的过滤器来写程序。

二、过滤器的配置

  为了使用过滤器,它们需要首先被定义,然后和响应的元素绑定。为了定义一个过滤器,我们将使用<Hibernate-mapping/>中的<filter-def/>元素来定义Hibernate过滤器。如下所示:

<filter-defname="myFilter">
 <filter-paramname="myFiltERParam"type="string"/>
</filter-def>
  然后我们将这个过滤器附着在一个类上,如下所示:

<classname="myClass"...>
 ...
 <filtername="myFilter"condition=":myFilterParam=my_filtered_column"/>

  • 上一篇文章:

  • 下一篇文章:
  •  

    0791-87557233

    重视每个来电 珍惜您的时间
    思诚者开发沙龙
    江西思诚科技有限公司      赣ICP备17006097号  CopyRight©2014 - 2017