第1回:O/Rマッピング (3/4)

徹底比較!!Ruby on Rails vs Javaフレームワーク
徹底比較!!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/)のコミッタ。


INDEX
第1回:O/Rマッピング
  はじめに
  アーキテクチャの比較結果
Hibernateのマッピング記述
  データ照会方式の比較
徹底比較!!Ruby on Rails vs Javaフレームワーク
第1回 O/Rマッピング
第2回 JSFとRailsで比較(前編)
第3回 JSFとRailsで比較(後編)
第4回 DIコンテナとの比較
第5回 テストフレームワーク
第6回 RailsとGrailsの比較(前編)
第7回 RailsとGrailsの比較(後編)
Ruby on Rails入門
第1回 Railsが注目されている理由
第2回 すぐできるアプリケーション作成
第3回 アーキテクチャと検索機能の追加
第4回 Railsでテストをしてみよう
第5回 Ajaxアプリケーションの作成
第6回 プラグインでさらに生産性アップ
第7回 Linux環境で動作させよう

人気記事トップ10

人気記事ランキングをもっと見る