バージョン移行{0.7.6 to 0.7.7}
環境上の注意点
Sql2Entityも一緒に
バージョンアップした際は、GenerateだけでなくSql2Entityも実行して下さい。
古いテーブルを削除
古いテーブルのクラスが残っているとコンパイルエラーになる可能性があります。 それらクラスは不要なので削除するようにして下さい。
build-xxx.propertiesに「torque.isDeleteOldTableClass = true」を定義すると、古いテーブルのクラスを削除(OS上のファイルを削除)します。設定例はこちら
jdbc.diconの旧S2JDBCコンポーネント@Java
今まで、jdbc.diconに「ResultSetFactory(BasicResultSetFactory)」と「StatementFactory(ConfigurableStatementFactory)」を定義しなければなりませんでしたが、こちら不要になりました。
DBFluteはもともとこれらを必要としていませんでしたが、S2Daoとの互換のために定義しなければなりませんでした。今回互換を保ったままその依存を除去したので、jdbc.diconから削除して構いません。無論、残してても別に構いません(利用しないだけ)。
不要なクラス@Java
以下クラスは不要となりました。削除して構いません(残ってても支障ありません)。
- ...allcommon.dbmeta.info.RefererInfo *ReferrerInfoと間違えないように
- ...allcommon.s2dao.S2DaoStatementFactory
実装上の注意点
java.sql.SQLExceptionの扱い@Java
SQLExceptionが発生した時のthrowされる例外が以下のように変わりました。
- 今まで
- org.seasar.framework.exception.SQLRuntimException
- これから
- 通常
- ...allcommon.exception.SQLFailureException
- 一意制約違反
- ...allcommon.exception.EntityAlreadyExistsException(extends SQLFailureException)
SQLRuntimeExceptionをcatchして独自処理するようなことがなければ意識する必要はありません。
もし、SQLRuntimeExceptionをcatchして独自処理しているようであれば、catchする部分の判定の変更をお願いします。ほとんどの場合「一意制約違反」の判定かと思われます。 SQLRuntimeExceptionからSQLExceptionのSQLStateやErrorCodeを辿ってDB依存の判定をするよりも、遥かに判定が簡単(かつDB依存は解決)になっています。
try {
... = member.selectList(cb);
} catch (EntityAlreadyExistsException e) {// 一意制約違反
...独自処理
}
本来は、SQLRuntimeExceptionを継承した例外にしたかったのですが、残念ながらSQLRuntimeExceptionはfinalクラスでした。 よって、上記のような移行が発生してしまう可能性がありますが、今回は利便性を優先させて頂きました(誠に申し訳ありませn)。
独自の例外に変更したことによって、わかりづらかったエラーメッセージを改善することもできました。
Oracleの場合の一意制約違反のエラーメッセージ
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
The entity already exists on the database!
[Advice]
Please confirm the primary key whether it already exists on the database.
And confirm the unique constraint for other columns.
[Statement]
oracle.jdbc.driver.OraclePreparedStatementWrapper@19ce47a
[Resource]
com.example.dbflute.oracle.dbflute.exentity.Member
{1240,testName,testAccount,FML,null,null,2008-07-26 08:19:09.218,testUser,UniqueConstraintTest,2008-07-26 08:19:09.218,testUser,UniqueConstraintTest,0}
[SQLState]
23000
[ErrorCode]
1
[SQLException]
org.seasar.framework.exception.SSQLException
[ESSR0072]SQLで例外(SQL=[insert into MEMBER (MEMBER_NAME, MEMBER_ACCOUNT, MEMBER_ID, MEMBER_STATUS_CODE, REGISTER_DATETIME, REGISTER_USER, REGISTER_PROCESS, UPDATE_DATETIME, UPDATE_USER, UPDATE_PROCESS, VERSION_NO) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)], Message=[1], ErrorCode=23000, SQLState={3})が発生しました
[NextException]
java.sql.SQLException
ORA-00001: 一意制約(EXAMPLEDB.SYS_C0010726)に反しています
* * * * * * * * * */
もし、SQLRuntimeExceptionをcatchしてる箇所が多すぎて修正しきれないという場合は、もとの挙動に戻すことも可能です。 以下の設定をしてから自動生成し直して下さい。
SQLRuntimeExceptionモードに戻す @ビルドプロパティ
torque.isCompatibleSQLExceptionHandlingOldStyle = true
一意制約違反のDB依存判定のテストはこちらです。