您的位置:首页 > 其它

Hibernate高级技巧:数据过滤器-使用XML和标注

2013-03-10 12:05 405 查看
Hibernate数据过滤器是一个创新的方法,以一种更具可重用性的方式和“可视化”规则来过滤从数据库获取的数据。数据过滤器有一个唯一的名字,可进行全局访问,并能接受参数值用于过滤规则。可以在Hibernate session中启用或禁用数据过滤。

请看下面的Hibernate数据过滤器示例。

在这个示例程序中,定义了一个数据过滤器,使用指定的日期过滤集合数据。Hibernate数据过滤器可以使用XML映射文件实现,也可以使用标注实现。


1、在XML映射文件中实现Hibernate数据过滤器

使用“filter-def”关键字定义一个数据过滤器,并接受一个日期参数。

<filter-def name="stockRecordFilter">

  <filter-param name="stockRecordFilterParam" type="date"/>

</filter-def>

下面的XML映射文件中,声明过滤器并将其赋予set集合。

<hibernate-mapping>

  <class name="com.xuejava.common.Stock" table="stock" catalog="xuejava">

   ...

   <set name="stockDailyRecords" inverse="true" table="stock_daily_record">

     <key>

       <column name="STOCK_ID" not-null="true" />

     </key>

     <one-to-many class="com.xuejava.common.StockDailyRecord" />

     <filter name="stockRecordFilter" condition="date >= :stockRecordFilterParam"/>

   </set>

  </class>

  <filter-def name="stockRecordFilter">

    <filter-param name="stockRecordFilterParam" type="date"/>

  </filter-def>

</hibernate-mapping>

在condition=”date >= :stockRecordFilterParam”中,“date”是“StockDailyRecord”的一个属性。


2、在标注(注解)中实现Hibernate数据过滤器

使用“@FilterDef”关键字定义一个数据过滤器,并使用“@ParamDef”接收一个日期参数。

@FilterDef(name="stockRecordFilter",

parameters=@ParamDef( name="stockRecordFilterParam", type="date" ) )

下面是完整的标注示例,其中声明了一个数据过滤器并将其赋予set集合。

...

@Entity

@FilterDef(name="stockRecordFilter", parameters=@ParamDef( name="stockRecordFilterParam", type="date" ) )

@Table(name = "stock", catalog = "xuejava")

public class Stock implements java.io.Serializable {

  ...

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "stock")

  @Filter(

    name = "stockRecordFilter",

    condition="date >= :stockRecordFilterParam"

  )

  public Set<StockDailyRecord> getStockDailyRecords() {

    return this.stockDailyRecords;

  }

在condition=”date >= :stockRecordFilterParam”中,“date”是“StockDailyRecord”的一个属性。


3、怎样启用和禁用数据过滤

启用数据过滤:

Filter filter = session.enableFilter("stockRecordFilter");

filter.setParameter("stockRecordFilterParam", new Date());

禁用数据过滤:

session.disableFilter("stockRecordFilter");


4、应用和实现数据过滤器

下面的代码片段演示了怎样应用和实现数据过滤器。

  Session session = HibernateUtil.getSessionFactory().openSession();

  System.out.println("****** Enabled Filter ******");

  Filter filter = session.enableFilter("stockRecordFilter");

  filter.setParameter("stockRecordFilterParam", new Date());

  Stock stock = (Stock)session.get(Stock.class, 2);

  Set<StockDailyRecord> sets = stock.getStockDailyRecords();

  for(StockDailyRecord sdr : sets){

    System.out.println(sdr.getDailyRecordId());

    System.out.println(sdr.getDate());

  }

  System.out.println("****** Disabled Filter ******");

  session.disableFilter("stockRecordFilter");

  //清除已加载的实例,重新获得Stock(只是为了演示)

  session.evict(stock);

  Stock stock2 = (Stock)session.get(Stock.class, 2);

  Set<StockDailyRecord> sets2 = stock2.getStockDailyRecords();

  for(StockDailyRecord sdr : sets2){

    System.out.println(sdr.getDailyRecordId());

    System.out.println(sdr.getDate());

  }

输出结果如下:

****** Enabled Filter ******

58

2011-07-31

****** Disabled Filter ******

60

2011-07-02

58

2010-07-31

63

2010-07-23

61

2010-07-03

...

在这个示例中(包括XML映射和标注),在启用了过滤器后,所有的“StockDailyRecord”集合都由参数日期所过滤。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: