一般的な質問 Domaとは何ですか?

S2Daoのスタイル(DAOパターンや2 Way SQL)を踏襲したJava6(JDBC4.0)対応のO/Rマッパーです。 主な特長は2つあります。

  1. apt(アプト)を使用して、コンパイル時にコードの生成やコードの検証を行います。これにより、プログラミングミスを早期に発見できます。
  2. データベース上のカラムの値をドメインクラスと呼ばれるJavaオブジェクトにマッピングできます。これにより、型を活かしたプログラミングが容易になります。

Domaとはどのような意味ですか?

Domain Oriented MApping Framework の略です。

Domain(ドメイン)とは何ですか?

値のとり得る範囲(定義域)のことです。 Domaでは、テーブルのカラムの値を、ドメインと呼ばれるJavaオブジェクトで扱えます。

たとえば、一般的なO/Rマッパーでは、データベースのVARCHAR型をJavaのStringにマッピングしますが、 Domaでは、アプリケーション固有の型にマッピングすることを推奨しています。 なぜならば、データベース上では同じVARHCAR型でも、従業員名を表すVARCHAR型と電話番号を表すVARCHAR型は、 異なるJavaの型で扱うべきと考えるからです。 このアプリケーション固有の型をドメインと呼びます。

Domain(ドメイン)を利用する利点は何ですか?

主要な利点は次のものです。

  1. データベース上のカラムの型が同じあってもアプリケーション上意味が異なるものを別のJavaの型で表現できます。
  2. 概念をクラスとして明確に表現することでプログラミングをわかりやすくできます。
  3. 値と振る舞いを同じクラスで表現できます。

apt(アプト)とは何ですか?

Annotation Processing Toolの略です。 狭義では、Java 5 で導入された Mirror API を指しますが、広義では、Java 6 で導入された Pluggable Annotation Processing API (JSR 269) を含みます。

aptを利用すると、コンパイル時のソースコード検証や、ソースコード生成が可能です。

Domaでは、Pluggable Annotation Processing APIを使用して、 Daoのインタフェースから実装クラスを生成しています。 また、SQLファイルの存在チェックや、メソッド定義が規約に合致しているかどうかの検証も行っています。

動作環境に関する質問 どのバージョンのJREをサポートしていますか?

JRE 6 以上をサポートしています。JRE 5 以前はサポートしていません。

Domaを動作させるのにSeasar2は必須ですか?

いいえ、必須ではありません。

Domaを動作させるのに必要なライブラリには何がありますか?

Domaはどのライブラリにも依存していません。単独で動作します。

開発環境に関する質問 どのバージョンのJDKをサポートしていますか?

JDK 6 以上をサポートしています。JDK 5 以前はサポートしていません。

お奨めのIDE(統合開発環境)はありますか?

Eclipseをお奨めします。Eclipseのバージョンは 3.5 以上でなければいけません。

Eclipse 3.5 は JDK 6 で動作させる必要があります。 また、プロジェクトでも JDK 6 を使用する必要があります。

詳しくはセットアップを参照してください。

実績は聞きませんが、IntelliJ IDEAでも動作します。 DomaをIntelliJ IDEAで動かすを参照ください。

開発を支援するツールはありますか?

はい。Eclipseプラグインとコード生成ツールを用意しています。

詳しくは開発支援ツールを参照してください。

DomaのjarファイルをEclipseのビルドパスに指定しましたが、アノテーション処理が行われません。何が足りないのでしょうか?

Factory PathにもDomaのjarファイルを登録してください。

Factory Pathの設定画面は、プロジェクトのプロパティ設定画面から、 Java - Compiler - Annotation Processing - Factory Path と辿れます。 Annotation ProcessingとFactory Pathの画面では、 「Enable project specific settings」のチェックボックスをチェックしてください。

詳しくはセットアップを参照してください。

SQLファイルが存在するにもかかわらず、「[DOMA4019] SQLファイル[META-INF/../select.sql]がクラスパスから見つかりませんでした」というエラーメッセージが表示されます。何がいけないのでしょうか?

SQLファイルは、aptにより生成されるクラスの出力ディレクトリから検索されます。 SQLファイルの出力ディレクトリとaptにより生成されるクラスの出力ディレクトリが同じであることを確認してください。

Eclipseの場合、プロジェクトのプロパティの「Java Build Path」の設定画面で、 ソースフォルダごとに出力先ディレクトリを変更可能になっています。 この設定を無効にするか、SQLファイルの出力ディレクトリとaptにより生成されるクラスの出力ディレクトリを合わせてください。

