mirage-scalaではこれまでもケースクラスをエンティティに使うことはできましたが、Mirageでインスタンスを生成するために以下のようにデフォルトコンストラクタを用意しておく必要がありました。
@Table(name="BOOK") case class Book( @(PrimaryKey @field)(generationType = IDENTITY) bookId: java.lang.Long, bookName: String, author: String, price: Option[Int]) { // これが必要 def this() = this(null, null, null, None) }
が、これはちょっとイマイチなのでMirage本体に少し手を入れて以下のようにデフォルトコンストラクタなしでも行けるようにしてみました。
@Table(name="BOOK") case class Book( @(PrimaryKey @field)(generationType = IDENTITY) bookId: java.lang.Long, bookName: String, author: String, price: Option[Int])
mirage-scalaではフィールドをMirageから直接リフレクションで読み書きすることで「Scala側ではvalだけど、Mirageからは通常のJavaBeanと同じく可変プロパティとして使う」というような感じになっています。
なのでエンティティを生成する際もデフォルトコンストラクタでインスタンスを生成したあとフィールドに値をセットするというようなことをしており、そのためにデフォルトコンストラクタが必要だったのですが、Mirage側でデフォルトコンストラクタ以外のコンストラクタしか見つからなかった場合でもプロパティの型に応じた初期値(ValueTypeによって供給されます)を引数にコンストラクタを呼び出すことでインスタンスを生成することが可能になっています。
あとは、アノテーションの指定方法がいまいち(@fieldをつけないといけなかったりとか)なのをなんとかしたいですね。主キーもINSERT時に自動採番する場合にnullとかNoneをセットするのもいまいちなのでAnormみたいにPk型とかでラップするようにしたほうがよいのかも…。