偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Hibernate過(guò)濾器的高級(jí)應(yīng)用

開(kāi)發(fā) 后端
Hibernate過(guò)濾器的優(yōu)勢(shì)就在于可以隨時(shí)在程序中關(guān)閉或打開(kāi),也就是說(shuō)過(guò)濾器是可編程的,而且過(guò)濾器被定義在Hibernate的映射文件中,這樣將非常容易維護(hù)。

  在這種情況下,我們就需要使用Hibernate的過(guò)濾器(Filter)來(lái)得到一個(gè)數(shù)據(jù)字集。Hibernate過(guò)濾器的主要作用是限制我們的應(yīng)用程序的查詢(xún)數(shù)據(jù)。這個(gè)過(guò)濾器的概念并不是什么新概念,如數(shù)據(jù)庫(kù)的視圖也屬于過(guò)濾器范疇。而Hibernate為我們提供的過(guò)濾器是在一個(gè)抽象的層次,它可以做到和不依賴(lài)于數(shù)據(jù)庫(kù)的類(lèi)型,使數(shù)據(jù)訪問(wèn)層只面對(duì)一個(gè)解決方案,那就是Hibernate Filter。當(dāng)然,直接在數(shù)據(jù)庫(kù)中建立視圖也算一種解決方案,但這樣做太不靈活。而Hibernate過(guò)濾器卻能夠在Hibernate會(huì)話(huà)的過(guò)程中打開(kāi)或關(guān)閉。另外,另外,Hibernate過(guò)濾器可以傳遞參數(shù),這樣將大大增加Hibernate的靈活性。雖然Hibernate2也提供了過(guò)濾器,但Hibernate3.x提供了一種全新的過(guò)濾器。

  Hibernate3的過(guò)濾器可以進(jìn)行預(yù)定義,并可綁定在類(lèi)和集合層。那么什么叫預(yù)定義過(guò)濾器呢?就是可以定義象"where"子句的限制性子句,但這些子句是相對(duì)類(lèi)和不同集合的元素的。除了這些過(guò)濾器條件可以被參數(shù)化外。系統(tǒng)還能決定在運(yùn)行是指定的過(guò)濾器是否應(yīng)該被打開(kāi)以及什么值被傳入過(guò)濾器參數(shù)。

  一、什么時(shí)候使用過(guò)濾器

  為了解釋為什么使用過(guò)濾器,下面讓我們先來(lái)看一個(gè)例子。假設(shè)有一個(gè)管理用戶(hù)信息的Web應(yīng)用程序。在當(dāng)前狀態(tài),我們的應(yīng)用程序使用同一個(gè)應(yīng)用接口來(lái)處理所有的用戶(hù)信息。但如果最終用戶(hù)要求將活動(dòng)用戶(hù)和過(guò)期用戶(hù)分開(kāi)管理。這些狀態(tài)信息被保存在用戶(hù)表的某一列中。對(duì)于這種需求,我們最容易想到的一個(gè)解決方案是重新寫(xiě)每一個(gè)SELECT HQL查詢(xún)語(yǔ)句,也就是在每一個(gè)HQL后加一個(gè)WHERE條件來(lái)過(guò)濾這些數(shù)據(jù)。當(dāng)然,這種方法的復(fù)雜程序取決于你的Web程序是如何建立的,可以很簡(jiǎn)單,也可以很復(fù)雜。但不管是簡(jiǎn)單還是復(fù)雜,都必須得修改我們?cè)?jīng)測(cè)試過(guò)的代碼,這將給我們的程序帶來(lái)非常大的隱患。而使用Hibernate3.x,將會(huì)給我們帶來(lái)另外一個(gè)解決方案。我們將會(huì)為應(yīng)用程序的用戶(hù)狀態(tài)創(chuàng)建一個(gè)過(guò)濾器。當(dāng)用戶(hù)選擇用戶(hù)的狀態(tài)時(shí)(活動(dòng)或過(guò)期),應(yīng)用程序?qū)⒓せ町?dāng)前Hibernate會(huì)話(huà)的用戶(hù)狀態(tài)過(guò)濾器。這樣以來(lái),所有的SELECT HQL查詢(xún)將返回查詢(xún)結(jié)果的子集,而我們只需要在Hibernate會(huì)話(huà)狀態(tài)和用戶(hù)狀態(tài)過(guò)濾器兩個(gè)地方添加代碼,并不需要修改原先的代碼。

  從概念上講,你可以使用WHERE子句在應(yīng)用程序中完成和Hibernate過(guò)濾器同樣的工作。當(dāng)然,我們還可以在數(shù)據(jù)庫(kù)中建立視圖來(lái)完成同樣的工作(但所使用的數(shù)據(jù)庫(kù)必須支持視圖功能)。這三種解決方案都可以通過(guò)一個(gè)或多個(gè)查詢(xún)條件來(lái)限制最終結(jié)果。而Hibernate過(guò)濾器的優(yōu)勢(shì)就在于可以隨時(shí)在程序中關(guān)閉或打開(kāi),也就是說(shuō)過(guò)濾器是可編程的,而且過(guò)濾器被定義在Hibernate的映射文件中,這樣將非常容易維護(hù)。當(dāng)然,過(guò)濾器也有不足的地方,主要的不足就是在運(yùn)行時(shí)無(wú)法創(chuàng)建新的過(guò)濾器。而程序在運(yùn)行時(shí),所有的過(guò)濾器必須要在映射文件中被指定。雖然這將大大限制過(guò)濾器的靈活性,但過(guò)濾器支持參數(shù)化。對(duì)于本文的例子,我們可以在映射文件中指定保存用戶(hù)狀態(tài)信息的列。我們不需要在映射文件中指定可能的狀態(tài)值,這些在程序運(yùn)行時(shí)都可以指定。接下來(lái)我們就來(lái)看看如何使用Hibernate3.x中的過(guò)濾器來(lái)寫(xiě)程序。

  二、Hibernate過(guò)濾器的配置

  為了使用過(guò)濾器,它們需要首先被定義,然后和響應(yīng)的元素綁定。為了定義一個(gè)過(guò)濾器,我們將使用中的元素來(lái)定義Hibernate過(guò)濾器。如下所示:


 

  然后我們將這個(gè)過(guò)濾器附著在一個(gè)類(lèi)上,如下所示:


 ...
 

  或附著在一個(gè)集合上。


 

  當(dāng)然,我們也可以?xún)烧呓杂小?BR>
  三、Hibernate過(guò)濾器的用法

  為了支持新過(guò)濾器,Hibernate3.x中新添加了一個(gè)接口:org.hibernate.Filter,以及在org.hibernate.Session中加入了一些新方法。在Session中的新方法有:enableFilter(String filterName), getEnabledFilter(String filterName),以及disableFilter(String filterName)。在默認(rèn)性況下,對(duì)于當(dāng)前的會(huì)話(huà),過(guò)濾器是關(guān)閉的。它們必須使用Session的enableFilter()方法來(lái)顯式地打開(kāi)過(guò)濾器。這個(gè)方法返回一個(gè)新過(guò)濾器的實(shí)例。按著上述的做法,我們可以用如下的代碼打開(kāi)過(guò)濾器:

