0

Apache の openJPA を使用しています。Java リフレクションを使用してマネージド Bean で削除メソッドを呼び出しています。この問題は、制約違反のために削除できない管理対象オブジェクトを削除しようとすると発生します。InvocationTargetException をキャッチし、例外の原因を取得すると、ロールバックするグローバル トランザクションが存在しないことが示されます。

Caused by: java.lang.IllegalStateException: No Global Transaction exists to rollback.
    at com.ibm.ws.tx.jta.UserTransactionImpl.rollback(UserTransactionImpl.java:349)

スタック トレースをさらに詳しく見ると、制約違反のために SQL 例外がスローされたことがわかります。

---- Begin backtrace for Nested Throwables
java.sql.SQLException: [SQL0532] Delete prevented by referential constraint CONSTRAINTNAME in LIBRARY.

別のテーブルで使用されているため、削除を実行できないというわかりやすいメッセージを表示できるように、SQL 例外に到達する方法はありますか。

編集 - ここにコードがあります

public void deleteRowAction(Object list, DataTableTemplate template){
        System.out.println("Delete Row");

        try{

            Object bean = getManagedBean(template.getDataManagerName());

            Method methodDelete = getManagedBean(template.getDataManagerName()).getClass().getMethod(template.getDeleteMethod(), 
                    Class.forName(template.getTableList_rowItemClassName()));

            //Map<String, String[]> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap();

            methodDelete.invoke(bean, list);
        }
        catch(PersistenceException pe){
            System.out.println("Persistence Exception Caught");
        }
        catch(NoSuchMethodException nsme){
            nsme.printStackTrace();
        }
        catch(InvocationTargetException ite){

            logException(ite);
            FacesMessage message = new FacesMessage(ite.getCause().getMessage());
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext context = this.getFacesContext();
            context.addMessage(null, message);
        }
        catch(IllegalAccessException iae){
            iae.printStackTrace();
        }
        catch(ClassNotFoundException cnfe){
            cnfe.printStackTrace();
        }
    }
4

2 に答える 2

0

IBM の Websphere を使用しています。次のコードは、Websphere によって自動的に生成されます。データ制約のために削除が行われなかったため、ロールバックは失敗しました。これにより、ロールバックで例外がスローされ、元の例外が失われます。Constraint 例外を確認したい場合は、このメソッドを変更する必要があります (これはできません)。代わりに、一般的なエラー メッセージをログに記録します。

 @Action(Action.ACTION_TYPE.DELETE)
 public String deleteVerificationDocumentCodeTable(
                VerificationDocumentCodeTable verificationDocumentCodeTable)
                throws Exception {
    EntityManager em = getEntityManager();
                try {
                    utx.begin();
                    em.joinTransaction();
                    verificationDocumentCodeTable = em
                            .merge(verificationDocumentCodeTable);
                    em.remove(verificationDocumentCodeTable);
                    utx.commit();
                } catch (Exception ex) {
                    try {
                        utx.rollback();
                    } catch (Exception e) {
                        ex.printStackTrace();
                        throw e;
                    }
                    throw ex;
                } finally {
                    em.close();
                }
                return "";
}
于 2013-06-24T18:30:59.597 に答える