PlayFramework2 徹底入門 その(2)

Capter2

ModelとCRUD、Relationのお話。

今のところ特別難しいところはなし。

気になった点としてはP.97の

[26] ただし、使う際にはインジェクションに注意しましょう。

がさらっと書かれているところでしょうか。 普通に

  /**
   * Add raw expression with an array of parameters.
   * <p>
   * The raw expression should contain the same number of ? as there are
   * parameters.
   * </p>
   * <p>
   * When properties in the clause are fully qualified as table-column names
   * then they are not translated. logical property name names (not fully
   * qualified) will still be translated to their physical name.
   * </p>
   */
  public ExpressionList<T> raw(String raw, Object[] values);

を使った説明でもいいんじゃないでしょうか。 1引数のメソッドもno parameters.と書いてあることですし。 そもそもとしてこの本を読むような人にはそんなの説明不要ですよね。はい。

あと仕様の面でModelのフィールドはなんでpublicなんだろうと思ったら

Ebean ORM を使う

実行時に getter/setter を必要とするライブラリ (ORM、データバインダ、JSON バインダ、等) との互換性を保つため、Play はこれらを自動生成するように設計されてきました。 もしユーザが作成した getter/setter が Model で見つかった場合、Play は競合を避けるために getter/setter を生成しません。

なるほど。 lombokなんかをわざわざ使わなくてもいいと。

警告:

(1) Ebean のクラス拡張はコンパイルの 後 に行われるので、コンパイル時に Bbean が生成する getter/setter を利用できることを期待しないでください。 これらのメソッドを直接コーディングしたい場合は、getter/setter を自分で明示的に追加するか、例えばこれらを別のサブプロジェクトに配置するなどして、モデルクラスがプロジェクトの残りのクラスよりも前にコンパイルされることを保証してください。

(2) Ebean の (遅延評価を可能にする) フィールドに直接アクセスする拡張は、 Java クラスにのみ適用され、Scala には適用されません。このため、(Play 2 の標準テンプレートを含む) Scala ソースファイルからのフィールド直接アクセスは遅延評価を実行せず、その結果、エンティティのフィールドは往々にして空 (未実装) になります。フィールドが実装されていることを保証するには、(a) getter/setter を手動で作成してフィールドアクセスの替わりに呼び出すか、(b) フィールドにアクセスする 前 にエンティティが完全に実装されていることを保証してください。

現実は甘くない…。 IDEに任せるなりするので大した手間ではないですが。