<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 1,  comments - 0,  trackbacks - 0

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

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

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

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

      從概念上講,你可以使用WHERE子句在應(yīng)用程序中完成和Hibernate過濾器同樣的工作。當(dāng)然,我們還可以在數(shù)據(jù)庫(kù)中建立視圖來完成同樣的工作(但所使用的數(shù)據(jù)庫(kù)必須支持視圖功能)。這三種解決方案都可以通過一個(gè)或多個(gè)查詢條件來限制最終結(jié)果。而Hibernate過濾器的優(yōu)勢(shì)就在于可以隨時(shí)在程序中關(guān)閉或打開,也就是說過濾器是可編程的,而且過濾器被定義在Hibernate的映射文件中,這樣將非常容易維護(hù)。當(dāng)然,過濾器也有不足的地方,主要的不足就是在運(yùn)行時(shí)無法創(chuàng)建新的過濾器。而程序在運(yùn)行時(shí),所有的過濾器必須要在映射文件中被指定。雖然這將大大限制過濾器的靈活性,但過濾器支持參數(shù)化。對(duì)于本文的例子,我們可以在映射文件中指定保存用戶狀態(tài)信息的列。我們不需要在映射文件中指定可能的狀態(tài)值,這些在程序運(yùn)行時(shí)都可以指定。接下來我們就來看看如何使用Hibernate3.x中的過濾器來寫程序。
      在很多應(yīng)用程序中不需要一次使用數(shù)據(jù)表中的所有的數(shù)據(jù)。在這種情況下,我們就需要使用Hibernate的過濾器(Filter)來得到一個(gè)數(shù)據(jù)字集。過濾器的主要作用是限制我們的應(yīng)用程序的查詢數(shù)據(jù)。這個(gè)過濾器的概念并不是什么新概念,如數(shù)據(jù)庫(kù)的視圖也屬于過濾器范疇。而Hibernate為我們提供的過濾器是在一個(gè)抽象的層次,它可以做到和不依賴于數(shù)據(jù)庫(kù)的類型,使數(shù)據(jù)訪問層只面對(duì)一個(gè)解決方案,那就是Hibernate Filter。當(dāng)然,直接在數(shù)據(jù)庫(kù)中建立視圖也算一種解決方案,但這樣做太不靈活。而Hibernate過濾器卻能夠在Hibernate會(huì)話的過程中打開或關(guān)閉。另外,另外,Hibernate過濾器可以傳遞參數(shù),這樣將大大增加Hibernate的靈活性。雖然Hibernate2也提供了過濾器,但Hibernate3.x提供了一種全新的過濾器。

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

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

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

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

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

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

    <filter-def name="effectiveDate">
     <filter-param name="asOfDate" type="date"/>
    </filter-def>

    <class name="Employee" ...>
     ...
     <many-to-one name="department" column="dept_id" class="Department"/>
     <property name="effectiveStartDate" type="date" column="eff_start_dt"/>
     <property name="effectiveEndDate" type="date" column="eff_end_dt"/>
     ...
     <filter name="effectiveDate" condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
    </class>

    <class name="Department" ...>
     ...
     <set name="employees" lazy="true">
      <key column="dept_id"/>
      <one-to-many class="Employee"/>
      <filter name="effectiveDate" condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
     </set>
    </class>

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

    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)打開發(fā)過濾器,也只會(huì)得到當(dāng)前活動(dòng)的比一百萬多的雇員。

      2. 安全的實(shí)例

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

    <filter-def name="accessLevel">
     <filter-param name="userLevel" type="int"/>
    </filter-def>

    <class name="Opportunity" ...>
     ...
     <many-to-one name="region" column="region_id" class="Region"/>
     <property name="amount" type="Money">
      <column name="amt"/>
      <cloumn name="currency"/>
     </property>
     <property name="accessLevel" type="int" column="access_lvl"/>
     ...
     <filter name="accessLevel">= access_lvl]]>
    </class>

    <class name="Region" ...>
    ...
    <set name="opportunities" lazy="true">
     <key column="region_id"/>
     <one-to-many class="Opportunity"/>
     <filter name="accessLevel">= access_lvl]]>
    </set>
    ...
    </class>

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

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

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

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

      四、結(jié)論

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

    posted on 2009-03-02 17:58 ID刀 閱讀(172) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(2)

    隨筆檔案(1)

    文章分類(21)

    文章檔案(17)

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 13651
    • 排名 - 2092

    最新評(píng)論

    主站蜘蛛池模板: 亚洲人成无码网WWW| 在线观看亚洲视频| 国产亚洲精品久久久久秋霞| 免费看国产成年无码AV片| 国产麻豆一精品一AV一免费| 全部一级一级毛片免费看| jiz zz在亚洲| 91亚洲国产成人久久精品| 亚洲电影国产一区| 亚洲中文字幕不卡无码| 亚洲日本中文字幕一区二区三区| 日韩在线视频免费看| 丁香花免费高清视频完整版| 114级毛片免费观看| 美丽姑娘免费观看在线观看中文版| 男女一边桶一边摸一边脱视频免费 | 亚洲黄网站wwwwww| 亚洲AV一宅男色影视| 久久夜色精品国产亚洲av| 国产一级一片免费播放i| 午夜寂寞在线一级观看免费| 成人爽A毛片免费看| 成年女人喷潮毛片免费播放| 99精品国产免费久久久久久下载| 蜜臀AV免费一区二区三区| 在线人成精品免费视频| 99久久精品免费精品国产| 99久久久国产精品免费牛牛| 最近的中文字幕大全免费8| 免费无码一区二区三区| 免费A级毛片无码A∨免费| 午夜福利不卡片在线播放免费| 四虎永久在线观看免费网站网址 | 亚洲成a人片在线不卡| 色偷偷亚洲女人天堂观看欧| 亚洲avav天堂av在线网爱情| 亚洲国产日韩精品| 鲁死你资源站亚洲av| 特级毛片aaaa级毛片免费| 国产免费牲交视频免费播放| 天黑黑影院在线观看视频高清免费 |