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

第2回 HibernateとCaché、Javaとの好相性はどっちだ

ネクストデザイン
村山 徹
2006/1/13

ステップ3 テーブルを作成する

 RDBMS上のテーブルは、Hibernateに含まれるツール(schemaexport)によって自動的に作成されます注3。schemaexportは、CaObject.hbm.xmlなどの定義情報を基に、指定されたRDBMS上にテーブルを作成します。

注3schemaexport用のプロパティファイル(hibernate.properties)が必要です。

hibernate.dialect net.sf.hibernate.dialect.FirebirdDialect
hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
hibernate.connection.url jdbc:firebirdsql://localhost/C:/compass.fdb
hibernate.connection.username sysdba
hibernate.connection.password masterkey
hibernate.properties

また、データベースの作成(CREATE DATABASE)は事前に必要です。今回使用したRDBMS(Firebird)の場合、

CREATE DATABASE 'c:\jp-co-nextdesign-compass\compass.fdb' user 'sysdba' password 'masterkey';

としておく必要があります。

ステップ4 アプリケーションコードを書く

 CaObjectのインスタンスを1つ生成し、それを永続化するコードを作成します(リスト4)。

Configuration config = new Configuration();                    (1)
config = config.configure();                                   (2)
SessionFactory sessionFactory = config.buildSessionFactory();  (3)
Session session = sessionFactory.openSession();                (4)
Transaction transaction = session.beginTransaction();          (5)
CaObject caObject = new CaObject();                            (6)
caObject.setName("レポートを作成する");                           (7)
session.save(caObject);                                        (8)
transaction.commit();                                          (9)
session.close();                                              (10)
リスト4 CaObjectのインスタンスを永続化するコード

ステップ5 実行する

 リスト4のコードが実行されると、以下の処理が行われます。

(1)(2) hibernate.propertiesが読み込まれる(クラスパス上に存在する場合のみ)
(3)(4) hibernate.cfg.xml が読み込まれる
(5) トランザクションが開始される
(6) CaObjectのインスタンスが生成される
(7) 属性nameが設定される
(8) ID(主キー)が決定される
(9) トランザクションがコミットされる(INSERT文、UPDATE文が発行される)
(10) セッションが終了される

 これで永続化できました。ここまで、テーブル名やSQL文を意識する必要はありませんでした。また、リスト4のコードは、永続化しない場合のコード(第1回のリスト1)に対して、接続やトランザクションに必要なコードを追加しただけです。これらの点からも、HibernateはO/Rマッピングツールとしてよく洗練されたツールだといえます。

 ところで、接続やトランザクションを除けばリスト3やリスト4の中には、RDBMSを想像させるようなコードは見当たりません。Hibernateは、JavaリフレクションCGLIBによって実行時(3)(4)にCaObjectクラスを拡張し、この拡張されたクラスとSessionオブジェクト(PersistenceManager)、Transactionオブジェクトなどが協調することで、実際の永続化(SQL文の生成と発行など)を行います。(6)(7)(8)でSQL文が生成され、(9)で実際に実行されることになります。

 Hibernateの場合、CaObjectが永続化のための特別なインターフェイスを実装する必要や、特別なクラスを継承する必要はありません。また、後述するCachéのようにCaObjectクラスのソースコードを自動生成することもありません。Hibernateは、CGLIBによって実行時にクラス(リスト3)を拡張し、その拡張されたクラスが永続化のための責務を遂行します(CGLIBの詳細についてはほかの情報源を参照してください)。(次ページへ続く)

  2/3

 Index
対決! O/Rマッパー vs. オブジェクト指向DB(2)
HibernateとCaché、Javaとの好相性はどっちだ
  Page 1
・はじめに
・Hibernateを使ったJavaオブジェクトの永続化
  ステップ1 ドメインモデルを作成する
  ステップ2 永続クラスとマッピング情報を作成する
Page 2
  ステップ3 テーブルを作成する
  ステップ4 アプリケーションコードを書く
  ステップ5 実行する
  Page 3
・Cachéを使ったJavaオブジェクトの永続化
  ステップ1 ドメインモデルを作成する
  ステップ2 永続クラスを定義する
  ステップ3 テーブルを作成する
  ステップ4 アプリケーションコードを書く
  ステップ5 実行する


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


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

注目のテーマ

Database Expert 記事ランキング

本日月間