Hibernate は O/R マッピングツールと呼ばれる、リレーショナルデータベースとオブジェクトモデルとの間を埋めるフレームワークです。
リレーショナルデータベースとオブジェクトモデルとのミスマッチには、下記のようなものがあります。
- オブジェクトの粒度に関する問題
- サブタイプ(継承)に関する問題
- オブジェクトの同一性(識別子)に関する問題
- オブジェクト同士の関連に関する問題
- オブジェクトの検索に関する問題
Hibernateは、このようなミスマッチを解決する方法を提供します。
リレーショナルシステムにおけるテーブル形式のデータ表現は、オブジェクト指向のJavaアプリケーションで使用されているオブジェクトのネットワークとは根本的に異なっている。この違いが、いわゆるオブジェクト/リレーショナルパラダイムのミスマッチだ。
Hibernateのアーキテクチャ
Hibernateが提供するインターフェースは、大きく分けて4つに分類できます。
- CRUDとクエリ操作を行うためのインターフェース
- Hibernateを設定するためのインターフェース
- イベントをハンドリングするためのコールバックインターフェース
- マッピング機能を拡張するためのインターフェース
CRUDとクエリ操作を行うためのインターフェース
インターフェース/クラス | 説明 |
---|---|
Session |
|
SessionFactory |
|
Transaction |
|
Query |
|
Criteria |
|
Hibernateを設定するためのインターフェース
Configuration |
|
イベントをハンドリングするためのコールバックインターフェース
Lifecycle |
|
Validation |
|
Interceptor |
|
マッピング機能を拡張するためのインターフェース
UserType |
|
CompositeUserType |
|
拡張ポイント |
|
バグ?
PostgreSQLでスキーマ指定すると…
- 環境
- PostgreSQL8.0.0
- Hibernate3.1
上記の環境で、PostgreSQLにpublic以外のスキーマでテーブルを作成したときちょっとハマったのでメモ。
現象
- マッピングファイルにschemaを指定するだけでは、Hibernateで構築されるSQL文にスキーマが記述されない
- PostgreSQL8.0でスキーマを明示した場合、PostgreSQLがテーブル名・カラム名を小文字に自動変換して解釈する
失敗時にHibernateが構築したSQL文
Hibernate: select max(MESSAGE_ID) from MESSAGE Caused by: java.sql.SQLException: ERROR: relation "message" does not exist
対策
- hibernate.cfg.xmlにdefault_schemaを指定する
- テーブル名・カラム名をダブルクウォート("")で囲む
Hibernateの設定ファイルにデフォルトスキーマを指定しなければいけない。また、スキーマ名を指定してSQLを実行すると(例:select * from hibernate.MESSAGE)、PostgreSQLがテーブル名・カラム名を小文字で解釈してしまう。回避するためには、ダブルクウォートで囲む必要がある。
Hibernateのマッピングファイルで、カラム名・テーブル名を「`(バッククウォート)」で囲むことで、SQL文生成時に Hibernate がダブルクウォートを自動で付けてくれます。
Hibernate設定ファイルです。
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">
org.postgresql.Driver
</property>
<property name="connection.url">
jdbc:postgresql://localhost:5432/hibernate_db
</property>
<property name="connection.username">postgres</property>
<property name="connection.password">postgres</property>
<property name="default_schema">hibernate</property>
マッピングファイルです。
マッピングファイル(*.hbm.xml)
<hibernate-mapping>
<class name="com.hamasyou.hibernate.hello.Message"
schema="hibernate"
table=""MESSAGE"">
<id name="id" column=""MESSAGE_ID"">
<generator class="increment"/>
</id>
<property name="text" column=""MESSAGE_TEXT""/>
<many-to-one
name="nextMessage"
column=""NEXT_MESSAGE_ID""
cascade="all"/>
</class>
</hibernate-mapping>
"と書いてある部分を「`(バッククウォート)」に変更することで、Hibernate の機能で引用符を付けてくれるようになります。
Hibernateが生成したSQL文
Hibernate: select max("MESSAGE_ID") from hibernate."MESSAGE" Hibernate: insert into hibernate."MESSAGE" ("MESSAGE_TEXT", "NEXT_MESSAGE_ID", "MESSAGE_ID") values (?, ?, ?)参考
-
JSF、SpringFramework、Hibernateの3つを同時に学べる良書
-
薄いながらもよくまとまっています
-
ProシリーズのHibernate本。おそらくかなりの良書だと思われます(読んでない^^;)
-
ProfessionalシリーズのHibernate本。こちらもかなりの良書だと思われます