快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

葡京娱乐场的官网:Hibernate3.x过滤器中的高级应用



在很多利用法度榜样中不必要一次应用数据表中的所有的数据。在这种环境下,我们就必要应用Hibernate的过滤器(Filter)来获得一个数据字集。过滤器的主要感化是限定我们的利用法度榜葡京娱乐场的官网样的查询数据。这个过滤器的观点并不是什么新观点,如数据库的视图也属于过滤器范畴。而Hibernate为我们供给的过滤器是在一个抽象的层次,它可以做到和不依附于数据库的类型,使数据造访层只面对一个办理规划,那便是Hibernate Filter。当然,直接在数据库中建立视图也算一种办理规划,但这样做太不机动。而Hibernate过滤器却能够在Hibernate会话的葡京娱乐场的官网历程中打开或关闭。别的,别的,Hibernate过滤器可以通报参数,这样将大年夜大年夜增添Hibernate的机动性。虽然Hibernate2也供给了过滤器,但Hibernate3.x供给了一种全新的过滤器。

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

一、什么时刻应用过滤器

为相识释为什么应用过滤器,下面让我们先来看一个例子。假设有一个治理用户信息的Web利用法度榜样。在当前状态,我们的利用法度榜样应用同一个利用接口来处置惩罚所有的用户信息。但假如终极用户要求将活动用户和过时用户分开治理。这些状态信息被保存在用户表的某一列中。对付这种需求,我们最轻易想到的一个办理规划是从新写每一个SELECT HQL查询语句,也便是在每一个HQL后加一个WHERE前提来过滤这些数据。当然,这种措施的繁杂法度榜样取决于你的Web法度榜样是若何建立的,可以很简单,也可以很繁杂。但不管是简单照样繁杂,都必须得改动我们曾经测试过的葡京娱乐场的官网代码,这将给我们的法度榜样带来异常大年夜的隐患。而应用Hibernate3.x,将会给我们带来别的一个办理规划。我们将会为利用法度榜样的用户状态创建一个过滤器。当用户选择用户的状态时(活动或过时),利用法度榜样将激活当前Hibernate会话的用户状态过滤器。这样以来,所有的SELECT HQL查询将返回查询结果的子集,而我们只必要在Hibernate会话状态和用户状态过滤器两个地方添加代码,并不必要改动本来的代码。

从观点上讲,你可以应用WHERE子句在利用法度榜样中完成和Hibernate过滤器同样的事情。当然,我们还可以在数据库中建立视图来完成同样的事情(但所应用的数据库必须支持视图功能)。这三种办理规划都可以经由过程一个或多个查询前提来限定最遣散果。而Hibernate过滤器的上风就在于可以随时在法度榜样中关闭或打开,也便是说过滤器是可编程的,而且过滤器被定义在Hibernate的映射文件中,这样将异常轻易掩护。当然,过滤器也有不够的地方,主要的不够便是在运行时无法创建新的过滤器。而法度榜样在运行时,所有的过滤器必须要在映射文件中被指定。虽然这将大年夜大年夜限定过滤器的机动性,但过滤器支持参数化。对付本文葡京娱乐场的官网的例子,我们可以在映射文件中指定保存用户状态信息的列。我们不必要在映射文件中指定可能的状态值,这些在法度榜样运行时都可以指定。接下来我们就来看看若何应用Hibernate3.x中的过滤器来写法度榜样。

二、过滤器的设置设置设备摆设摆设

为了应用过滤器,它们必要首先被定义,然后和相应的元素绑定。为了定义一个过滤器,我们将应用中的元向来定义Hibernate过滤器。如下所示:

然后我们将这个过滤器附着在一个类上,如下所示:

...

或附着在一个聚拢上。

当然,我们也可以两者皆有。

三、过滤器的用法

为了支持新过滤器,Hibernate3.x中新添加了一个接口:org.hibernate.Filter,以及在org.hibernate.Session中加入了一些新措施。在Session中的新措施有:enableFilter(String filterName), getEnabledFilter(String filterName),以及disableFilter(String filterName)。在默认性况下,对付当前的会话,过滤器是关闭的。它们必须应用Session的enableFilter()措施来显式地打开过滤器。这个措施返回一个新过滤器的实例。按着上述的做法,我们可以用如下的代码打开过滤器:

session.enableFilter("myFilter").setParameter("葡京娱乐场的官网myFilterParam", "some-value");

过滤大年夜数据集

对付Hibernate3.x曩昔的版本,处置惩罚大年夜数据集必须要应用大年夜量的代码。为了达到目的,必须先将全部数据集装到内存中,然后对这个数据集应用Session的filter()措施来过滤。而且当过滤实体时,我们必须手工写整个的HQL或一个定制的拦截器。

而在Hibernate3.x中供给了一种更简捷,更同等的措施来过滤数据。Hibernate设计街头团队想用一个更有效的特点来处置惩罚每一件事,无论它们是国际化的照样本地数据,或是为了安然斟酌以及其他的事。现在让我们看一个例子来解释这统统。

四、实例

1. 一个过滤数据的例子

现在假设有一个实体,这个实体随着“有效的记录”数据库模式。这个实体有多个行,每一行都根据日期不合而不合,也便是说在日期范围内是有效的。一个employment记录将是一个异常好的例子,由于employees可以来或去或再回来。现在我们开拓一个带UI的法度榜样,这个法度榜样必要处置惩罚employment数据确当前记录。为了应用新的过滤器特点达到这个目的。我们首先必要定义这个过滤器,然后将它附着在Employee类上。

...

...

...

然后,为了包管老是加在到当前的有效记录。只要简单地将过滤器打开即可,代码如下:

您可能还会对下面的文章感兴趣: