A Hibernate Filters a Hibernate objektum-relációs leképezést (ORM) megvalósító programkönyvtár részei. A Hibernate filter egy globális, paraméterezett szűrő, mely névvel rendelkezik és ki- bekapcsolható egy Hibernate munkamenet során. Ezt a megközelítést az adatkezeléshez "láthatósági" szabályoknak nevezzük.

Leírása szerkesztés

A Hibernate-tel meg tudjuk előre határozni a szűrési feltételeket, és ezeket osztályokhoz, vagy gyűjteményekhez kötni. Ezek a feltételek hasonlóak a HQL "WHERE" záradékához. Az alkalmazásból ezután vezérelhetjük, hogy mely szűrők lesznek futási időben engedélyezve, és mik legyenek a paramétereik. A szűrőket úgy is fel lehet fogni, mint adatbázis nézetek, azzal hogy paraméterezhetők az alkalmazásból.

Használata szerkesztés

Java szerkesztés

A szűrőket vagy az @org.hibernate.annotations.FilterDef, vagy az @org.hibernate.annotations.FilterDefs annotációval definiáljuk. Egy ilyen definíciónak rendelkeznie kell névvel és paraméterek halmazával, melyeket a name=(), illetve parameters() mezőkkel határozunk meg. Az így létrehozott paraméterekkel tudjuk befolyásolni a szűrő működését futási időben. Minden egyes paramétert egy @ParamDef annotáció határoz meg, mely rendelkezik name és type mezőkkel. Ezen kívül definiálható egy defaultCondition() mező is, arra az esetre, ha nem határoznánk megy egyet se az egyes @Filter-ekben. A @FilterDef(s)-eket osztály, és csomag szinten definiálhatjuk.

Az alábbi példán bemutatásra kerülnek az annotációk használatai, és, hogy hogyan adható meg SQL a paraméterek meghatározásához:

 @Entity
 @FilterDef(name="minLength", parameters=@ParamDef( name="minLength", type="integer" ) )
 @Filters( {
     @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
     @Filter(name="minLength", condition=":minLength <= length")
 } )
 public class Forest { ... }

Amikor asszociációs táblát használunk több-több kapcsolat kezelésére, lehetőség van rá, hogy a szűrőt vagy a cél entitásra alkalmazzuk, vagy magára az asszociációs táblára. Az előbbi példától eltérően, asszociációs táblára szűrő paramétert a @FilterJoinTable annotációval tehetünk:

 @OneToMany
 @JoinTable
 //szűrő az entitás táblájára
 @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length")
 //szűrő az asszociációs táblára
 @FilterJoinTable(name="security", condition=":userlevel >= requredLevel")
 public Set<Forest> getForests() { ...

XML szerkesztés

A Hibernate szűrőket a Hibernate konfigurációs fájljában is definiálhatjuk, és hasonlóképpen kell eljárnunk létrehozásakor.

Szűrő definiálása XML-ben:

 <filter-def name="myFilter">
     <filter-param name="myFilterParam" type="string"/>
 </filter-def>

Ez az szűrő aztán hozzácsatolható osztályhoz, vagy gyűjteményhez (akár egyidejűleg is):

 <class name="myClass" ...>
     ...
     <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>

     <set ...>
         <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
     </set>  
 </class>

Vezérlés szerkesztés

Futási időben a Session enableFilter(String filterName), getEnabledFilter(String filterName), és a disableFilter(String filterName) metódusaid használjuk a szűrők beállítására. Alapértelmezetten a szűrők nincsenek bekapcsolva. Az enableFilter metódussal bekapcsolhatunk egy szűrőt, mely ezután visszaad egy Filter interfésszel rendelkező objektumot. Egy példa a használatára:

 session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");

Ahhoz, hogy mindig effektív rekordhalmazokkal dolgozzunk, mindig először kapcsoljuk be a szűrőket, és utána végezzünk lekérdezéseket.

Külső hivatkozások szerkesztés