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

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

Java 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 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 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 Hibernate documentation

Kategória:Java API-k