??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品毛片一区二区三区四区,四虎影视在线播放,亚洲精品国产精品乱码不99按摩http://www.aygfsteel.com/zzs/category/37923.htmlzh-cnMon, 02 Mar 2009 14:07:44 GMTMon, 02 Mar 2009 14:07:44 GMT60Hibernate3.xqo器的高应用http://www.aygfsteel.com/zzs/articles/257383.htmlID刀ID刀Mon, 02 Mar 2009 09:58:00 GMThttp://www.aygfsteel.com/zzs/articles/257383.htmlhttp://www.aygfsteel.com/zzs/comments/257383.htmlhttp://www.aygfsteel.com/zzs/articles/257383.html#Feedback0http://www.aygfsteel.com/zzs/comments/commentRss/257383.htmlhttp://www.aygfsteel.com/zzs/services/trackbacks/257383.html 在很多应用程序中不需要一ơ用数据表中的所有的数据。在q种情况下,我们需要用Hibernate的过滤器(Filter)来得C个数据字集。过滤器的主要作用是限制我们的应用程序的查询数据。这个过滤器的概念ƈ不是什么新概念Q如数据库的视图也属于过滤器范畴。而Hibernate为我们提供的qo器是在一个抽象的层次Q它可以做到和不依赖于数据库的类型,使数据访问层只面对一个解x案,那就是Hibernate Filter。当Ӟ直接在数据库中徏立视图也一U解x案,但这样做太不灉|。而Hibernateqo器却能够在Hibernate会话的过E中打开或关闭。另外,另外QHibernateqo器可以传递参敎ͼq样大大增加Hibernate的灵zL。虽然Hibernate2也提供了qo器,但Hibernate3.x提供了一U全新的qo器?

  Hibernate3的过滤器可以q行预定义,q可l定在类和集合层。那么什么叫预定义过滤器呢?是可以定义?where"子句的限制性子句,但这些子句是相对cd不同集合的元素的。除了这些过滤器条g可以被参数化外。系l还能决定在q行是指定的qo器是否应该被打开以及什么D传入qo器参数?

  一、什么时候用过滤器

  Z解释Z么用过滤器Q下面让我们先来看一个例子。假设有一个管理用户信息的Web应用E序。在当前状态,我们的应用程序用同一个应用接口来处理所有的用户信息。但如果最l用戯求将zd用户和过期用户分开理。这些状态信息被保存在用戯的某一列中。对于这U需求,我们最Ҏ惛_的一个解x案是重新写每一个SELECT HQL查询语句Q也是在每一个HQL后加一个WHERE条g来过滤这些数据。当Ӟq种Ҏ的复杂程序取决于你的WebE序是如何徏立的Q可以很单,也可以很复杂。但不管是简单还是复杂,都必d修改我们曄试q的代码Q这给我们的程序带来非常大的隐患。而用Hibernate3.xQ将会给我们带来另外一个解x案。我们将会ؓ应用E序的用L态创Z个过滤器。当用户选择用户的状态时Q活动或q期Q,应用E序激zd前Hibernate会话的用L态过滤器。这样以来,所有的SELECT HQL查询返回查询结果的子集Q而我们只需要在Hibernate会话状态和用户状态过滤器两个地方d代码Qƈ不需要修改原先的代码?br />
  从概念上Ԍ你可以用WHERE子句在应用程序中完成和Hibernateqo器同L工作。当Ӟ我们q可以在数据库中建立视图来完成同L工作Q但所使用的数据库必须支持视图功能Q。这三种解决Ҏ都可以通过一个或多个查询条g来限制最l结果。而Hibernateqo器的优势在于可以随时在E序中关闭或打开Q也是说过滤器是可~程的,而且qo器被定义在Hibernate的映文件中Q这样将非常Ҏl护。当Ӟqo器也有不的地方Q主要的不是在运行时无法创徏新的qo器。而程序在q行Ӟ所有的qo器必要在映文件中被指定。虽然这大大限制过滤器的灵zL,但过滤器支持参数化。对于本文的例子Q我们可以在映射文g中指定保存用L态信息的列。我们不需要在映射文g中指定可能的状态|q些在程序运行时都可以指定。接下来我们来看看如何使用Hibernate3.x中的qo器来写程序?br />   在很多应用程序中不需要一ơ用数据表中的所有的数据。在q种情况下,我们需要用Hibernate的过滤器(Filter)来得C个数据字集。过滤器的主要作用是限制我们的应用程序的查询数据。这个过滤器的概念ƈ不是什么新概念Q如数据库的视图也属于过滤器范畴。而Hibernate为我们提供的qo器是在一个抽象的层次Q它可以做到和不依赖于数据库的类型,使数据访问层只面对一个解x案,那就是Hibernate Filter。当Ӟ直接在数据库中徏立视图也一U解x案,但这样做太不灉|。而Hibernateqo器却能够在Hibernate会话的过E中打开或关闭。另外,另外QHibernateqo器可以传递参敎ͼq样大大增加Hibernate的灵zL。虽然Hibernate2也提供了qo器,但Hibernate3.x提供了一U全新的qo器?

  Hibernate3的过滤器可以q行预定义,q可l定在类和集合层。那么什么叫预定义过滤器呢?是可以定义?where"子句的限制性子句,但这些子句是相对cd不同集合的元素的。除了这些过滤器条g可以被参数化外。系l还能决定在q行是指定的qo器是否应该被打开以及什么D传入qo器参数?

  一、什么时候用过滤器

  Z解释Z么用过滤器Q下面让我们先来看一个例子。假设有一个管理用户信息的Web应用E序。在当前状态,我们的应用程序用同一个应用接口来处理所有的用户信息。但如果最l用戯求将zd用户和过期用户分开理。这些状态信息被保存在用戯的某一列中。对于这U需求,我们最Ҏ惛_的一个解x案是重新写每一个SELECT HQL查询语句Q也是在每一个HQL后加一个WHERE条g来过滤这些数据。当Ӟq种Ҏ的复杂程序取决于你的WebE序是如何徏立的Q可以很单,也可以很复杂。但不管是简单还是复杂,都必d修改我们曄试q的代码Q这给我们的程序带来非常大的隐患。而用Hibernate3.xQ将会给我们带来另外一个解x案。我们将会ؓ应用E序的用L态创Z个过滤器。当用户选择用户的状态时Q活动或q期Q,应用E序激zd前Hibernate会话的用L态过滤器。这样以来,所有的SELECT HQL查询返回查询结果的子集Q而我们只需要在Hibernate会话状态和用户状态过滤器两个地方d代码Qƈ不需要修改原先的代码?br />
  从概念上Ԍ你可以用WHERE子句在应用程序中完成和Hibernateqo器同L工作。当Ӟ我们q可以在数据库中建立视图来完成同L工作Q但所使用的数据库必须支持视图功能Q。这三种解决Ҏ都可以通过一个或多个查询条g来限制最l结果。而Hibernateqo器的优势在于可以随时在E序中关闭或打开Q也是说过滤器是可~程的,而且qo器被定义在Hibernate的映文件中Q这样将非常Ҏl护。当Ӟqo器也有不的地方Q主要的不是在运行时无法创徏新的qo器。而程序在q行Ӟ所有的qo器必要在映文件中被指定。虽然这大大限制过滤器的灵zL,但过滤器支持参数化。对于本文的例子Q我们可以在映射文g中指定保存用L态信息的列。我们不需要在映射文g中指定可能的状态|q些在程序运行时都可以指定。接下来我们来看看如何使用Hibernate3.x中的qo器来写程序?br />  四、实?/strong>

  1. 一个过滤数据的例子

  现在假设有一个实体,q个实体跟着“有效的记?#8221;数据库模式。这个实体有多个行,每一行都Ҏ日期不同而不同,也就是说在日期范围内是有效的。一个employment记录是一个非常好的例子,因ؓemployees可以来或L再回来。现在我们开发一个带UI的程序,q个E序需要处理employment数据的当前记录。ؓ了用新的过滤器Ҏ达到这个目的。我们首先需要定义这个过滤器Q然后将它附着在EmployeecM?br />
