Hatena::ブログ(Diary)

ただのSEの雑記帳

2011-08-11

Hibernate 3の例外とSpringの例外の対応関係

Hibernate 3とSpringを組み合わせたときに気づいたのでメモ。

Hibernate 3とSpringを組み合わせて使う場合、通常はSpringのトランザクション管理(HibernateTransactionManagerなど)を利用します。この場合、実はHibernate 3の例外をSpringで用意している例外に置き換えるのです。この点について、Springのドキュメントに書いてあるかな?と思って調べてみたのですが、ちょっと見つかりませんでした*1。とりあえず、確認した範囲でまとめておきます。

  • 楽観同時実行制御違反の場合
    Hibernate 3のStaleObjectStateException例外を、HibernateOptimisticLockingFailureException例外(org.springframework.orm.hibernate3パッケージ)に置き換えます。ちなみに、HibernateOptimisticLockingFailureException例外の継承階層は深いのですが、OptimisticLockingFailureException例外(org.springframework.daoパッケージ)などを継承していますので、こちらの方をcatchしてもよいでしょう。
  • 制約違反(主キー制約違反は未確認)
    Hibernate 3のConstraintViolationException例外を、DataIntegrityViolationException(org.springframework.daoパッケージ)に置き換えます。
  • IDENTITYなどで主キーを生成する場合
    この場合、先日のメモにあるとおり、saveメソッドのタイミングでConstraintViolationException例外が発生します。が、なぜかSpringではこの場合の例外を置き換えてくれません*2

あと、Springのトランザクション管理ではコミットロールバックはSpringが制御するので、アスペクトで例外を処理する場合、適用する場所を間違いようにしないといけませんね。

*1:誰か教えていただけると助かります

*2:もしかするとデータベースによるのかもしれませんが

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ron_s-nakazawa/20110811/1313065230
Connection: close