[jpa:88] Kuina-DaoでJPAを使った場合の実行時エラー処理について

Nobuaki Ito [E-MAIL ADDRESS DELETED]
2007年 10月 22日 (月) 21:24:36 JST


伊藤と申します。こんにちは。

Kuina-DaoでJPAを使った場合の実行時エラー処理について悩んでおります。対処方法をご教授いただけないでしょうか。

名簿を表す以下のようなエンティティを作成しました。ポイントは、
1)プライマリーキーとして、自動採番のid列を持つ。(オブジェクトの一意性を保証する、業務上は無意味なidを想定。後からは変更不可能。)
2)idとは別に、値がユニークになるような列 Name
を持つ。(業務上意味がある、ハンドルネームやメールアドレスのような位置づけの存在を想定。後からも変更可能。)

@Entity
@Table(uniqueConstraints=@UniqueConstraint(columnNames={"NAME"})) //
なぜかnameに対する@Column(unique=true)が効かないのでこれを指定。
public class Member implements Serializable {
(一部省略)

    @Id
    @GeneratedValue
    private Integer id;

    private String name;
    @Column(nullable=false)

(以下省略)

このエンティティを使った場合、変数Nameが重複する値を持つエンティティを書き出そうとすると、実行時エラーで落ちてしまいます。
ブラウザー上に表示されたスタックトレースはこのような感じになりました。

AppFaceException Error Page:

   - org.hibernate.exception.ConstraintViolationException: could not
   insert: [ee.chura.entity.SpgMember]

javax.persistence.EntityExistsException:
org.hibernate.exception.ConstraintViolationException: could not insert: [
ee.chura.entity.Member]
  at(略)
org.hibernate.exception.ConstraintViolationException: could not insert: [
ee.chura.entity.Member]
  at(略)
org.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[insert
into Member (version, name) values (?, ?)], Message=[1062], ErrorCode=23000,
SQLState={3})が発生しました
  at (略)
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:
Duplicate entry 'member one' for key 2
  at(略)

DBMSの側からすると、一意であるべき列に重複する値を持つ行の挿入という操作は許さないのでこのようなエラーになることは分かります。
しかし、アプリケーションが落ちてしまうのは困るので、無事に回復してユーザーにエラー情報を戻す方法を探しています。
(事前に重複キーを検査するという方法もあるでしょうが、、、あまりスマートでありませんし、例えば最終的にDBMSの書き込み時点で重複という事態が発生する可能性はあるのではないかと思います。)
JPAの資料などを色々読みましたがこのような場合のコードの書き方が見つけられません。
おそらく何らかの例外をキャッチするのだと思いますが、、、どのような基準で拾えばいいのかがわかりません。

長くなりましたが、どうぞよろしくお願い致します。
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://ml.seasar.org/archives/jpa/attachments/20071022/dac57e96/attachment-0001.html 


jpa メーリングリストの案内