 |

| | 徹底比較!!Ruby on Rails vs Javaフレームワーク | 第1回:O/Rマッピング 著者:アスタリクス 大西 正太 2006/8/23
|
|
|
| 前のページ 1 2 3 4 次のページ |
 |
| Hibernateのマッピング記述 |
HibernateではXMLにオブジェクトとテーブルの紐付けに関する情報を記述します。
HibernateはRails登場以前から普及しているため、CoC的な考えがあまりありません。カラム名とプロパティ名を同一にすると、XML記述の一部を削減することができますが、全体からすると微々たるものです。
以下にHibernateを用いた場合のソースコードを示します。Zooクラス自体はきれいにPOJO(Plain Old Java Object)にまとまっているのですが、アクセッサ(getXXX/setXXX)の記述が冗長です。また、どうしても定義ファイルの記述量が膨らんでしまっています。 クラスファイルpublic class Zoo { private int id; private String name; private String address; private Set animals;
public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } (中略) public List getAnimals(){ return animals; } public void setAnimals(Set animals){ this.animals = animals; } }
|
マッピングファイル<hibernate-mapping> <class name="Zoo" table="ZOO"> <id name="id" type="int" > <generator class="assigned" /> </id> <property name="name" /> <property name="address"/> <property name="animal" /> <set name="animals"> <key column="zoo_id"/> <one-to-many class="Animal"/> </set> </class> </hibernate-mapping>
|
|
| JPAのマッピング記述 |
JPAは最近策定された仕様ということもあり、Hibernateに比べCoCに対応しています。JPAではJava SE 5.0から導入された「アノテーション(@XXXの部分)」を用いてマッピング情報を記述します。そして定められた規約にのっとっていれば、ほとんどのアノテーションを省略することができるのです。
アノテーション記述を省略するための規約(一部)を下記に示します。
- テーブル名とクラス名を同じにする
- カラム名とプロパティ名を同じにする
- 外部キー名はテーブル名+主キー名とする
表3:アノテーション記述を省略するための規約(一部)
JPAを用いた場合のソースコードは以下のようになります。
@Entity public class Zoo {
private int id; private String name; private String address; private List<Animal> animals;
@Id(generate = GeneratorType.AUTO) public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } .... @OneToMany public List<Animal> getAnimals(){ return animals; } public void setAnimals(List<Animal> animals){ this.animals = animals; } }
|
表3の規約にのっとっているので、アノテーションをほとんど記述することなく、Zooクラスとテーブルが紐付いています。ただし、やはりアクセッサの記述は必要です。また、@OneToManyアノテーションによって、Animalオブジェクトのコレクションを取得できるようになっています。
|
| マッピング記述の比較結果 |
ここまで各製品のマッピング記述を見てきました。コード量を見るとActiveRecordが群を抜いて少ないことがわかります。また多量の定義ファイルが必要なHibernateに比べれば、JPAもかなり奮闘しているのではないでしょうか。
一方、ActiveRecordとJPAを比べると、アクセッサの動的生成部分で差がついているのがわかります。
元々Javaは静的型付言語ですので、実行時にメソッドを追加することができません。つまり少なくとも現行の言語仕様では、アクセッサ記述部分の差を埋めることは不可能です。
CoCの優劣を決める大きな尺度の一つは「規約からどこまで実装削減を展開できるか」であると考えます。ActiveRecordは動的言語であるRubyが持つ強力なリフレクション機能のおかげで、CoCの効果を最大限まで活かしているといえるでしょう。
※注3:HibernateではHibernate ToolsやMiddleGenといったオープンソースのツールを用いることでマッピングファイルを自動生成できるため、記述の労力は軽減可能です。
|
前のページ 1 2 3 4 次のページ
|

|
 |

| 著者プロフィール 株式会社アスタリクス 大西 正太 JavaEEフレームワークの設計構築や開発プロセス策定などの業務を経て、現在は新規ビジネス創生に携わる。Ruby on Rails上に構築したオープンソースのCMS「Rubricks」(http://rubricks.org/)のコミッタ。
|
|
 |
|
 |
|
 |
|