本腰入れてActiveObjects(その2) @Preloardと@Implementationそしてなぜだか@Ignore
メリクリですね。メリクリ。あんまりそんな気分でもないのだけれども。
前回PreloadアノテーションとImplementationアノテーションについて解説するぜ!って言ってみました。が、たぶんActiveObjects入門とか、「使おうぜ」という本筋からすると、PreloadアノテーションやらImplementationアノテーションはだいぶチガウ位置にいますね。はい。そこは否定しませんが、そんなことは知りません。きっとサンタさんの贈り物です。そのうちおいおい「使おうぜ」編については書くでしょう。
はい。Preloadアノテーションは某女史が、「EntityManger#find()を使って取得したEntityオブジェクト」のGetterを呼ぶ度にSelect文が飛ぶとは何事デスの?と言っていました。何ということでしょう、その通り。EntityManager#find()系のメソッドはEntityの取得はできますが、何も指定していないとキャッシュ領域を使用しないようにIDカラムのみ取得します。Getterを呼ぶ度にSQLを発行しては、その値をメモリにキャッシュしてくれるのです><
普通DBから取得するのは1行まるまるだよね。(これは言い過ぎか。)
SELECT * FROM なんとか
だよねって事で利用するのがPreloadアノテーション。このアノテーションは型に対して修飾する(って表現あってんのかな?)アノテーションで、その1のPersonの例でいうと、
@Preload public interface Person extends Entity{ ... 中略 ... }
とかやるわけですよ。@PreloadのJavaDocによると、valueとして文字列配列が持てて、列名を書いてね、デフォルトは"*"だからね、って書いてあるので、もし列名を指定したければ指定するとよろし。
はい次!Implementationアノテーション。こいつについては実は過去書いてたから飛ばします><ActiveObjectsの変態加減を感じてください。
ActiveObjectsの変態的な考え方にまたまた驚愕 - Fly me to the Juno!
あわせて読んでね、@Ignore編
なるほど。@Ignoreか。 - Fly me to the Juno!
はい、読んでいただけましたか?Implementationアノテーションはインターフェースに対して実装を付加することのできるアノテーション、IgnoreアノテーションはDBとは関係ないメソッドだよ!っていうことをActiveObjectsに教えてあげるアノテーションです。実装の方にはフィールドを定義できるので、この二つを組み合わせると永続化したくないけどメモリ上には持っておくとかできます。また、Entityの親のRawEntityで定義されているinit()は、Implementationアノテーションを使って実装をくっつけることで初めて使われるので覚えておくといいかもしれません。
次回はほんとは先にやるべきだったEntityManager#create(RawEntity