ColdFusion ORMを試してみる

2011.08.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ColdFusion 9では、今まで以下のような方法でデータベースアクセスを実現していました。

  • SQL ステートメントを処理する cfquery、cfinsert、cfupdate などのタグでアクセスする。
  • ColdFusion コンポーネント (CFC) を使用してアクセスする。
  • 基本的な CRUD (Create、Read、Update、Delete) 操作も含め、CFC ごとに SQL クエリーを記述する。

ColdFusion 9からはORM(オブジェクトリレーショナルマッピング )がサポートされ、アプリケーションのオブジェクトモデルのみを利用してデータへのアクセスや更新等が可能で、ORM には次のような特徴があります。

  • データベースベンダに依存しない
  • キャッシュ
  • 並行処理
  • パフォーマンスの最適化

自身でプログラムするときは当然cfqueryやCFCを使ってきました。まぁこれを使えばどんな感じになるかが分からないので、実際にサンプルを作って以前のレガシー手法と何が違うのかを実感してみようと思います。
※データベースに保存して使用したいプロパティを持つCFCを定義するだけで、後の作業はHibernateが実行してくれます。

サンプルのテーブルは以下を使用しました。

さっそくセレクトを行ってみます。
まずはApplication.cfcにORM設定を指定します。
[ColdFusion] [/ColdFusion] ※これらの設定はApplication.cfcでのみ定義し、Application.cfmでは定義してはいけません。

次にORM_TEST1.cfcをデータベースのテーブルにマッピングします。
[ColdFusion] [/ColdFusion]

これで前準備は完了です。実際にセレクトしてみます。ORM_TEST1テーブルからデータを取得するには、EntityLoad() を使用します。(全件取得)

sample3.cfmは以下の通り
[ColdFusion] orm_test1 = EntityLoad("ORM_TEST1"); [/ColdFusion]

実行結果

非常に少ないコードでデータをもってこれることが分かりました。
次はデータの登録を行ってみます。sample4.cfmとして保存します。(登録はEntitySave()を使用します。)
[ColdFusion] try { newORMObj = EntityNew("ORM_TEST1"); newORMObj.setName("yamada"); newORMObj.setDivision("technical"); newORMObj.setPhone("03-8765-4321"); EntitySave(newormobj); ormflush(); } catch(Exception ex) { WriteOutput("

#ex.message#

"); } [/ColdFusion]

データベースへの登録もできています。
ここまでSQLは一切書かずにセレクトとインサートができました。

このサンプルで、ORM_TEST1テーブルはORM_TEST2テーブルとの間に1対nの関係を持ち、外部キー列"ID"を使用して結合されているとした想定場合、 各担当者(ORM_TEST1)の顧客オブジェクト(ORM_TEST2)の配列を格納する新しいプロパティをORM_TEST1.cfcに追加する必要があります。

[ColdFusion] [/ColdFusion]

fieldtype="one-to-many" では、関係のタイプを指定しています。
cfc="ORM_TEST2" は、「ORM_TEST2」cfcとの間に関連があることを示しています。
fkcolumn="ID" では、外部キーを指定しています。

また、ORM_TEST2テーブルはORM_TEST1テーブルに対してn対1の関係にあります。この関係を定義するには、"ORM_TEST1.cfc"との関係を定義するプロパティを "ORM_TEST2.cfc"に追加します。

[ColdFusion] [/ColdFusion] ※lazy="true"は関連付けを遅延ロードするかどうかの指定です。
lazy:コレクションマッピング、1対n関係、およびn対n関係に適用されるデフォルトの遅延ロードです。この場合は、コレクションまたは関係のアクセサを呼び出すと、コレクションが完全にロードされます。したがって、特定の担当者に対して EntityLoad() を呼び出しても、その時点ではその担当者に属する顧客はロードされません。orm_test1.getorm_test2() を呼び出すと、その担当者に属するすべての顧客オブジェクトがロードされます。

Spring Rooも10分足らずでCRUD機能を実装できるっぽいので、ColdFusionもなんとか時代の流れについていっているって感じでしょうかね。。。

とりあえずマスタメンテナンス等の単純なものには有力な実装方法ではないかと感じました。