<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>

  然后Qؓ了保证L加在到当前的有效记录。只要简单地过滤器打开卛_Q代码如下:

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中,即我们只给Z个salaryU束条gQ由于我们已l打开发过滤器Q也只会得到当前zd的比一百万多的雇员?br />
  2. 安全的实?br />
  假设我们有一个应用程序,q个E序l每一个用户分配一个访问权限。在q其_pȝ中一些敏感的实体被分配给了某些访问层ơ。因此,一个用户在它所属的讉K层中应该可以看到更多的东ѝ在本例子中我们p通过qo器来qo某一个访问层ơ中的实体。下面让我们来定义过滤器?br />
<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>

  接下来,让我们来打开qo器?br />
User user = ...;
Session session = ...;
session.enableFilter("accessLevel").setParameter("userLevel", user.getAccessLevel());

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

  四、结?/strong>

  本文单介l了Hibernate3.x的用方法,q给Z一些实例。虽然这些例子很单,但却使我们对Hibernate3.xqo器的强大有了更深的认识。我们通过上面的例子也怼有更多好的想法,如果能将它们和不同的拦截ҎQ如Webqo器结合,会发挥出更大的力量??



ID刀 2009-03-02 17:58 发表评论
]]>
վ֩ģ壺 ױ| | | | | | | ԫ| | ǡ| û| Դ| ٳ| | ƾ| | | | ױ| | | ˮ| פ| Ժ| ƽ| | | | °Ͷ| | Դ| | | | ʡ| | ͨ| ̨| | | ³ľ|