対決! O/Rマッパー vs. オブジェクト指向DB

第3回 HibernateとCaché、性能比較の結論を出そう

ネクストデザイン
村山 徹
2006/2/3
オブジェクト指向プログラミングとリレーショナル・データベースの相性の悪さは、アプリケーション開発者の悩みの種だ。これを回避する2つの方法、すなわちO/Rマッピングツールとオブジェクト指向データベースを取り上げ、Javaの永続化方式を比較するのが本連載の狙いである。(編集部)

はじめに

主な内容
--Page 1--
はじめに
継承と関連の定義(Hibernateの場合)
--Page 2--
継承と関連の定義(Cachéの場合)
アプリケーションコードを書く
--Page 3--
本事例における設計モデルを比較する
--Page 4--
総合的な性能比較
最後に

 第1回では、永続化が多くのアプリケーション・システムにおいて共通の課題であること、第2回では、簡単なモデル(本事例注1のオブジェクト・モデルの一部)を使って、HibernateとCachéの使用方法を見ていただきました。最終回の今回は、継承や関連といったオブジェクト指向技術の概念やモデル要素の扱いについて、それぞれの使用例を紹介します。そして、どのような観点に立って2つの製品を選択すべきかについて考えてみたいと思います。

注1: 筆者が本稿を執筆するもととなった開発事例「ユースケース記述を作成するためのツール」のこと。詳細は第1回「Javaのオブジェクト永続化に何を選ぶ?」を参照。

 前回までは、ただ1つのクラス(CaObject)について永続化の方法を見てきました。次は、実際のシステム開発では頻繁に登場する「継承」と「関連」の定義方法を見てみましょう。第2回で掲載した「ドメインモデルの一部」を図1として再掲します。ここに示した3つのクラスを含むオブジェクト・モデルを永続化します。

図1 ドメインモデルの一部(第2回記事より再掲)

継承と関連の定義(Hibernateの場合)

 第2回のリスト2で示したXML定義ファイル「CaObject.hbm.xml」に、そのサブクラスとしてCaScenarioとCaUsecaseを追加します(リスト1の(1)、および(3)<joined-subclass>要素)。

 次に、CaUsecaseクラスとCaScenarioクラスの間に、1対多の双方向関連を定義します。つまり、CaUsecaseからも、CaScenarioからも、相手を誘導可能な関連です。具体的には、CaScenarioからCaUsecaseへ多重度1の関連(リスト1の(2)<many-to-one>要素)を追加し、同様にCaUsecaseからCaScenarioへ多重度Nの関連(リスト1の(4)<one-to-many>要素)を追加します。

 CaObjectの場合と同様に、Javaソースファイル「CaUsecase.java」「CaScenario.java」を作成します。(リスト2、リスト3)。

 これで、図1のオブジェクト・モデルを永続化するための準備ができました。

<?xml version="1.0" encoding="Shift_JIS"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
  <class name="CaObject" >
    <id name="id" column="id" type="java.lang.Long">
      <generator class="sequence"/>
    </id>
    <property name="name" type="java.lang.String"/>
    <joined-subclass name="CaScenario">  (1)サブクラスCaScenarioを定義
      <key column="id" />
      <!-- Parent type -->
      <many-to-one name="usecase"
                   class="CaUsecase"
                   column="usecase"/>    (2)関連を定義

    </joined-subclass>
    <joined-subclass name="CaUsecase">   (3)サブクラスCaUsecaseを定義
      <key column="id" />
      <!-- Children type -->
      <set name="scenarioList"
           inverse="true" lazy="true">   (4)関連を定義

        <key column="usecase"/> 
        <one-to-many class="CaScenario"/>
      </set>
    </joined-subclass>
  </class>
</hibernate-mapping>
リスト1 Hibernateでのユースケースクラスとシナリオクラスの定義(抜粋)

import java.util.Set;
public class CaUsecase extends CaObject {
  private Set scenarioList;
  public CaUsecase() {
  }
  public Set getScenarioList() {
    return this.scenarioList;
  }
  public void setScenarioList(Set scenarioList) {
    this.scenarioList = scenarioList;
  }
}
リスト2 CaUsecase.java

public class CaScenario extends CaObject {
  private CaUsecase usecase;
  public CaScenario() {
  }
  public CaUsecase getUsecase() {
    return this.usecase;
  }
  public void setUsecase(CaUsecase usecase) {
    this.usecase = usecase;
  }
}
リスト3 CaScenario.java


  1/4

 Index
対決! O/Rマッパー vs. オブジェクト指向DB(3)
HibernateとCaché、性能比較の結論を出そう
Page 1
・はじめに
・継承と関連の定義(Hibernateの場合)
  Page 2
・継承と関連の定義(Cachéの場合)
・アプリケーションコードを書く
  Page 3
・本事例における設計モデルを比較する
  Page 4
・総合的な性能比較
・最後に


対決! O/Rマッパー vs. オブジェクト指向DB


Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間