sql >> Database teknologi >  >> RDS >> Oracle

fange DB-undtagelse i JSF+EJB-applikation

EJB har konceptet med systemundtagelser og applikationsundtagelser.

Runtime undtagelser, såsom EntityExistsException er systemundtagelser. Disse vil blandt andet medføre, at enhver transaktion bliver rullet tilbage og forårsager, at EJB-instansbønnen bliver kasseret (ødelagt). Vigtigst af alt for dit problem, vil de blive pakket ind i en EJBException .

Der er ingen magi omkring at fange disse undtagelser. Justering af koden fra Petr ovenfor,
det følgende vil bare fungere:

Bagbønner:

@EJBprivate DAOBean daoBean;public void savePerson(Entity e) { try { daoBean.save(e); } catch (EJBEundtagelse e) { FacesMessage message =new FacesMessage("enheden findes allerede."); FacesContext.getCurrentInstance.addMessage(null, besked); } }

EJB:

privat EntityManager em;public void save(Entity e) { em.persist(e); } 

Bemærk, at du kan hente årsagen til undtagelsen for at se, om det var en EntityExistsException eller ej (udeladt ovenfor for kortheds skyld).

Da du sandsynligvis ikke har behov for at ødelægge din EJB-instans i dette tilfælde, er et bedre mønster at definere din egen undtagelse, der arver fra en RuntimeException og er kommenteret med @ApplicationException med tilbageføring attribut sat til sand.

F.eks.

@ApplicationException(rollback =true)public class MyException udvider RuntimeException { public MyException(Throwable cause) { super(cause); }} 

Indpak din EntityExistsException i din EJB ind i denne undtagelse og smid og fang den.

Jeg råder dig kraftigt til IKKE at bruge fejlkoder eller boolesk succes/fiasko som følge heraf. Dette er et velkendt anti-mønster og gør din kode utroligt udsat for fejl.



  1. Hvordan udføres to mysql-forespørgsler som én i PHP/MYSQL?

  2. Bedste praksis for løs kobling mellem data og brugergrænseflade i Android - Adapter, Filter, CursorLoader og ContentProvider

  3. SQLAlchemy flere fremmednøgler i én tilknyttet klasse til den samme primærnøgle

  4. Indlæser billeddata i BLOB-kolonner i Oracle