Eclipseのプラグインm2e(m2eclipse)を使用する場合、出力先ディレクトリの変更が必要な場合があります。 設定方法はm2eでDomaを使う場合に気をつけることを参照してください。

aptで生成されたコードはどこに出力されますか?

Eclipseを利用している場合、デフォルトではプロジェクト直下の「.apt_generated」ディレクトリに出力されます。

出力先を変更したい場合は、注釈処理の設定を参考にしてください。

Eclipseを使用していますが、「.apt_generated」ディレクトリが見つかりません。どうしてですか?

aptの設定が正しく行われていない可能性があります。 セットアップを見直してください。

もしくは、単にPackage Explorerビュー上に「.apt_generated」ディレクトリが表示されていないだけかもしれません。 「.apt_generated」は、名称が「.」で始まっているために、Package Explorerビューで表示対象外になります。 対応方法としては以下のいずれかを選択してください。

  • Package Explorerビューではなく、Nivigatorビューから「.apt_generated」ディレクトリを確認する
  • Package Explorerビューのフィルタリングの設定を変更し、「.apt_generated」ディレクトリを表示させる
  • 出力先ディレクトリを明示的に指定し、名称が「.」で始まらないようにする

出力先を変更したい場合は、注釈処理の設定を参考にしてください。

EclipseプラグインのDoltengを使って、Seasar2とDomaを組み合わせたプロジェクトの雛形を作成できますか?

いいえ、できません。 また、Doltengへの対応は現在のところ予定されていません。

Seasar2とDomaを組み合わせたプロジェクトの雛形には、Doma JPetStoreをお使いください。

EclipseからAntを使ってDoma-Genのタスクを実行すると処理が止まってしまいます。なぜですか?

Windows版のEclipse3.5上のAntには、日本語をコンソールに出力できないという問題があります。 日本語を出力するタスクを実行すると処理が途中で止まってしまいます。

Antはコマンドラインから実行するか、もしくはEclipse3.6以上をお使いください。

ビルド環境に関する質問 AntでDomaを利用したアプリケーションをビルドしたいのですが、aptに関する設定をどのように行えばいいのでしょうか?

アプリケーションのビルド方法注釈処理を参照してください。

MavenでDomaを利用したアプリケーションをビルドしたいのですが、aptに関する設定をどのように行えばいいのでしょうか?

アプリケーションのビルド方法注釈処理を参照してください。

GradleでDomaを利用したアプリケーションをビルドしたいのですが、aptに関する設定をどのように行えばいいのでしょうか?

アプリケーションのビルド方法注釈処理を参照してください。

Domaを利用したアプリケーションをAntやMavenやGradleでコンパイルするとエラーになります。何がいけないのでしょうか?

javacには、aptに関するバグがあります。 コンパイルが成功しているにもかかわらず、誤ったエラーメッセージが出力されている可能性があります。

詳しくはアプリケーションのビルド方法を参照してください。

O/Rマッパーの機能に関する質問 どのRDBMSをサポートしていますか?

次のRDBMSに対応しています。

  • DB2 V9.5 for Linux, UNIX and Windows以上
  • H2 Database Engine 1.2以上
  • HSQLDB 1.8.0.1以上
  • Microsoft SQL Server 2008以上
  • MySQL 5.0以上
  • Oracle Database 10g以上
  • PostgreSQL 8.0以上
  • SQLite 3以上

要望があれば他のRDBMSへの対応も検討します。 また、利用者が独自に対応モジュール(org.seasar.doma.jdbc.dialect.Dialectの実装クラス)を作成することも可能です。

SQLを自動生成する機能はありますか?

はい。更新系SQL、ストアドプロシージャー/ファンクション呼び出しについてはSQLを自動で生成できます。 検索系のSQLについては、自動生成機能はありませんが、ファイルに外部化したSQLを実行し、その結果をJavaのオブジェクトにマッピングする機能があります。 更新系のSQLについても、必要であれば、ファイルに外部化したSQLを利用できます。

詳しくはクエリ定義を参照してください。

条件が動的に変わるSQLはどのように実行できますか?

SQLファイルに、SQLコメントを使って条件を指定できます。 SQLコメントは実行時に解析され、条件によって異なるSQLが生成されます。

SQLコメントについてはSQLファイルを参照してください。

