毎年恒例となりましたオブラブ名物「クリスマスイベント」の申し込みが、いよいよスタートしました。下記イベントページから、参加登録のページにお進みください。オブジェクト倶楽部秋イベントが、11月17日(金)に開催され、大盛況のうちに終了いたしました。トーカーの皆さま、ならびに参加者の皆さま。加、誠にありがとうございました。サイトにて、イベントの資料の公開を始めましたので、ご案内いたします。オブジェクト倶楽部事務局の上田雅美が、S-openホットセッションにて講演してきます。┗【プログラミング】Cayenneで始めるO/Rプログラミング[6]ナンバーポータビリティが始まって、およそ一ヶ月。おもったよりもキャリア変更している人は身近にはいません。みなさんの周りはどうですか?もちろん料金も一つの判断材料になると思うのですが、やっぱり普段身に着けているものですから、デザインも重要ですよね。海外の噂サイトでは、アップルの携帯電話iPhoneの話題がいつも話題になっています。最近ではiPhoneはiChatを搭載するようだ、とか200万画素のカメラが搭載されるようだ、とか様々です。アップルの携帯電話が出たら、キャリア変更する!という人は結構いるのでは?と思っています。能は付かない、と噂サイトは見ているようです。前回は、モデルの関連先がどのようにマッピングされるか、という関連技術の一端を見てみました。今回、はオブジェクトモデルを永続化することを考えます。具体的なシナリオがあった方が、わかりやすいと思いますので、「入会して借りる」というケースを実現してみることにしましょう。このケースは「入会する」と「借りる」を、同時に実現するモデルと思ってください。この二つのユースケースは、これまでに登場しました[*1]。二つのユースケースを続けて実行すれば、それで終わり、という考え方もできます。会と借りるの間には、厳密な依存関係がある訳ではないので、借りるが失敗しても、入会だけは先に成功していても問題ないような気がします。そのままだと、今回の話は先に進めないので、この二つのケースが一つのトランザクションで実行される、つまり借りるが失敗した場合、入会も取り消す、というシナリオであるという前提で考えます。理で記述されている内容を呼べるようにしましょう。作成したMemberを戻せるようにします。context)関数です。readerとcontextを受け取って、main()でmemberの登録を実行します。続けて、VideoLenderクラスを修正します。このシナリオでは、入力された会員IDがデータベースに存在しない場合、新規登録を動かすことにしてみましょう。したMemberRegisterのmainを、呼び出します。登録した会員オブジェクトを取得して、後は貸出オブジェクトにセットすれば良いのですが、ここで多少工夫が必要になります。context.localObjectはデータコンテキスト内で、指定したオブジェクトIDとオブジェクトの参照関係を一時的に登録とみなします。このようにローカルオブジェクトを登録するか、というと、今回のビデオレンタルシステムでは、ビデオIDや会員IDを自動連番でなく、手動で与えています。実際にデータベースに登録するまで、主キーの項目は設定されていないからです。出の両方に会員IDをセットして関連を自動的に保持してくれます。今回のように手動でキーをセットする場合は工夫が必要なのです。出クラスへ会員の関連を追加する場合、lending.setToMember(member);を使います。memberは新規オブジェクトです。永続化されていないオブジェクトです。Cayenneは、コミット時に貸出の関連先である会員のオブジェクトの状態を取得して、データベースへ更新の必要があるかを判断しようとします。このとき自動連番なら、貸出→会員の関連で取得した主キーが設定されていないので、主キーの値を持つレコードを参照しません。手動で設定した場合は、コミット前の設定されているキー項目の値は、関連先のレコードを探してしまいます。すると、レコードが見つからないので、エラーになってしまいます[*2]。そこで、データコンテキストに、コミット前のローカルオブジェクトへの参照を登録します。このようにすることで、貸出から主キーで会員への参照が可能となり、上記のエラーを回避することができます。実際にVideoLenderクラスを実行してみましょう。committed.どうですか?一つのトランザクション内で、二つのINSERT文が実行されると思います。このようにO/Rマッピングを利用すると、オブジェクトの関連をセットするだけで、自動的にオブジェクトの状態を検査し、適したSQL文を生成してくれるのです。このシナリオでは、全て新規作成だけだったので、インパクトが薄いかもしれません。複雑に入り乱れていたらどうでしょうか?もしO/Rマッピングの機能を利用せずに、自らオブジェクトの状態を管理し、SQLを場合分けして実行しなければならないとしたら、それだけで大変な労力とテストが必要になることは、想像できるでしょう。このように、O/Rマッピングを使うことは、オブジェクトからデータベースという「構造の違いよる永続化の実装の複雑さ」から、プログラマの労力を解放してくれる、一つの手段なのです。今回もそろそろ時間となりました。次回はJDBCプログラミングで言うところのテーブルジョインを使った、複雑な検索方法について解説したいと思います。(きしだ)[*1]:該当号の過去ログは、下記URLより確認ください。http://www.objectclub.jp/ml-arch/magazine/169.html[*2]:今回使用しているVersion1.2は、NullPointerExceptionを引き起こします。断してくれれば良いのですが、何か理由があってのことかもしれません。次のバージョンでは解消されている可能性もあります。_______________________________________________________________________この記事への評価にご協力をお願いします。URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用のブラウザに表示されれば投票完了です。-壁にぶち当たったら、質問だ!クリスマスや年末年始の過ごし方の話題が飛び交うようになりました。今年もラストスパートなんですねぇ。12月はビールとスパークリングワインの泡で消えてしまわないように、落ち着いて過したいものです。●壁にぶち当たる前回に引き続き、実際にあった出来事を題材に「壁にぶち当たったとき」ということを取り上げてみたいと思います。今度も、前回とは違うお客様のエピソードを取り上げてみましょう。皆さんにも、こんな体験はありませんか?Aさん。