Scala + Wicket にあう ORM を探す

 面白みがないので JPA はとりあえずおいときます。Doma がお気に入りなので、Doma が念頭にあったりします。それを踏まえて Scala + Wicket にあう ORM を探しています。文中でいう「エンティティ」とはレコードと紐づくクラスのことです。

Squeryl

 Wicket で利用するなら直列化に関する仕組みがしっかりできていないといけません。Squeryl その点でポロポロ問題がでました。以前もとりあげましたが、まず、エンティティに定義している serialVersionUID がなぜか永続化対象になってしまいます。これはバグでしょう。それから、エンティティのフィールドにカスタム型(ユーザ定義型)が使えるのですが、そのカスタム型が必ず継承しなければならないクラスが Serializable ではないのでカスタム型を使用したエンティティは直列化できなくなってしまいます。

 結論としては現時点では Squeryl は Wicket との相性は悪いです。ただ、以下の ORM に比べると、エンティティをイミュータブルにできたり、フィールドの型に Option 型を使用することができるなどとても Scala 的です。今後に期待しています。

Circumflex ORM

 Circumflex という Web アプリケーション・フレームワークがあるのですが、その ORM を単独で使うことができます。ドキュメントが少なく、トランザクション管理のやり方を見つけるまでずいぶん苦労しました。「やりすぎ」と評される DSL っぷりですが、その分、直感的な使い方ができたりもします。おそらく必要になったときに DB セッションが始まるという仕組みになっていて、リクエストサイクルリスナでコミットやロールバックしてあげればどこでセッションがどれだけ使われるかわからないような Wicket にはうってつけの仕組みだと思います。

 Squeryl のようにエンティティをイミュータブルにすることはできなさそうです。また、デフォルトで対応している型が少ないのもネックで BINARY(byte 配列)型にも対応していません。

MyBatis

 iBatis あらため MyBatis です。これは Scala ネイティブではありません。非常に柔軟で、エンティティに縛りがほとんどありません。ただ、そもそも Java 用ですので(.Net 版もあるが)Scala 側から歩み寄らなかればならない点もいくつかあります。フィールドにカスタム型が指定できますが Option 型を扱うためのいい方法が私には見つかりませんでした。

 Guice との連携も簡単で、これ単独で AOP によるトランザクション境界も設定できて Wicket との相性は良いです。Scala 的でない部分に目をつぶれば良い選択肢だと思います。