Hibernate高级技巧:数据过滤器-使用XML和标注
2013-03-10 12:05
405 查看
Hibernate数据过滤器是一个创新的方法,以一种更具可重用性的方式和“可视化”规则来过滤从数据库获取的数据。数据过滤器有一个唯一的名字,可进行全局访问,并能接受参数值用于过滤规则。可以在Hibernate session中启用或禁用数据过滤。
请看下面的Hibernate数据过滤器示例。
在这个示例程序中,定义了一个数据过滤器,使用指定的日期过滤集合数据。Hibernate数据过滤器可以使用XML映射文件实现,也可以使用标注实现。
使用“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”的一个属性。
使用“@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”的一个属性。
启用数据过滤:
Filter filter = session.enableFilter("stockRecordFilter");
filter.setParameter("stockRecordFilterParam", new Date());
禁用数据过滤:
session.disableFilter("stockRecordFilter");
下面的代码片段演示了怎样应用和实现数据过滤器。
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”集合都由参数日期所过滤。
请看下面的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”集合都由参数日期所过滤。
相关文章推荐
- Spring整合Hibernate配置(使用hibernate.cfg.xml文件)
- Hibernate使用自定义脚本替换注解或者xml文件中的自动生成表结构
- Excel高级技巧使用指南
- 【学习笔记】函数高级使用技巧:建立函数队列
- Hibernate 高级查询技巧——集合过滤与子查询
- 如何使用GOOGLE高级搜索技巧
- Hibernate3高级特性-使用过滤器
- Linux高级使用技巧十五课(二)
- Hibernate Oracle sequence的使用技巧
- Linux 开发高级使用技巧之--内存泄漏工具
- Hibernate中HQL占位符的一点使用技巧
- Emmet的高级功能与使用技巧
- 表格高级使用技巧_把表格进行到底(必看)
- Dropbox免费网盘高级使用技巧
- net中的正则表达式使用高级技巧 (三)(from internet)
- Hibernate高级实体关联映射之多值的实体关联(一对多关联,使用map)
- 使用Octopress和Github Pages搭建博客的高级技巧
- 使用Xdoclet生成Hibernate配置文件(hibernate.cfg.xml)和Hibernate映射文件(*.hbm.xml)
- c++难点(较高级使用技巧)总结
- Redis高级特性:虚拟内存的使用技巧