S2JDBCでデータベーススキーマ中心の開発
S2JDBCはJavaを修正→DB修正っていう方針だけれど、使い始めてからずっと逆向きでやっている。
やり方をメモ。
制作中のワークフローは
という流れ。
サービスが稼働し始めたら
という流れになる。稼働後の修正は書き換え箇所が少ないので手動でエンティティのコードとNamesを修正している。(Namesは再生成でもいいかも)
- serviceパッケージ直下に生成されたサービスクラスは基本いじらない。
- AbstractServiceクラスでselectメソッドをpublicでオーバーライドする。
- 一度しか使わないselect系処理はページ用クラスに書く。(複数の画面で似たようなselect文を使う場合でも、微妙にjoinが異なることが多いので)
- service.impl に独自クラスを作りトランザクション管理が必要な複数更新系メソッドを書く。
- 必要ならgenタスク実行前にservice直下のファイルを削除(プライマリキーを変えた場合)、entityのファイルを削除(テーブル構成を変えるとエラーが出ることがある)。
- ※1 では、生成したDDLでテーブルを作り直し、テストデータを入れたりシーケンスの初期値を設定したりしている。
- ※2 では、gen task を ant run したあと、@Generatedアノテーションを消したり、OneToOne関連の不要なGenerationType.IDENTITY消したり、自己関連設定時に*Names.javaに生成される不要なimportを消したりしている。
現状はこんな感じでやっている。
DBFluteを使えばいいという話かもしれないが、こっちはサンプルを少し動かしただけでやめてしまった。SQLの組み立て方はS2JDBCの方が合っているし、シンプルで自由な方がいい。
ただequalsとhashCodeはEntity用のメソッドが欲しい。これはInterTypeで対応できるだろうか。エンティティはコンポーネントじゃないから無理だね…。