Hibernate szűrők
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.