[DBFLUTE-294] {Java}: 一意制約違反の場合に、独自の例外を発生させる Created: 2008-07-23  Updated: 2008-08-07  Resolved: 2008-07-24

Status: Closed
Project: DBFlute
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Improvement Priority: Major
Reporter: jflute Assignee: jflute
Resolution: Fixed Votes: 0
Labels: None


 Description   

やはり、一意制約違反の例外であることをcatchして処理したいことが多い!
発生させるExceptionは、互換性のために現状発生しているSQLRuntimeExceptionを
継承したExceptionであること。

http://ml.seasar.org/archives/jpa/2008-April/000096.html
MySQL: 1022 & 1062

http://www.robbie.jp/developerGuide3.html
Oracle: 1

しかし、ErrorCodeで判断するべきかと思っていたが、
S2JDBCの実装を見るとSQLStateの先頭2桁が「"23", "27", "44"」で判定している。
これは正しい(信頼できる)のかどうかをきっちり調査しないといけない。
S2JDBCとしては確信的にこの仕様で実装しているようだが、
http://ml.seasar.org/archives/seasar-user/2007-December/011988.html
案の定、以下にて問題が発生しているが、特になんの返信もない。
http://ml.seasar.org/archives/seasar-user/2008-March/013477.html

ErrorCodeで実装するか、SQLStateで実装するか悩む。
基本的には、狭い範囲で実装して随時確実なものを
追加していく方が良いかもしれないのでやはり「ErrorCode」方式か!?
いざってときのために、ConfigでErrorCodeの候補を設定できるようにするのがベスト。

[ErrorCode]
A. 独自実装で頑張る必要がある。
B. 実際のDBで検証した値を利用すると、パターン網羅が狭い可能性あり

[SQLState]
A. 参考実装があるので実装は楽
B. 信頼性が不明。網羅性はありそうだが余計なものまで巻き添えになる可能性あり。



 Comments   
Comment by jflute [ 2008-07-24 ]

「2008/07/23 23:56」の時点から、ちょと方針修正。

「それぞれのDBごとに「適切な判定」をすることにした」
は変わらず。

「DBFluteConfigで以前の動きに戻すことが可能」
も変わらず。

一律、SQLのExceptionをSQLFailureExceptionというDBFlute独自の例外にし、
EntityAlreadyExistsExceptionはそのサブクラスとした。
SQLRuntimeExceptionは基本的にthrowされない。
DBFluteConfigで、以前の通りSQLRuntimeExceptionがthrowされるように
なるが、その場合はユニーク制約判定は各自で行うことになる。
(SQLRuntimeExceptionがfinalクラスで継承できないため互換性はオプションで保つ)

Comment by jflute [ 2008-07-24 ]

バッチ更新は対象外とする。
(要望があれば将来的にサポートは検討する)

Comment by jflute [ 2008-07-23 ]

それぞれのDBごとに「適切な判定」をすることにした。
SQLRuntimeExceptionとの互換性はないが、DBFluteConfigで
以前の動きに戻すことが可能。移行の注意点として強調する。

http://dbflute.sandbox.seasar.org/download/dbflute/dbflute-0.7.7.zip
よりダウンロード可能

以下、主要DB全てで同じテストを実行してグリーン!

// H2
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-basic-example/src/test/java/com/example/dbflute/basic/dbflute/various/UniqueConstraintTest.java

// MySQL
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-mysql-example/src/test/java/com/example/dbflute/mysql/dbflute/various/UniqueConstraintTest.java

// Oracle
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-oracle-example/src/test/java/com/example/dbflute/oracle/dbflute/various/UniqueConstraintTest.java

// PostgreSQL
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-postgresql-example/src/test/java/com/example/dbflute/postgresql/dbflute/various/UniqueConstraintTest.java

// SQLServer
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-sqlserver-example/src/test/java/com/example/dbflute/sqlserver/dbflute/various/UniqueConstraintTest.java

// DB2
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-db2-example/src/test/java/com/example/dbflute/db2/dbflute/various/UniqueConstraintTest.java

Comment by jflute [ 2008-07-23 ]

> 案の定、以下にて問題が発生しているが、特になんの返信もない。
> http://ml.seasar.org/archives/seasar-user/2008-March/013477.html

読んだソースも古くて(2.4.24)、最新のだとエラーコードも考慮されていた。
(ほぼ自分の頭で描いていたものと一致したので少し安心)

Comment by jflute [ 2008-07-23 ]

おおよそ、対応の方針は決めたが、
SQLRuntimeExceptionがfinalクラスなので、互換性が保てない。。。
下位互換モードと移行の注意点をきっちり整備する必要あり。

Comment by jflute [ 2008-07-23 ]

おっ、ありがとうございます。
スレッドが切れてたのですね。

Comment by koichik [ 2008-07-23 ]

> 特になんの返信もない。
http://ml.seasar.org/archives/seasar-user/2008-April/013527.html

Comment by jflute [ 2008-07-23 ]

MySQLも23000で区別が付かないようである。
http://dev.mysql.com/doc/refman/5.1/ja/error-messages-server.html

Generated at Mon Dec 15 07:56:07 JST 2025 using Jira 10.6.1#10060001-sha1:a6461e220f274b29ced7ac9295492f2465fe5ef5.