第1回 Javaのオブジェクト永続化に何を選ぶ?
ネクストデザイン
村山 徹
2005/12/7
本題に入る前に、まず、いくつかのキーワードについて整理しましょう。
永続化とは
オブジェクト指向プログラミング言語を使い始めたころを思い出してください。Javaであればnewオペレータを使って、目的のクラスのインスタンスを生成し、そのインスタンスにメッセージを送る(メソッドを呼ぶ)ことで、期待した振る舞い(状態の変化など)を実現できたはずです。ただし、このインスタンスはプログラムが終了すると同時にすべて消滅してしまいます。
例えば、文書作成プログラムであれば、せっかく入力した文書(インスタンス)がプログラムの終了と同時に消滅することになります。これでは文書作成プログラムとしては使えません。そこで、生成したインスタンスの保存(永続化)が必要になってきます。永続化とは、インスタンスの状態を半永久的に保存し、いつでも復元できるようにすることです。もちろん、永続化を必要としないシステムもたくさんありますが、ビジネスアプリケーションなどの世界では必須の要件といえるでしょう。
通常、(永続化のための)永続ストレージには、データベース・システムを使います。現在データベース・システムとして、リレーショナル・データベース(以下、RDBMS)を採用するケースが圧倒的に多いと思われます。この状況は、RDBMSの実績や普及度を考えれば自然な選択に思われるかもしれません。しかし、オブジェクト指向で開発する場合には、インピーダンスミスマッチと呼ばれる問題が発生します。
インピーダンスミスマッチとは
RDBMSを使ってオブジェクトを永続化するためには、オブジェクトの状態やほかのオブジェクトとの関連を、クラス図ではなく、テーブルを使って表現し直す必要があります。クラス図などで表現されたオブジェクト・モデルは、そのままではRDBMSに保存できないからです。通常、永続化したい1つのクラスを、いくつかのテーブルで定義されたリレーショナル・モデルに変換することになります。また、RDBMSからオブジェクトを復元する場合には、逆の変換が必要になります。この双方向に変換が必要なモデルの違いを、インピーダンスミスマッチと呼びます(後述の「オブジェクト指向データベースとリレーショナル・データベースの違い」を参照)。
O/Rマッピングとは
この2つのモデル間を双方向に変換する仕組みがO/R(Object model/Relational model)マッピングです。
例えば、本稿のような“技術レポート”を表すReportクラスを考えます(図2)。このReportクラスのインスタンスを生成し、タイトルを付けるというシナリオは、リスト1のステートメントで実現できます。
図2 クラス図で表現したReportクラス |
Report
report = new Report(); |
リスト1 Reportクラスのインスタンス生成とタイトル設定 |
仮に、インスタンスreportがプログラムの終了と同時に消滅しても、システム要件を満たしているのであれば、これで完成です。しかし、インスタンスreportを永続化する必要がある場合は、まだ完成ではありません。永続ストレージとしてRDBMSを使用するシステムであれば、リスト1が実行されることによって、表1のような処理とSQLステートメントが実行されなければなりません。
処理とSQLステートメント | |
(1) | 何らかの仕組みによって主キーを生成する(ここでは、ID='1'とします) |
(2) | insert
into REPORT_TABLE (ID) values ('1') |
(3) | update
REPORT_TABLE set TITLE='永続化方式を評価する' where ID='1' |
表1 インスタンスreportの永続化に必要な処理とSQLステートメント |
インスタンスは、表2のようなテーブルに保存されます(ここでは、データベースへの接続やトランザクションに関する部分は省略します)。
ID | TITLE |
1 | 永続化方式を比較する |
表2 REPORT_TABLEに格納されたインスタンスreport |
一般に、表1に相当する部分のコードは、比較的単調ですが行数は多くなります。また、変更も発生しやすい傾向があります。O/Rマッピングの優劣を決めるポイントの1つは、設計者や実装者が表1に相当する部分をどの程度簡単に定義できるのか、また、その存在をどの程度意識しないで実現できるのかにあります。開発者が、表1の内容を考える必要がなければないほど優れているといえます。
一方、「Report report = new Report();」といったコードは書いていないという方もいるかもしれません。しかし、そのようなケースでは、「システムをオブジェクトの集まりとしてモデル化し、その実装に適した言語としてJavaを使用する」というオブジェクト指向技術とJavaの利点はなくなり、Javaを使うことで逆に開発効率が低下しているのはないでしょうか。(次ページへ続く)
2/3 |
Index | |
対決! O/Rマッパー vs. オブジェクト指向DB(1) Javaのオブジェクト永続化に何を選ぶ? |
|
Page
1 ・はじめに ・本稿のもととなった開発事例について |
|
Page 2 ・永続化問題のキーワード |
|
Page 3 ・永続化をスマートに解決する |
対決! O/Rマッパー vs. オブジェクト指向DB |
- Oracleライセンス「SE2」検証 CPUスレッド数制限はどんな仕組みで制御されるのか (2017/7/26)
データベース管理システムの運用でトラブルが発生したらどうするか。DBサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は、Oracle SE2の「CPUスレッド数制限」がどんな仕組みで行われるのかを検証します - ドメイン参加後、SQL Serverが起動しなくなった (2017/7/24)
本連載では、「SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「ドメイン参加後にSQL Serverが起動しなくなった場合の対処方法」を解説します - さらに高度なSQL実行計画の取得」のために理解しておくべきこと (2017/7/21)
日本オラクルのデータベーススペシャリストが「DBAがすぐ実践できる即効テクニック」を紹介する本連載。今回は「より高度なSQL実行計画を取得するために、理解しておいてほしいこと」を解説します - データベースセキュリティが「各種ガイドライン」に記載され始めている事実 (2017/7/20)
本連載では、「データベースセキュリティに必要な対策」を学び、DBMSでの「具体的な実装方法」や「Tips」などを紹介していきます。今回は、「各種ガイドラインが示すコンプライアンス要件に、データベースのセキュリティはどのように記載されているのか」を解説します
|
|