私はJPA toplink-essentialを使用しており、REST Webアプリケーションを構築しています。サーブレットレベルでOptimisticLockExceptionを捕まえるには?
私は1つのエンティティを見つけて削除するサーブレットを持っています。
以下のコード私は、サーブレットレベルで楽観的なロック例外を捕まえることができると思っていましたが、そうではありません! 代わりにRollbackExceptionがスローされ、それはドキュメントの内容です:
しかし、Netbean IDE GlassFishログが表示されたら、どこかでoptimisticLockExceptionがスローされます。それは私のコードで捕らえられていないだけです。 (私のシステムのプリントメッセージが表示されないので、そこには入っていないと確信しています)
私は各パッケージを一度にインポートしようとしましたが、catch節でテストしましたが、ログエラーが "楽観的な例外"と言われてもcatchブロックには入りません。
import javax.persistence.OptimisticLockException;
import oracle.toplink.essentials.exceptions.OptimisticLockException;
したがって、OptimisticLockExceptionがスローされる場所?????
@Path("delete")
@DELETE
@Consumes("application/json")
public Object planDelete(String content) {
try {
EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
EntityTransaction txn = em.getTransaction();
txn.begin();
jObj = new JSONObject(content);
MyBeany bean = em.find(123);
bean.setVersion(Integer.parseInt(12345));
em.remove(bean);
//here commit!!!!!
em.getTransaction().commit();
}
catch(OptimisticLockException e) { //this is not caught here :(
System.out.pritnln("here");
//EntityTransactionManager.rollback(txn);
return HttpStatusHandler.sendConflict();
}
catch(RollbackException e) {
return HttpStatusHandler.sendConflict();
}
catch(Exception e) {
return HttpStatusHandler.sendServerError(e);
}
finally {
if(em != null) {
em.close();
}
}
エラーメッセージ:
[TopLink Warning]: 2011.01.28 05:11:24.007--UnitOfWork(22566987)
--Exception [TOPLINK-5006]
(Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))):
oracle.toplink.essentials.exceptions.OptimisticLockException
[TopLink Warning]: 2011.02.01 08:50:15.095--UnitOfWork(681660)--
javax.persistence.OptimisticLockException: Exception [TOPLINK-5006] (Oracle TopLink
Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))):
oracle.toplink.essentials.exceptions.OptimisticLockException
良い点。私は上記のコードで、javax.persistence.OptimisticLockExceptionをキャッチしていました。私はcatch節を変更してoracle.toplink.essentials.exceptions.OptimisticLockExceptionをキャッチしましたが、キャッチしない限りです。私は自分の投稿にエラーmsgを追加しました。両方のタイプのパッケージを示しています..非常に混乱しています –
私の推測ではRalphが指摘したように、em.getTransaction()内に例外がスローされていますので、optimisticLockExceptionを手動でキャッチできません。唯一の方法は、ロールバック例外をキャッチし、 "競合"が発生したと仮定することです。 :( –
"catch(Exception e)"は、try-block内でスローされた例外(未チェックまたはチェック)を捕捉する必要があります。 – esaj