TOPシステム開発> Hibernateのマッピング記述
徹底比較!!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のマッピング記述
  データ照会方式の比較