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

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

ネクストデザイン
村山 徹
2006/2/3

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

 Cachéで継承と関連の定義を行うには、Cachéスタジオ(図2)を使ってCaUsecaseクラスとCaScenarioクラスを定義します(リスト4、リスト5)。

図2 Cachéスタジオ

 それぞれのクラスがCaObjectのサブクラスであることは、各定義の1行目にあるExtendsキーワードで宣言されます(リスト4の(1)、リスト5の(1))。

 次に、CaUsecaseクラスとCaScenarioクラスの間に、1対多の双方向関連を定義します。CaUsecaseからCaScenarioへ多重度Nの関連(リスト4の(2))を追加し、同様にCaScenarioからCaUsecaseへ多重度1の関連(リスト5の(2))を追加します。

 これで、図1のオブジェクト・モデルを永続化するための準備ができました。Hibernateの場合(リスト2、3)とは違って、Javaソースファイル(CaUsecase.javaとCaScenario.java)はCachéによって自動生成されます。

Class CaUsecase Extends CaObject
    [ ClassType = persistent, ProcedureBlock ]      (1)

{
Projection CompassProjection As %Projection.Java;
Relationship ScenarioList
  As jp.co.nextdesign.compass.cache.CaScenario
    (JAVATYPE = "java.util.Map") 
    [ Cardinality = many, Inverse = Usecase ];      (2)
}
リスト4 Cachéスタジオでの永続クラス(ユースケース)の定義

Class CaScenario Extends CaObject
    [ ClassType = persistent, ProcedureBlock ]      (1)

{
Projection CompassProjection As %Projection.Java;
Relationship Usecase As jp.co.nextdesign.compass.cache.CaUsecase
    [ Cardinality = one, Inverse = ScenarioList ];  (2)

Index UsecaseIndex On Usecase;
}
リスト5 Cachéスタジオでの永続クラス(シナリオ)の定義

アプリケーションコードを書く

 次に、関連を永続化するアプリケーションコードを作成します。最初に、ユースケースのインスタンス(caUsecase)と、シナリオのインスタンス(caScenario)をそれぞれ1つ生成します。次に、このcaScenarioの親(ユースケース)にcaUsecaseを設定します。その結果、親であるユースケースcaUsecaseは、子(シナリオの集合)の1つとしてcaScenarioを持つようになります(図1参照)。

 Hibernate、Caché、それぞれの場合のアプリケーションコードは、リスト6、リスト7のようになります。

//ユースケースのインスタンスを生成する
CaUsecase caUsecase = new CaUsecase();
caUsecase.setName("レポートを作成する");
session.save(caUsecase);
//シナリオのインスタンスを生成する
CaScenario caScenario = new CaScenario();
caScenario.setName("主シナリオ");
//このシナリオの親(ユースケース)をcaUsecaseにする
caScenario.setUsecase(caUsecase);
session.save(caScenario);
session.flush();              (注2)
session.refresh(caUsecase);   (注2)
リスト6 Hibernateの場合(接続、トランザクション、例外処理部などは省略)

注2: この2行は、シナリオとユースケースの関連を最新の状態にするために必要となる。例えば本事例のように、シナリオとユースケースの関連が変更されるとすぐに、画面の表示内容も変更しなければならないアプリケーションでは必要である。しかし、最終的に永続化できればよいアプリケーションでは、必須とはならない。後にコミットした時点でデータベースに反映できればよいからである。

//ユースケースのインスタンスを生成する
CaUsecase caUsecase = new CaUsecase();
caUsecase.setName("レポートを作成する");
caUsecase.save(db);
//シナリオのインスタンスを生成する
CaScenario caScenario = new CaScenario();
caScenario.setName("主シナリオ");
//このシナリオの親(ユースケース)をcaUsecaseにする
caScenario.setUsecase(caUsecase);
caScenario.save();
リスト7 Cachéの場合(接続、トランザクション、例外処理部などは省略)


  2/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 記事ランキング

本日月間