sql >> データベース >  >> RDS >> Oracle

JSF+EJBアプリケーションでDB例外をキャッチする

    EJBには、システム例外とアプリケーション例外の概念があります。

    EntityExistsExceptionなどのランタイム例外 システムの例外です。これらにより、トランザクションがロールバックされ、EJBインスタンスBeanが破棄(破棄)されます。問題にとって最も重要なのは、それらがEJBExceptionにラップされることです。 。

    これらの例外をキャッチすることを取り巻く魔法はありません。上記のPetrのコードを調整すると、
    次のコードが機能します。

    バッキングBean:

    @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);    
    }
    

    例外の原因を取得して、EntityExistsExceptionであるかどうかを確認できることに注意してください。 かどうか(簡潔にするために上記では省略)。

    この場合、EJBインスタンスを破棄する必要はおそらくないので、RuntimeExceptionから継承する独自の例外を定義するのがより良いパターンです。 @ApplicationExceptionで注釈が付けられています rollbackを使用 属性がtrueに設定されています。

    例:

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

    EntityExistsExceptionをラップします EJBでこの例外を検出し、スローしてキャッチします。

    しないことを強くお勧めします 結果としてエラーコードまたはブール成功/失敗を使用します。これはよく知られているアンチパターンであり、コードに信じられないほどのエラーが発生しやすくなります。



    1. スキーマとデータベースの違いは何ですか?

    2. 日付を列として動的にピボットする方法

    3. SQLiteUNIQUE制約

    4. MariaDB JSON_INSERT()の説明