Transfer は、clone 関数が用意されている。文字通り、オブジェクトの複製ができる。
get で取得した Transfer のオブジェクトを clone するだけだ。
user = getTransfer().get("user.User", 1);
cloneUser = user.clone();
どんなときに使うのだろうか。
ドキュメントによると、Transfer のオブジェクト(データベースから取得したデータのオブジェクト)は、キャッシュされるらしいのだが、取得したデータを変更してデータベースに保存するまでは、そのキャッシュされたデータをそのままにしておきたい場合に、Clone オブジェクトを使うことで、 データとしての妥当を欠くような変更したり、何も気にしないで自由に変更できるということらしい。
そして、Transfer のオブジェクトが妥当かどうかをチェックするには、validate 関数を使うといいみたいなことが書いてあるけど、これがまた、くせ者。
この validate 関数は、返値がない。妥当性を検証しても妥当かどうかわからないというなんとも意味がないことか・・・。
ソースコードを覗いてみると、主キーの妥当性をチェックしているかのように見えるが、実は、最終的には、なにもしていない。
いちおう、リレーション状態が不正だったりすると、例外がスローされるようだけど、なんだかなぁ。
最終的に、この Clone オブジェクトを save すれば、データベースには、元のデータとして保存できるようだから、使い道はあるのかもしれない。
例えば、変更入力画面で入力した後に、変更前データと、変更入力データを比較するとか・・・。うーん、使い道がわからん。
さて、キャッシュされるらしいと書いたが、ほんとうにキャッシュされるのだろうか。
また、どのようにキャッシュされるのだろうか。
とりあえず、同じ処理を2つ続けてみた。
<cfset item = variables.transfer.get("master.Item", itemId) />
<cfset item2 = variables.transfer.get("master.Item", itemId) />
これだと、ColdFusion のデバッグ情報を見る限り、確かにデータベースに対するクエリは、1回しか発行していない。
キャッシュの保存期間とも言える scope を設定で変えることによって、いろんな使い方ができるだろう。
他にもキャッシュの使い方がいろいろできるみたいだけど、ちょっとやってみた限りでは、よくわからなかった。
またの機会に調査したい。