EJB 2.x – Entity Beans (BMP – finder metódy a mazanie entít)
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.
Mohlo by vás také zajímat
-
Aukce CZ domén: Jak vydražit expirovanou CZ doménu?
12. června 2024 -
Webový správce souborů Filestash – dojmy a recenze
29. července 2024
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024