Sansür, bir toplumun kendine olan güvensizliğini yansıtır ve otoriter rejimlerin belirgin bir özelliğidir.

--Potter Stewart

13.11.2008

Hibernate Data Filtering (Süzme)

Verilerin tamamını değil de belirli kriterlerle süzülüp işimize yarayacakları veritabanından sorgulamak günlük hayatta çokça karşılaştığımız bir senaryo. Örneğin “Abone” nesnesinin belirli tarihten önceki ödenmemiş faturalarına erişmek istediğimiz zaman abone.getFaturalar()
şeklinde bir erişim, eğer bir süzme uygulanmazsa abonenin tüm faturalarını getireceği için Java kodlarıyla süzme işlemini yapmamızı gerektirecektir. Buna benzer ya da veri güvenliği (kullanıcıya sadece görmesi gereken verilerin gösterilmesi) gibi senaryolarda Hibernate Data Filtering, Java kodlarında gerçekleştirmemiz gereken süzme maliyetinden kurtulmamıza olanak sağlıyor.


Öncelikle süzme işleminde kullanacağımız süzgeci, biricik ismiyle tanımlamamız gerekiyor:

@org.hibernate.annotations.FilterDef(name="faturaOdemeFilter",


parameters={
@ParamDef(name="donem",type="integer"),
@ParamDef(name="kalanTutar",type="double"),
@ParamDef(name="durumConditions",type="long")

})


Tanımladığımız süzgecin ismi faturaOdemeFilter ve dinamik süzme işlemi yapabilmemiz için üç tane parametre alıyor. Parametrelerin kurulma işlemine birazdan değineceğiz. Bu tanım global nitelikli olduğu için herhangi bir sınıfta ya da package-info.java içerisinde yazılabilir. Yazıldığı sınıfın davranışında bir etkisi yoktur fakat uygun olan tanımın ilgili sınıfta yazılmasıdır. Süzgeç tanımımız olgusunu da süzme işleminin yapılacağı sınıfta ya da ilişkide yazılması gerekmektedir:

@Entity
@Table(name="FATURA")

@Filter(name="faturaOdemeFilter", condition="ODEME_DONEMI <= :donem and FATURA_DURUM in (:durumConditions) and KALAN_TUTAR >:kalanTutar")

public class Fatura {...}


Birden fazla süzgeç @org.hibernate.annotations.Filters ile gruplanabilir. Yukarıdaki gibi sınıf üzerine yazılmış süzgeç olgusu


List<Fatura> filteredItems = session.createQuery("from Fatura").list();


List<Fatura> filteredItems = session.createCriteria(Fatura.class).list();


Deyimlerinde çalışacaktır. Id ile sorgulamalarda (id'yi biliyorsak süzmeye de gerek yok) ve nesne niteliklerinin sorgulanmasında sınıf üzerine yapılan tanım çalışmayacaktır. abone.getFaturalar()deyimi gibi abonenin ilişkili olduğu faturaların süzülmesi için süzgeç olgusunun ilişki üzerinde tanımlanması gerekmektedir:


@Entity
@Table(name = "ABONE")


public class Abone {


@OneToMany(mappedBy="abone")
@Filter(name="faturaOdemeFilter", condition="ODEME_DONEMI <= :donem and FATURA_DURUM in (:durumConditions) and KALAN_TUTAR > :kalanTutar")


private Set<Fatura> faturalar = new HashSet<Fatura>();


...

}


Süzgeç tanımının kullanılması için Hibernate Session’ında süzgeç aktif hale getirilerek varsa aldığı parametreler kurulmalıdır. Veriler çekildikten sonra da süzgeç tekrar pasif hale getirilebilinir. (JPA API’sinde EntityManager filtrelemeye destek sağlamadığı için Hibernate arayüzü kullanılmalıdır.)


List<Long> durumConditions = new ArrayList<Long>();

durumConditions.add(FaturaDurumEnum.ODENMEMIS.getValue());
durumConditions.add(FaturaDurumEnum.
PARCALI_ODENIYOR.getValue());


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


filter.setParameter("donem",donem).setParameter("kalanTutar",new Double(0)).setParameterList("durumConditions", durumConditions);


Set<Fatura> faturalar = abone.getFaturalar();


session.disableFilter(("faturaNormalOdemeFilter");



Hiç yorum yok:

Yorum Gönder