SQLコメントの機能だけで条件を指定することが困難な場合には、SQLビルダを利用してプログラム上でSQLを組み立てられます。

SQLビルダについてはビルダを利用したSQLの組み立てを参照してください。

プログラミングで問い合わせ条件を組み立てるためのクライテリアAPIはありますか?

いいえ、ありません。 しかし、動的なSQLは、SQLコメントを使って条件指定できます。 また、外部化されたオリジナルのSQLをページング用のSQLや悲観的ロック用のSQLに変換する機能があります。

バッチ更新はサポートしていますか?

はい、サポートしています。

詳しくは バッチ挿入バッチ更新バッチ削除 等を参照してください。

楽観的排他制御はサポートしていますか?

はい、バージョン番号による楽観的排他制御をサポートしています。

詳しくは更新削除バッチ更新バッチ削除 等を参照してください。

悲観的排他制御はサポートしていますか?

はい、ファイルに外部化したオリジナルのSQLを悲観的排他制御用SQLに変換できます。 ただし、RDBMSが悲観的排他制御に対応している必要があります。

詳しくは悲観的排他制御を参照してください。

ページングはサポートしていますか?

はい、ファイルに外部化したオリジナルのSQLをページング用SQLに変換できます。

詳しくはページングを参照してください。

主キーの自動生成はサポートしていますか?

はい。データベースのIDENTITY、シーケンス、テーブルを利用した自動生成がサポートされています。

詳しくはフィールド定義を参照してください。

複合主キーはサポートしていますか?

はい、サポートしています。

詳しくはフィールド定義を参照してください。

1対1 や 1対n などデータベース上のリレーションシップをJavaオブジェクトにマッピングできますか?

いいえ、できません。 Domaでは、SQLの結果セット1行をそのまま1つのエンティティのインスタンスにマッピングします。 このほうがシンプルでわかりやすいと考えているためです。

遅延ローディングをサポートしていますか?

いいえ、サポートしていません。 遅延ローディングによりSQLの発行のタイミングが予測しづらくなり、トラブルの元になりやすいと考えているためです。

ストアドプロシージャーやストアドファンクションをサポートしていますか?

はい、サポートしています。

詳しくはストアドプロシージャーおよびストアドファンクションを参照してください。

データベースから取得した結果をキャッシュする機能はありますか?

いいえ、ありません。 キャッシュはDomaが位置づけられるデータアクセス層よりも上位の層で行ったほうがわかりやすいと考えているからです。

コネクションプーリングの機能はありますか?

いいえ、Domaでは提供していません。 コネクションプーリング機能をもつアプリケーションサーバー、フレームワーク、ライブラリ等と組み合わせて使用してください。

トランザクションを制御する機能はありますか?

はい、ローカルトランザクションをサポートしています。

詳しくはトランザクションを参照してください。

ジェネリックDAOを使用できますか?

いいえ、使用できません。 ジェネリックDAOを使用するとコード量は減りますが、コードの見通しがかえって低下すると考えているため使用できないようにしています。 (ジェネリックDAOについてはDAOを繰り返すな!を参照ください。)

たとえば、ジェネリックDAOでは、特定のエンティティをパラメータとしてメソッドを呼び出している箇所を探すのが容易ではありません。 ジェネリックDAOでなければメソッドのシグネチャが固定であるためIDEのCall Hierarchy機能を使って簡単に特定可能ですが、 ジェネリックDAOの場合、メソッドのパラメータの型がジェネリクス型であるためにCall Hierarchy機能を使っても呼び出し元を絞り込めません。

DomaをS2JDBCやS2Daoといっしょに使用できますか?

可能ですが、推奨しません。 同じような設定を重複して用意しなければならず、仕様が似ているようで異なるため混乱の元になります。

Domaと他のデータアクセスのライブラリを組み合わせるのであれば、JDBCを薄くラップしたライブラリをお奨めします。 たとえば、次のものが挙げられます。

これらのライブラリは、プログラム上で動的にSQLを組み立て実行したい場合に使用するといいでしょう。 その場合、SQLの組み立てと実行はデリゲート定義で指定したデリゲート先で行うことを推奨します。

単にSQLをプログラムで組み立てることが目的であれば、Domaが提供するSQLビルダを利用できます。 SQLビルダについてはビルダを利用したSQLの組み立てを参照してください。

JDBCドライバはどのように設定しますか?

JDBCドライバの設定を参照してください。