session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");

  過(guò)濾大數(shù)據(jù)集

  對(duì)于Hibernate3.x以前的版本,處理大數(shù)據(jù)集必須要使用大量的代碼。為了達(dá)到目的,必須先將整個(gè)數(shù)據(jù)集裝到內(nèi)存中,然后對(duì)這個(gè)數(shù)據(jù)集使用Session的filter()方法來(lái)過(guò)濾。而且當(dāng)過(guò)濾實(shí)體時(shí),我們必須手工寫(xiě)全部的HQL或一個(gè)定制的攔截器。

  而在Hibernate3.x中提供了一種更簡(jiǎn)捷,更一致的方法來(lái)過(guò)濾數(shù)據(jù)。Hibernate設(shè)計(jì)街頭團(tuán)隊(duì)想用一個(gè)更有效的特性來(lái)處理每一件事,無(wú)論它們是國(guó)際化的還是本地?cái)?shù)據(jù),或是為了安全考慮以及其他的事?,F(xiàn)在讓我們看一個(gè)例子來(lái)解釋這一切。
  四、實(shí)例

  1. 一個(gè)過(guò)濾數(shù)據(jù)的例子

  現(xiàn)在假設(shè)有一個(gè)實(shí)體,這個(gè)實(shí)體跟著“有效的記錄”數(shù)據(jù)庫(kù)模式。這個(gè)實(shí)體有多個(gè)行,每一行都根據(jù)日期不同而不同,也就是說(shuō)在日期范圍內(nèi)是有效的。一個(gè)employment記錄將是一個(gè)非常好的例子,因?yàn)閑mployees可以來(lái)或去或再回來(lái)。現(xiàn)在我們開(kāi)發(fā)一個(gè)帶UI的程序,這個(gè)程序需要處理employment數(shù)據(jù)的當(dāng)前記錄。為了使用新的過(guò)濾器特性達(dá)到這個(gè)目的。我們首先需要定義這個(gè)過(guò)濾器,然后將它附著在Employee類(lèi)上。


 



 ...
 
 
 
 ...
 



 ...
 
  
  
  
 


  然后,為了保證總是加在到當(dāng)前的有效記錄。只要簡(jiǎn)單地將Hibernate過(guò)濾器打開(kāi)即可,代碼如下:

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中,即使我們只給出一個(gè)salary約束條件,由于我們已經(jīng)打開(kāi)發(fā)過(guò)濾器,也只會(huì)得到當(dāng)前活動(dòng)的比一百萬(wàn)多的雇員。

  2. 安全的實(shí)例

  假設(shè)我們有一個(gè)應(yīng)用程序,這個(gè)程序給每一個(gè)用戶(hù)分配一個(gè)訪問(wèn)權(quán)限。在這其間,系統(tǒng)中一些敏感的實(shí)體被分配給了某些訪問(wèn)層次。因此,一個(gè)用戶(hù)在它所屬的訪問(wèn)層中應(yīng)該可以看到更多的東西。在本例子中我們就要通過(guò)過(guò)濾器來(lái)過(guò)濾某一個(gè)訪問(wèn)層次中的實(shí)體。下面讓我們來(lái)定義過(guò)濾器。


 



 ...
 
 
  
  
 

 
 ...
 = access_lvl]]>



