 |

|
徹底比較!!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/)のコミッタ。
|
|
|
|