Entry

プログラミング・メモ - DTO とカラム名を関連付ける方法を考える

2008年01月06日

ちょっと野暮用で,Java 向けの汎用 DAO(Data Access Object)ができんもんかとあれこれ考えています。DAO ってのは,データソース(大抵はデータベース)にアクセスするためのクラスのこと。普通に作る分にはそれほど手間はかからないんですけど,80や100といった,割とたくさんのテーブルを扱うとなると,どうしても冗長になってしまいます。冗長なクラスをたくさん作ると,バグが入り込む可能性も高まるわけで,同じような処理は手っ取り早くまとめちゃおう,という話だったのでした。

DAO というと,最近は Hibernate みたいな O/R マッパを使うのが一般的なのかもしれません。けど,これは XML の外部設定ファイルを作らなくちゃいけなかったり,できることが高水準なもんにとどまったりするもんで,なかなかしっくりこなかったのでした。今回の野暮用は,SQL やリレーショナルモデル等々について割と詳しい人が使うことが前提になっているので,低水準でも融通が利くもんにしたいところです。

とりあえず作ったところでは,汎用にするために,GenericDao という抽象クラスを用意して,これを継承する感じで具体的なテーブル操作用の DAO を実装することにしました。で,今ちょっと唸っているのは,DTO(Data Transfer Object)のフィールドとテーブル用のカラムを関連付ける方法。

まず,カラム名をどのクラスに持たせるかを考えます。Hibernate では XML に書くところですね。こういうもんは,あちこちに書かないように,どこかにまとめておく必要があります。おそらく,DTO かサブクラスで実装する DAO のどちらかに持たせることになるんだと思います。各テーブルで共通化できない情報ですから,抽象クラスには持たせられない,といった理由だけなんですが。

で,考えると,DTO にテーブルのカラム名を持たせるのは,あまりいい考えじゃないんじゃないかと思ったりします。考え方にもよるんでしょうけど,DTO を扱うクライアント(プログラム)側には,データベース(というかデータソース)の存在を意識させるべきではないからです。これに対して,「MyWiki.jp - 知識共有WIKI Wiki - Dtoとは?」では,DTO にカラム名を持たせることにしているようです。どういう意図かは分からないんですけど,あたしゃ,DAO でカラム名と DTO のフィールドを関連付けるようにする方がいいかなー……と。

ということで,次に考えるのが,どうやってカラム名と DTO のフィールド名を関連付けるかということ。

はじめに考えたのは,DTO のフィールド名からカラム名を作って関連付けることです。例えば,フィールド名が empId だったら,カラム名が emp_id になるように変換するメソッドを作って関連付ける,と。ただ,この方法だと,DTO でカラム名が固定されてしまうので,ちょっと都合が悪かったりします。命名規則もちゃんと決まっているようで,実際はまちまちなので(略語をすべて大文字にするか,とか,数字の扱いとか),形式的に変換するのには向かない気がします。

そんなもんで,とりあえずは,DTO のフィールド名とカラム名を手書きで HashMap に収めておいて,フィールドへはリフレクション経由で setter/getter にアクセスするように,ぼちぼち実装してみました。ここでは見せられないけれど,一応,動くには動く。ただ,これにしても,DTO のフィールド名を2回書く必要があるので,バグを作る可能性は払拭できません。

個人的には,結構いいとこまでいってる感じがするので,あともう一押し。いい方法はないもんか……。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN