sql >> Databasteknik >  >> RDS >> Oracle

fånga DB-undantag i JSF+EJB-applikationen

EJB har konceptet systemundantag och tillämpningsundantag.

Runtime-undantag, som EntityExistsException är systemundantag. Dessa kommer bland annat att orsaka att alla transaktioner rullas tillbaka och göra att EJB-instansbönan kasseras (förstörs). Viktigast av allt för ditt problem, de kommer att lindas in i en EJBException .

Det finns ingen magi kring att fånga dessa undantag. Justerar du koden från Petr ovan
kommer följande bara att fungera:

Stödböna:

@EJB
private DAOBean daoBean;

public void savePerson(Entity e) {
     try {
         daoBean.save(e);
     } catch (EJBException e) {         
         FacesMessage message = new FacesMessage("entity is already exists.");
         FacesContext.getCurrentInstance.addMessage(null, message);
     }         
}

EJB:

private EntityManager em;

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

Observera att du kan hämta orsaken till undantaget för att se om det var en EntityExistsException eller inte (utelämnat ovan för korthetens skull).

Eftersom du förmodligen inte behöver förstöra din EJB-instans i det här fallet, är ett bättre mönster att definiera ditt eget undantag som ärver från en RuntimeException och är kommenterad med @ApplicationException med rollback attribut satt till sant.

T.ex.

@ApplicationException(rollback = true)
public class MyException extends RuntimeException {

    public MyException(Throwable cause) {
        super(cause);
    }
}

Slå in din EntityExistsException i din EJB in i detta undantag och kasta och fånga det.

Jag råder dig starkt till INTE att använda felkoder eller boolesk framgång/misslyckande som ett resultat. Detta är ett välkänt antimönster och gör din kod otroligt felbenägen.



  1. Använd textutdata från en funktion som ny fråga

  2. ORA-01219:databas inte öppen:frågor tillåtna endast på fasta tabeller/vyer

  3. kan inte ta bort objekt på grund av en främmande nyckel

  4. Hur man får antalet rader som påverkas av ett uttalande när det är inuti det påståendets utlösare