AndroidのORMにもとめること、あるいはOrmaを開発した話 に触発されて、自分がORMに求めることをまとめてみた。
- 速度
- 社内システムでの利用を想定しているので速度要件は特にない
- それよりも開発効率を高める機能性を重視する
- テーブルスキーマ管理
- 別ファイル(XML,YAML)管理はNO
- POJOにアノテーションという形で指示したい
- POJO指示なので、テーブルとオブジェクトは1対1の対応で良い
- スキーマ適用
- POJOのスキーマ指示が、実テーブルに自動反映されて欲しい
- 本番用として自動反映されないようにモードが指示できること
- 同様に本番用としてスキーマDDLが出力できること
- スキーマDDLからも反映できること
- DBハンドル
- REPOを必ず作成するという開発ルールとするならば、ハンドルはオブジェクトとして提供される形でも良い
- staticは便利だが(Model.find(query)など)、実装にはバイトコード操作と独自クラスローダを用意しないといけないため面倒
- オブジェクトにすることでmock差し込みなども容易にできる
- ただし削除や更新などはインスタンスにDB操作メソッドを持たせたい(instance.delete()など)
- テーブル関連
- OneToMany, ManyToOne として関連定義、および取得する機能が必須
- 型安全クエリ
- ネイティブSQLもサポートする
- が、基本はほとんど利用しなくてよい様に型安全クエリが欲しい
- select時のカラム指定など dbhandle.user().name().find("hoge") とかしたい
- カラムのメソッド化などはAPTで出来るが、複数カラムの指定やignoreCase指示など、DSL定義が難しそう。。
- 更新処理はJPAぽく
- 更新処理時にSQL文を書きたくない
- モデルにsetterで更新を行った後に、instance.update()としたい
まとめてみたものの Play + JPA ほぼそのままだね。 自分で実装する際の仕様ということで。