Hibernate3.x过滤器的高级应用

豆豆网   技术应用频道   2007年08月09日    社区交流

内容摘要:Hibernate3的过滤器可以进行预定义,并可绑定在类和集合层。那么什么叫预定义过滤器呢?就是可以定义象"where"子句的限制性子句,但这些子句是相对类和不同集合的元素的。除了这些过滤器条件可以被参数化外。系统还能决定在运行是指定的过滤器是否应该被打开以及什么值被传入过滤器参数。

  在上面的HQL中,即使我们只给出一个salary约束条件,由于我们已经打开发过滤器,也只会得到当前活动的比一百万多的雇员。

  2. 安全的实例

  假设我们有一个应用程序,这个程序给每一个用户分配一个访问权限。在这其间,系统中一些敏感的实体被分配给了某些访问层次。因此,一个用户在它所属的访问层中应该可以看到更多的东西。在本例子中我们就要通过过滤器来过滤某一个访问层次中的实体。下面让我们来定义过滤器。

<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());

  下面的代码是一个正在装载的区域,它将过滤当前用户访问层的集合以得到一个子集。

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

  四、结论

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

来源:IT168    作者:极地圣火    责编:豆豆技术应用

正在加载评论...