Keď klient zavolá nejakú vyhľadávaciu metódu find, kontajner následne zavolá korešpondujúcu ejbFind metódu. Najdôležitejšie je uvedomiť si, že v prípade tejto metódy ste zodpovedný iba za vrátenie hodnoty primárneho kľúča, ktorý zodpovedá zadaným kritériám vyhľadávacej metódy.

Implementácia vyhľadávacích metód ejbFind

Kontajner odpovie tak, že vráti klientovi referenciu na komponent rozhranie entitnej triedy, ale to neznamená, že zároveň bude aj aktivovaný konkrétny entitný objekt lokalizovaný vyhľadávacou metódou. Stane sa tak až vtedy, keď klient zavolá niektorú z biznis metód komponent rozhrania. V konečnom dôsledku to znamená, že jednoduché zavolanie vyhľadávacej metódy aplikovanej na konkrétny entitný objekt nespôsobí, že zároveň bude zavolaná aj metóda ejbLoad tohto objektu.

Najjednoduchšou vyhľadávacou metódou je findByPrimaryKey. Keď si uvedomíme, čo už bolo povedané, tak jedinou úlohou metódy ejbFindByPrimaryKey je overiť, či primárny kľúč predaný ako parameter má svoj podklad v databáze. Nasledovný výpis zobrazuje implementáciu tejto metódy v triede EnglishAuctionBean.

public class EnglishAuctionBean extends AbstractEntity
 implements EntityBean {
 …
 public Integer ejbFindByPrimaryKey(Integer primaryKey)
  throws FinderException {
  
  if (primaryKey == null) {
   throw new FinderException(„Primárny kľúč je null!“);
  }
  
  Connection con = null;
  PreparedStatement stmt = null;
  ResultSet rs = null;
  try {
   con = DSConnectionHelper.getConnection(„auctionSource“);
   stmt = con.prepareStatement(„SELECT id FROM auction WHERE id = ?“);
   stmt.setInt(1, primaryKey.intValue());
   rs = stmt.executeQuery();
   boolean found = rs.next();
   if (!found) {
    throw new ObjectNotFoundException(„Nemôžem nájsť: “ + primaryKey);
   }
  }
  catch (SQLException e) {
   throw new EJBException;
  }
  finally {
   DSConnectionHelper.cleanup(stmt, con);
  }
  
  return primaryKey;
 }
 …
}

Ukážeme si ešte jednu implementáciu vyhľadávacej metódy, ktorá je o niečo málo komplexnejšia. Jej úlohou je vrátiť kolekciu primárnych kľúčov pre všetky definované aukcie. Táto implementácia je vo svojom jadre rovnaká ako predchádzajúca, s niektorými dôležitými zmenami.

public class EnglishAuctionBean extends AbstractEntity
 implements EntityBean {
 …
 public Collection ejbFindAllAuctions()
  throws FinderException {
  
  Connection con = null;
  PreparedStatement stmt = null;
  ResultSet rs = null;
  Collection keys = new ArrayList();
  try {
   con = DSConnectionHelper.getConnection(„auctionSource“);
   stmt = con.prepareStatement(„SELECT id FROM auction“);
   rs = stmt.executeQuery();
   while (rs.next()) {
    Integer pk = (Integer)rs.getObject(„id“);
    keys.add(pk);
   }
  }
  catch (SQLException e) {
   throw new EJBException;
  }
  finally {
   DSConnectionHelper.cleanup(stmt, con);
  }
  return keys;
 }
 …
}

Mazanie entitných objektov

Klient môže zavolať buď niektorú z dvoch remove metód home rozhrania, alebo môže zavolať remove metódu component rozhrania, ak potrebuje odstrániť entitný objekt. Odpoveďou kontajnera na túto požiadavku je zavolanie vašej metódy ejbRemove entitnej inštancie, ktorá potrebuje byť zmazaná. Za jej implementáciu ste zodpovedný vy. Obvykle je nutné implementovať odstránenie entity z podkladovej databázy. Nasledujúci výpis zobrazuje obsah metódy ejbRemove pre našu EnglishAuctionBean.

public class EnglishAuctionBean extends AbstractEntity
 implements EntityBean {
 …
 public void ejbRemove() throws RemoveException {
  /**
  * Otvorená aukcia musí byť najprv uzavretá alebo zrušená.
  */

  if (IAuctionStatus.AUCTION_OPEN.equals(getStatus())) {
   throw new RemoveException(„Nemôžem zmazať otvorenú aukciu“);
  }
  Connection con = null;
  PreparedStatement stmt = null;
  try {
   con = DSConnectionHelper.getConnection(„auctionSource“);
   Integer primaryKey = (Integer)ctx.getPrimaryKey();
   // zmažeme najprv jednotlivé ponuky danej aukcie
   if (!getBids().isEmpty()) {
    int numBids = getBids().size();
    stmt = con.prepareStatement(„DELETE FROM bid WHERE auction_id = ?“);
    stmt.setInt(1, primaryKey.intValue());
    int rowsDeleted = stmt.executeUpdate();
    if (rowsDeleted != numBids) {
     throw new EJBException(„Chyba pri mazaní ponúk aukcie “ + id);
    }
   }
   // teraz zmažeme samotnú akciu
   stmt = con.prepareStatement(„DELETE FROM auction WHERE id = ?“);
   stmt.setInt(1, primaryKey.intValue());
   int rowsDeleted = stmt.executeUpdate();
   if (rowsDeleted != 1) {
    throw new EJBException(„Chyba pri mazaní aukcie “ + id);
   }
  }
  catch (SQLException e) {
   throw new EJBException;
  }
  finally {
   DSConnectionHelper.cleanup(stmt, con);
  }
 }
 …
}

V budúcnosti si môžeme povedať niečo viac o odchytávaní výnimiek v spojitosti s EJB, ale teraz bude stačiť, ak si všimnete, že možete vyhodiť aplikačnú výnimku v metóde ejbRemove, čím de facto vetujete požiadavku klienta na zmazanie konkrétnej aukcie. V tomto momente si treba uvedomiť, že klient môže byť aj správca aukčného systému.

Ak si pozriete metódu ejbRemove, je zreteľné, že obsahuje biznis logiku, ktorá dovoľuje zmazať iba takú aukciu, ktorá je uzavretá alebo zrušená. V prípade, že spĺňa uvedené podmienky, tak najprv je nutné zmazať všetky ponuky vzťahujúce sa na danú aukciu a až potom je možné aukciu zmazať.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

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

Odpovědět