4

EntityManager em が注入されたマネージド ステートレス セッション Bean があります。

私がやろうとしているのは、一意の列を持つデータベース テーブルを持つことです。次に、エンティティを挿入しようとするアルゴリズムを実行します。ただし、エンティティが存在する場合は、更新するかスキップします。

私はこのようなものが欲しいです:

try {   
em.persist(cd);     
em.flush();     
} catch (PersistenceException e) {  
// Check if the exception is DatabaseException and ConstraintViolation
    // Update instead or skip it
}

問題は、私がしか捕まえられないことPersistenceExceptionです。DatabaseExceptionキャッチされません。重複エントリをチェックするために使用したいDatabaseExceptionというメソッドしかないので悲しいです。返品getDatabaseErrorCode()なのでよくわかりません。PersistenceException.getCause()DatabaseException

私の質問はDatabaseException、MySQL エラー コードをキャッチして確認するにはどうすればよいですか?

これに関するアイデアや経験をありがとう。

4

1 に答える 1

6

アプリケーションで使用する提案があります。SQLExceptionからを取得できますPersistenceException。その後、 を取得sql error codeしてみてくださいSQLException。を取得する必要がある場合はsql error code、私の例に従うことができます。

public void insert(Group group) throws DAOException {
    try {
        //your operation
        em.flush();
        logger.debug("insert() method has been successfully finisehd.");
    } catch (PersistenceException pe) {
        String sqlErroCode = getErrorCode(pe);
        // do your operation based on sql errocode
    }
}

protected String getErrorCode(RuntimeException e) {
    Throwable throwable = e;
    while (throwable != null && !(throwable instanceof SQLException)) {
        throwable = throwable.getCause();
    }
    if (throwable instanceof SQLException) {
        Properties properties = --> load sql error code form configuration file.
        SQLException sqlex = (SQLException) throwable;
        String errorCode = properties.getProperty(sqlex.getErrorCode() + "");
        return errorCode;
    }
    return "NONE";
}

mysqlのエラーコード設定例

mysql_error_code.properties

#MySQL Database
1062=DUPLICATE_KEY_FOUND
1216=CHILD_RECORD_FOUND
1217=PARENT_RECORD_NOT_FOUND
1048=NULL_VALUE_FOUND
1205=RECORD_HAS_BEEN_LOCKED 
于 2012-10-28T17:05:44.093 に答える