Cieľom predošlých článkov bolo vysvetliť, ako zadeklarovať rozhrania pre entity beans, ktoré sú vystavené voči klientom. Nezaoberali sme sa však zatiaľ implementačnými detailmi. Treba však povedať, že v ďalších článkoch budeme musieť rozlišovať medzi BMP a CMP perzistentným mechanizmom. Na druhej strane sú však určité oblasti, ktoré sú spoločné pre oba mechanizmy. Aby sme mohli pokračovať ďalej, musíme správne pochopiť funkciu niektorých rozhraní špecifických pre implementačné entitné triedy.

Implementácia rozhrania javax.ejb.EntityBean

Všetky vaše entitné triedy musia priamo alebo nepriamo implementovať toto rozhranie. Samotné rozhranie je rozšírením javax.ejb.EnterpriseBean a definuje niekoľko metód používaných kontajnerom na interakciu s triedami EB. Rozhranie obsahuje nasledovné deklarácie:

public interface EntityBean extends EnterpriseBean {
   void ejbActivate() throws EJBException,RemoteException;
   public void ejbPassivate() throws EJBException,
         RemoteException;
   public void ejbLoad() throws EJBException,RemoteException;
   public void ejbStore() throws EJBException,RemoteException;
   public void ejbRemove() throws RemoveException,
         EJBException,RemoteException;
   public void setEntityContext(EntityContext ctx) throws
         EJBException,RemoteException;
   public void unsetEntityContext() throws EJBException,
         RemoteException;
}

Čo sa týka uvedených ejb metód, označujú sa ako callback metódy. Ich použitie si vysvetlíme neskôr, keď sa budeme zaoberať životným cyklom EB. Dve z metód rozhrania EntityBean, konkrétne setEntityContext a getEntityContext, sa používajú na asociovanie kontextu prostredia s inštanciou entitnej triedy. Kontext je objekt implementujúci rozhranie EntityContext. Prostredníctvom tohto rozhrania môže inštancia entitnej triedy vykonávať volania smerom ku EJB kontajneru.

Implementácia rozhrania javax.ejb.EntityContext

Rozhranie EntityContext rozširuje EJBContext, ktoré umožňuje inštancii beanu obdržať referenciu na jej home rozhranie. Ďalej umožňuje získať bezpečnostné informácie o klientovi, alebo inštancii pracovať s aktuálnou transakciou. Nasledovná tabuľka sumarizuje význam jednotlivých metód deklarovaných v rozhraní EJBContext.

Metódy rozhrania EJBContext
Návratový typ Názov metódy Popis
Principal getCallerPrincipal() Metóda vráti objekt triedy Principal, s bezpečnostnými informáciami týkajúcimi sa klienta.
boolean getRollbackOnly() Metóda testuje, či aktuálna transakcia je označená na rollback.
void setRollbackOnly() Metóda označí aktuálnu transakciu na rollback.
EJBHome getEJBHome() Vráti remote home rozhranie EB.
EJBLocalHome getEJBLocalHome() Vráti lokálne home rozhranie EB.
UserTransaction getUserTransaction() Vráti rozhranie UserTransaction, ktoré môže inštancia EB použiť na ohraničenie transakcie.
boolean isCallerInRole (String role) Metóda testuje, či klient má priradenú bezpečnostnú rolu.

Rozhranie EntityContext potom pridáva ďalšie tri metódy k vyššie uvedenému rozhraniu EJBContext:

public EJBObject getEJBObject() throws IllegalStateException;
public EJBLocalObject getEJBLocalObject()
         throws IllegalStateException;
public Object getPrimaryKey() throws IllegalStateException;

Tieto metódy môžu byť zavolané entitnou inštanciou z vnútra biznis metódy alebo niektorej z callback metód. Určité callback metódy, napríklad ejbCreate, sú volané v bode životného cyklu entitného objektu, v ktorom metódy rozhrania EntityContext nie sú dostupné. Ak by ste sa pokúsili volať niektorú z metód getEJBObject, getEJBLocalObject či getPrimaryKey v tejto situácii, bude vyhodená výnimka IllegalStateException. O callback metódach si budeme ešte podrobnejšie hovoriť.

Účel metódy getPrimaryKey je myslím zjavný. Môžete zavolať túto metódu, aby ste získali referenciu na primárny kľúč asociovaný s inštanciou entity bean. Význam zvyšných dvoch metód už nemusí byť na prvý pohľad jasný. Spomeňte si, že EJBObject je rozhranie, ktoré musí rozširovať každé remote rozhranie komponenty EJB, a EJBLocalObject musí rozširovať každé local rozhranie komponenty. Uvedené dve metódy vám teda umožnia získať referenciu na rozhrania (remote a local) asociované s danou inštanciou. Toto je užitočné najmä vtedy, ak entity bean potrebuje predať referenciu na samú seba ako parameter metódy, alebo ako návratovú hodnotu metódy.

Treba mať na pamäti, že entity bean nemusí nutne implementovať oba typy component rozhraní, local aj remote. Ak teda zavoláte metódu, pre ktorú neexistuje odpovedajúce rozhranie, bude vyhodená výnimka IllegalStateException.

Implementácia vlastných biznis metód.

Každá vaša biznis metóda definovaná v component rozhraní musí mať odpovedajúcu implementáciu v entitnej triede. Rovnako ako pri akomkoľvek inom rozhraní, aj tu musí mať implementovaná metóda rovnaký názov, parametre a návratový typ ako jej predloha deklarovaná v rozhraní. Toto sa týka aj deklarovania možných výnimiek. Aj keď metódy remote rozhrania musia vždy obsahovať klauzulu možného vyhodenia výnimky RemoteException, vaša entitná trieda, respektíve jej metódy, by nemali túto klauzulu obsahovať. Namiesto toho v prípade, že metóda entitnej triedy volá remote metódu, ktorá môže vyhodiť RemoteException, metóda entitnej triedy by mala túto výnimku zachytiť a vyhodiť výnimku EJBException.

V nasledujúcich článkoch si ukážeme príklady implementácie biznis metód, pričom naša implementácia bude čiastočne nezávislá od mechanizmu perzistencie (BMP alebo CMP). A to z toho dôvodu, že metódy budú pracovať s perzistentným poľom v rámci entity bean, a nie priamo s databázou. Obvykle je všetka práca s databázami zapuzdrená v rámci metód ejbLoad a ejbStore.

Žádný příspěvek v diskuzi

Odpovědět