...

 
 
 = access_lvl]]>

...

  接下來(lái),讓我們來(lái)打開(kāi)過(guò)濾器。

User user = ...;
Session session = ...;
session.enableFilter("accessLevel").setParameter("userLevel", user.getAccessLevel());

  下面的代碼是一個(gè)正在裝載的區(qū)域,它將過(guò)濾當(dāng)前用戶(hù)訪問(wèn)層的集合以得到一個(gè)子集。

Region region = (Region) session.get(Region.class, "EMEA");
region.getOpportunities().size();

  四、結(jié)論

  本文簡(jiǎn)單介紹了Hibernate過(guò)濾器的使用方法,并給出了一些實(shí)例。雖然這些例子很簡(jiǎn)單,但卻使我們對(duì)Hibernate過(guò)濾器的強(qiáng)大有了更深的認(rèn)識(shí)。我們通過(guò)上面的例子也許會(huì)有更多好的想法,如果能將它們和不同的攔截方法,如Web過(guò)濾器結(jié)合,將會(huì)發(fā)揮出更大的力量。

【編輯推薦】

  1. 責(zé)任編輯:王觀 來(lái)源: 天極網(wǎng)
相關(guān)推薦

2009-09-29 13:55:23

Hibernate設(shè)置

2009-09-25 15:19:44

Hibernate過(guò)濾

2021-07-05 15:22:03

Servlet過(guò)濾器客戶(hù)端

2024-01-05 09:04:35

隆過(guò)濾器數(shù)據(jù)結(jié)構(gòu)哈希函數(shù)

2009-07-08 17:33:37

Servlet過(guò)濾器

2009-07-08 15:30:56

Servlet過(guò)濾器

2009-07-08 16:07:04

Servlet過(guò)濾器配

2009-07-14 09:09:08

Swing模型過(guò)濾器

2011-06-29 16:14:59

Qt 事件 過(guò)濾器

2024-11-04 08:45:48

布隆過(guò)濾器元數(shù)據(jù)指紋值

2021-01-14 08:13:39

Spring Clou應(yīng)用內(nèi)置過(guò)濾器

2016-12-07 09:56:13

JavaFilter過(guò)濾器

2017-07-18 14:10:31

大數(shù)據(jù)Apache Flum過(guò)濾器

2025-04-21 00:50:50

2015-10-14 13:58:03

2009-07-03 18:26:11

Servlet過(guò)濾器

2017-04-12 14:43:01

Spring ClouZuul過(guò)濾器

2023-01-26 01:41:27

核心全局過(guò)濾器

2024-03-15 11:21:22

布隆過(guò)濾器數(shù)據(jù)庫(kù)數(shù)據(jù)

2009-07-06 13:02:49

Servlet過(guò)濾器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)