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