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

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”集合都由参数日期所过滤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值