[Hibernate] Data filter – XML và annotation

Hibernate data filter là 1 cách đổi mới để filter dữ liệu từ cơ sở dữ liệu, trong nhiều cách tái sử dụng và quy tắc "visibility". Data filter phải là tên duy nhất, truy cập toàn cục và chấp nhận giá trị tham số theo quy tắc filter, có thể enable và disable nó trong 1 Hibernate session.


Hibernate data filter
Trong ví dụ này, định nghĩa 1 data filter và filter data dạng collection theo ngày quy định. Hibernate data filter có thể được implemente cả trong file XML mappiing hoặc annotation.


1. Hibernate data filter trong file XML mapping
Định nghĩa 1 data filter với keyword ‘filter-def‘ và cho phép nhận tham số kiểu date.

XML:
<filter-def name="stockRecordFilter">
     <filter-param name="stockRecordFilterParam" type="date"/>
</filter-def>
XML mapping
Một file XML mapping để khai báo và gán nó vào collection set.

XML:
<hibernate-mapping>
 <class name="com.mkyong.common.Stock" table="stock" catalog="mkyong">
   ...
   <set name="stockDailyRecords" inverse="true" table="stock_daily_record">
      <key>
         <column name="STOCK_ID" not-null="true" />
      </key>
      <one-to-many class="com.mkyong.common.StockDailyRecord" />
    <filter name="stockRecordFilter" condition="date >= :stockRecordFilterParam"/>
   </set>
 </class>

 <filter-def name="stockRecordFilter">
   <filter-param name="stockRecordFilterParam" type="date"/>
 </filter-def>
</hibernate-mapping>
Trong điều kiện = ”date >= :stockRecordFilterParam”, "date" là một property của về ‘StockDailyRecord’.


2. Hibernate data filter với annotation
Khai báo data filter với keyword ‘@FilterDef‘, và cho phép nhận 1 tham số kiểu date với @ParamDef.

Java:
@FilterDef(name="stockRecordFilter",
parameters=@ParamDef( name="stockRecordFilterParam", type="date" ) )
Annotation
Sử dụng annotation để khai báo và gán nó vào collection set.

Java:
...
@Entity
@FilterDef(name="stockRecordFilter",
parameters=@ParamDef( name="stockRecordFilterParam", type="date" ) )
@Table(name = "stock", catalog = "mkyong")
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;
    }
Trong điều kiện = ”date >= :stockRecordFilterParam”, "date" là một property của về ‘StockDailyRecord’.


Cách để enable và disable data filter
Enable data filter.

Java:
Filter filter = session.enableFilter("stockRecordFilter");
filter.setParameter("stockRecordFilterParam", new Date());
Disable data filter.
Java:
session.disableFilter("stockRecordFilter");

Áp dụng và implement date filter
Ở đây có 1 đoạn code để áp dụng và implement data filter.

Java:
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");
        //clear the loaded instance and get Stock again, for demo only
        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());
}
Kết quả
Code:
****** Enabled Filter ******
58
2010-01-31
****** Disabled Filter ******
60
2010-01-02
58
2010-01-31
63
2010-01-23
61
2010-01-03
...

Trong ví dụ này (cả XML và annotation), sau khi enable filter, tất ‘StockDailyRecord’ collection được filter bởi tham số date truyền vào

P.S filter.setParameter(“stockRecordFilterParam”, new Date());, new Date là ngày hiện tại.


Cám ơn các bạn đã theo dõi. Hẹn gặp lại các bạn trong các bài viết sau :D

Bài viết tham khảo tại: https://mkyong.com/hibernate/hibernate-data-filter-example-xml-and-annotation/
 

Bình luận