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
-
Landing page: Jak vytvořit landing page s vysokým CTR
7. května 2024 -
Praktické rady na zabezpečení redakčního systému WordPress
27. února 2023 -
Vlastní web: Jak nainstalovat WordPress?
24. června 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024