Scala + Wicket + Squeryl を試してみた

 私は前々から WicketScala と相性がいいに違いないと言ってはいましたが、未だに試していなかったのでこの連休を利用して試してみました。ORM は最近 Doma がお気に入りだったのですが、Scala では APT が使えないので Squeryl を試してみました。

とにかく直列化が鬼門

 Wicket といったら、とにかく Serializable です。Scala の場合は、直列化可能なクラスには @serializable を付けるのがお約束です。ところが、これは java.io.Serializable を実装するのとは意味が違っているようで、Model に食わせることができないのですね。

 それから、WicketScala ネイティブなフレームワークではないので、ほうぼうで Java コレクションが使われているわけです。Scala には Scala コレクションを Java コレクションに変換する機能があるわけですが、この変換結果が Wicket から見ると Serializable じゃないので、警告ログが出てしまいます。なので、コピーコンストラクタを使ったりするはめになり、オーバーヘッドがちょっと気になるところ。

 Squeryl は「Scala ORM」でググッたら一番初めに出てきたので使ってみただけなのですが、仕組み的にはとても好みに合いました。Doma と同じく、フィールドにドメインオブジェクトを使用することができ、さらにエンティティをイミュータブルにできるってのが良いです(これは私の Doma の不満点のひとつでした)。ところが、こいつ、SerialVersionUID すら永続化しようとするのですよ。エンティティ中の永続化しないプロパティをアノテーションによって指定することができるのですが、Scala は SerialVersionUID をアノテーションで指定するので、これで永続化対象で外すことできなさそうです。なので、Wicket でちょいと使いにくいかなと思いました(とりあえず、@serializable だけをつけて @SerialVersionUID をつけないようにして回避しています)。