成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hibernate過濾器的高級應用

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

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

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

  一、什么時候使用過濾器

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

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

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

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

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

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

  現(xiàn)在假設有一個實體,這個實體跟著“有效的記錄”數(shù)據(jù)庫模式。這個實體有多個行,每一行都根據(jù)日期不同而不同,也就是說在日期范圍內(nèi)是有效的。一個employment記錄將是一個非常好的例子,因為employees可以來或去或再回來。現(xiàn)在我們開發(fā)一個帶UI的程序,這個程序需要處理employment數(shù)據(jù)的當前記錄。為了使用新的過濾器特性達到這個目的。我們首先需要定義這個過濾器,然后將它附著在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約束條件,由于我們已經(jīng)打開發(fā)過濾器,也只會得到當前活動的比一百萬多的雇員。

  2. 安全的實例

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


 



 ...
 
 
  
  
 

 
 ...
 = access_lvl]]>



...

 
 
 = access_lvl]]>

...

  接下來,讓我們來打開過濾器。

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

  下面的代碼是一個正在裝載的區(qū)域,它將過濾當前用戶訪問層的集合以得到一個子集。

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

  四、結論

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

【編輯推薦】

  1. 責任編輯:王觀 來源: 天極網(wǎng)
相關推薦

2009-09-29 13:55:23

Hibernate設置

2009-09-25 15:19:44

Hibernate過濾

2021-07-05 15:22:03

Servlet過濾器客戶端

2009-07-08 17:33:37

Servlet過濾器

2024-01-05 09:04:35

隆過濾器數(shù)據(jù)結構哈希函數(shù)

2009-07-08 15:30:56

Servlet過濾器

2009-07-08 16:07:04

Servlet過濾器配

2011-06-29 16:14:59

Qt 事件 過濾器

2009-07-14 09:09:08

Swing模型過濾器

2024-11-04 08:45:48

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

2016-12-07 09:56:13

JavaFilter過濾器

2021-01-14 08:13:39

Spring Clou應用內(nèi)置過濾器

2017-07-18 14:10:31

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

2025-04-21 00:50:50

2015-10-14 13:58:03

2009-07-03 18:26:11

Servlet過濾器

2017-04-12 14:43:01

Spring ClouZuul過濾器

2023-01-26 01:41:27

核心全局過濾器

2024-03-15 11:21:22

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

2009-07-06 13:02:49

Servlet過濾器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费视频一区二区三区在线观看 | 国产一区二区在线免费播放 | 亚洲丝袜天堂 | 色综合区 | 极品粉嫩国产48尤物在线播放 | 亚洲国产精品人人爽夜夜爽 | 日韩欧美不卡 | 国产精品视频网 | 国产黄色av网站 | 久久成人精品视频 | 国产高清在线 | 操操操操操| 在线免费观看欧美 | 国产a级毛片 | 久久久久久av | 国产美女久久久 | 涩涩导航| 亚洲午夜精品一区二区三区他趣 | 亚洲网站在线观看 | 久久逼逼 | 亚洲精品一区久久久久久 | 91伊人 | 国产精品3区 | 羞视频在线观看 | 国产精品毛片一区二区三区 | 中午字幕在线观看 | 成人精品 | 欧美一级久久 | 久久免费视频1 | 久久不卡日韩美女 | 日韩精品一区二区三区视频播放 | 超碰伊人| 精品久久精品 | 91精品国产一区二区三区 | 丁香久久 | 亚洲国产成人av好男人在线观看 | 国产精品久久久久久久久久 | 天天澡天天操 | 久久婷婷香蕉热狠狠综合 | 欧美高清性xxxxhd | 国产一区二区中文字幕 |