`

Hibernate过滤器的高级应用

    博客分类:
  • Java
阅读更多
FROM:http://developer.51cto.com/art/200906/129972.htm
Hibernate过滤器的优势就在于可以随时在程序中关闭或打开,也就是说过滤器是可编程的,而且过滤器被定义在Hibernate的映射文件中,这样将非常容易维护。
在这种情况下,我们就需要使用Hibernate的过滤器(Filter)来得到一个数据字集。Hibernate过滤器的主要作用是限制我们的应用程序的查询数据。这个过滤器的概念并不是什么新概念,如数据库的视图也属于过滤器范畴。而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过滤器的配置
为了使用过滤器,它们需要首先被定义,然后和响应的元素绑定。为了定义一个过滤器,我们将使用中的元素来定义Hibernate过滤器。如下所示:

 


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

 ...
 


或附着在一个集合上。

 


当然,我们也可以两者皆有。
三、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类上。

 


 ...
 
 
 
 ...
 


 ...
 



 


然后,为了保证总是加在到当前的有效记录。只要简单地将Hibernate过滤器打开即可,代码如下:
Session session = ...;
session.enabledFilter("effectiveDate").setParameter("asOfDate", new Date());
List results = session.createQuery("from Employee as e where e.salary > :targetSalary")
.setLong("targetSalary", new Long(1000000))
.list();

在上面的HQL中,即使我们只给出一个salary约束条件,由于我们已经打开发过滤器,也只会得到当前活动的比一百万多的雇员。
2. 安全的实例
假设我们有一个应用程序,这个程序给每一个用户分配一个访问权限。在这其间,系统中一些敏感的实体被分配给了某些访问层次。因此,一个用户在它所属的访问层中应该可以看到更多的东西。在本例子中我们就要通过过滤器来过滤某一个访问层次中的实体。下面让我们来定义过滤器。

 


 ...
 
 


 
 
 ...
 = access_lvl]]>


...

 
 
 = access_lvl]]>

...


接下来,让我们来打开过滤器。
User user = ...;
Session session = ...;
session.enableFilter("accessLevel").setParameter("userLevel", user.getAccessLevel());

下面的代码是一个正在装载的区域,它将过滤当前用户访问层的集合以得到一个子集。
Region region = (Region) session.get(Region.class, "EMEA");
region.getOpportunities().size();

四、结论
本文简单介绍了Hibernate过滤器的使用方法,并给出了一些实例。虽然这些例子很简单,但却使我们对Hibernate过滤器的强大有了更深的认识。我们通过上面的例子也许会有更多好的想法,如果能将它们和不同的拦截方法,如Web过滤器结合,将会发挥出更大的力量。
分享到:
评论

相关推荐

    Hibernate 3.x过滤器的高级应用

    在Java的持久化框架Hibernate 3.x中,过滤器(Filter)是一种强大的工具,它允许开发者在不修改原有代码的情况下,动态地限制查询结果。过滤器的概念与数据库的视图类似,但提供了一种更抽象、更灵活的解决方案,...

    hibernate-ext:用于为对话模式中的开放会话创建动态Hibernate过滤器和扩展的项目

    本文将重点探讨一个名为"hibernate-ext"的项目,它专门用于为对话模式中的开放会话创建动态Hibernate过滤器,并提供了其他扩展功能。 一、Hibernate扩展概述 Hibernate扩展是针对原生Hibernate框架的功能增强,它...

    Beginning Hibernate, 3rd Edition

    - **过滤器应用实例**:提供了具体的代码示例,演示如何应用过滤器。 #### 十三、超越关系型数据库:NoSQL 支持 - **NoSQL 概念**:简要介绍了 NoSQL 数据库的特点及应用场景。 - **Hibernate 对 NoSQL 的支持**:...

    深入学习hibernate

    文章涵盖了Hibernate的核心接口与类、标识符生成策略、对象生命周期管理、OSIV(Open Session In View)模式、泛型DAO...过滤器、数据拦截与事件监听、缓存机制、性能优化、Hibernate Annotations、Hibernate Search...

    Hibernate Search in Action

    5. **高级主题**:包括在集群环境中部署Hibernate Search、与现有应用程序功能的集成等内容。 - **集群部署**:如何将Hibernate Search部署到多节点环境以提高可用性和扩展性。 - **功能集成**:如何将搜索功能与...

    Hibernate学习.pdf

    - **“全面解决”的体系结构方案**: 适合大型复杂的应用程序,提供了更高级的功能和服务。 - **概念**: Hibernate的设计遵循面向对象的思想,将实体对象和数据库之间的转换封装在内部。 #### 3. 持久化类...

    hibernate_search.pdf

    - **过滤器**:基于预定义条件筛选查询结果。 - **优化查询过程**:减少查询延迟,提高响应速度。 - **原生Lucene查询**:直接使用Lucene API进行查询,适用于高级搜索场景。 #### 6. 手动索引(Manual indexing) ...

    Hibernate+中文文档

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

    hibernate-search-5.5.4 api docset for Dash

    3. **全文检索**:Hibernate Search支持对数据库中的文本字段进行全文检索,包括模糊匹配、近似搜索、短语搜索等高级查询。 4. **倒排索引**:Lucene采用倒排索引来加速搜索,每个单词都指向包含该词的文档列表,...

    Hibernate3.5官方开发文档pdf + html

    15. **扩展性与插件**:了解Hibernate的可扩展性,如拦截器(Interceptors)、过滤器(Filters)以及第三方插件如Hibernate Search(全文检索)。 这些知识点覆盖了Hibernate 3.5的核心功能,开发者可以通过官方...

    基于Spring的Hibernate Search全文检索功能示例

    Spring框架是Java领域最广泛使用的应用框架,而Hibernate则是流行的ORM(对象关系映射)解决方案。当这两个强大的工具结合,通过Hibernate Search模块,我们可以实现高效、灵活的全文检索功能。本示例将详细介绍如何...

    hibernate3.6中文手册

    9. **其他高级特性**:涵盖了如查询缓存、事件监听器、过滤器、子查询等高级特性,帮助开发者深入挖掘Hibernate的潜力。 10. **实例分析**:手册通常会包含大量示例代码,通过实际应用场景的演示,帮助读者理解并...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到...

    Hibernate 中文手册 3.1.2.pdf

    由于 Hibernate 的高度可配置性,它允许开发者根据不同的需求来定制其行为,例如通过拦截器(Interceptors)来改变对象状态的持久化行为,通过监听器(Listeners)来响应持久化事件,以及通过过滤器(Filters)来对...

    JavaWeb-Hibernate-Struts2-Spring2

    过滤器和监听器则能帮助我们进行请求处理前后的预处理和后处理,以及监控应用程序的特定事件。 压缩包中的文件名表明,教程涵盖了这些技术的中文详解: - **Struts2.0中文教程.chm**:这个文件很可能是关于Struts2...

    hibernate学习文档

    Hibernate 是一款开源的对象关系映射 (Object Relational Mapping, ORM) 框架,它能够将 Java 应用程序中的对象模型与数据库的关系模型进行映射,使得开发人员能够通过操作 Java 对象的方式对数据库进行读写操作,而...

    hibernate3.2中文文档(chm格式)

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

    HibernateAPI中文版.chm

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

Global site tag (gtag.js) - Google Analytics