0

ステートレス Web サービスの実装を開発しました。データベース操作を行うためのORMレイヤーとしてJPAを使用しました。サービス メソッドでは、Entity Manager を使用してエンティティを永続化しました。同じレコードをテーブルに保持している間、Service メソッドで「原因: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 一意制約 (TIGOSUSCRIPTIONES.SYS_C0020549) 違反」例外を処理できません。クライアントの結果で次の例外を直接スローしています。

      Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Transaction rolled back
        at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
        at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:111)
        at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
        at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
        at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
        at $Proxy30.registerSaleOutcome(Unknown Source)

      How can I handle this exception? Following is the code we used in service method business logic.


@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void recycleOperation(Recycle recycle) throws RecycleFault_Exception{
  try {
    em.persist(recycle);
  } catch(Exception e){
    // not coming to this block
    log.error("Exception in Data Insertion:"+e.getMessage());
    RecycleFault fault = new RecycleFault();
    fault.setErrorCode("101");
    fault.setMessage("Record is already Existed");
    RecycleFault_Exception faultExp = 
        new RecycleFault_Exception("RecycleFault Exception", fault);
    throw faultExp;
  }
}

この問題を解決するのを手伝ってくれませんか。

4

1 に答える 1

0
@TransactionAttribute(TransactionAttributeType.REQUIRED)

これにより、メソッドはJTAトランザクションにラップされ、トランザクションが失敗すると、例外が呼び出し元にスローされます。これは、呼び出し元で、または例外ハンドラーを介して処理するか、Bean管理のトランザクションを使用するようにメソッドを切り替える必要があります。

また、JPAでflush()を呼び出すこともできます。これにより、制約例外がトリガーされ、それを処理できるようになります。ただし、JTAトランザクションは引き続き失敗します。

于 2012-12-04T14:58:51.723 に答える