hibernate-orm/doc/reference/ja/modules/configuration.xml

1726 lines
81 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="Shift_JIS"?>
<chapter id="session-configuration" revision="1">
<title>設定</title>
<para>
Hibernateはさまざまな環境で動作するようにデザインされているため、非常に多くの設定要素があります。
幸いなことに、Hibernateは、公開されているパッケージの <literal>etc/</literal> フォルダの <literal>hibernate.properties</literal>
に、ほとんどの設定要素の適切なデフォルト値が記述されています。
この <literal>hibernate.properties</literal> をクラスパスに設定し、設定要素をカスタマイズするだけです。
</para>
<sect1 id="configuration-programmatic" revision="1">
<title>プログラム上の設定</title>
<para>
<literal>org.hibernate.cfg.Configuration</literal> のインスタンスは、
Javaの型とSQLデータベースのマッピング情報をすべて持っています。
The <literal>Configuration</literal> は、(不変の) <literal>SessionFactory</literal>
を生成するときに使用します。
複数のXMLマッピングファイルを変換し、マッピング情報にします。
</para>
<para>
通常、<literal>Configuration</literal> インスタンスは、特定のXMLマッピングファイル
によって直接初期化されます。もし、マッピングファイルがクラスパスに設定されている場合、
次のメソッドを使ってください。 <literal>addResource()</literal> :
</para>
<programlisting><![CDATA[Configuration cfg = new Configuration()
.addResource("Item.hbm.xml")
.addResource("Bid.hbm.xml");]]></programlisting>
<para>
代替案(こちらのほうが良いときもあります)としてマッピングクラスを指定する方法もあります。Hibernateに、マッピングファイルを
見つけさせてください:
</para>
<programlisting><![CDATA[Configuration cfg = new Configuration()
.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class);]]></programlisting>
<para>
Hibernateは、クラスパスにある以下のような名前のマッピングファイルを見つけます。
<literal>/org/hibernate/auction/Item.hbm.xml</literal>
<literal>/org/hibernate/auction/Bid.hbm.xml</literal>
この方法だと、ハードコーディングされたファイル名を排除できます。
</para>
<para>
<literal>Configuration</literal> は、設定プロパティを指定することもできます:
</para>
<programlisting><![CDATA[Configuration cfg = new Configuration()
.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class)
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect")
.setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test")
.setProperty("hibernate.order_updates", "true");]]></programlisting>
<para>
Hibernateに設定プロパティを通す方法は1つではありません。
さまざまなオプションを用意しています:
</para>
<orderedlist spacing="compact">
<listitem>
<para>
<literal>java.util.Properties</literal> インスタンスを
<literal>Configuration.setProperties()</literal> に渡します。
</para>
</listitem>
<listitem>
<para>
<literal>hibernate.properties</literal>
クラスパスのルートディレクトリに置きます。
</para>
</listitem>
<listitem>
<para>
<literal>System</literal> プロパティが
<literal>java -Dproperty=value</literal> を使うように設定します。
</para>
</listitem>
<listitem>
<para>
<literal>&lt;property&gt;</literal> 要素を
<literal>hibernate.cfg.xml</literal> (後述)に設定します。
</para>
</listitem>
</orderedlist>
<para>
今すぐ始めたいのなら、<literal>hibernate.properties</literal>
を使うのが一番の近道です。
</para>
<para>
<literal>Configuration</literal> は、起動時にだけあるオブジェクトであり、
一度 <literal>SessionFactory</literal> を生成した後は、破棄されることを意図しています。
</para>
</sect1>
<sect1 id="configuration-sessionfactory">
<title>SessionFactoryを取得する</title>
<para>
<literal>Configuration</literal> がすべてのマッピング情報を解析したら、
アプリケーションは、 <literal>Session</literal> ファクトリインスタンスを取得します。
このSessionFactoryは、Hibernateを使用するすべてのスレッドで共有されるべきです。
</para>
<programlisting><![CDATA[SessionFactory sessions = cfg.buildSessionFactory();]]></programlisting>
<para>
Hibernateは、 <literal>SessionFactory</literal> を複数生成することができます。
これは、複数のデータベースを使用する場合に便利です。
</para>
</sect1>
<sect1 id="configuration-hibernatejdbc" revision="1">
<title>JDBCコネクション</title>
<para>
通常、開発者は <literal>SessionFactory</literal> を生成し、SessionFactoryでJDBCコネクションをプーリングしたいと考えます。
そのアプローチを採用する場合、単純に <literal>Session</literal> をオープンしてください:
</para>
<programlisting><![CDATA[Session session = sessions.openSession(); // open a new Session]]></programlisting>
<para>
これだけで、プーリングしたJDBCコネクションを使って目的のデータベース
にアクセスすることができます。
</para>
<para>
そのためには、JDBCコネクションのプロパティをHibernateに設定する必要があります。
すべてのHibernateプロパティ名とセマンティクスは
<literal>org.hibernate.cfg.Environment</literal> クラスに定義されています。
この設定はJDBCコネクション設定の中で一番重要なものです。
</para>
<para>
もし、以下のプロパティを設定すると、Hibernateはコネクションを取得するプールもために
<literal>java.sql.DriverManager</literal> を使います。
</para>
<table frame="topbot">
<title>Hibernate JDBCプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
<entry>プロパティ名</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>hibernate.connection.driver_class</literal>
</entry>
<entry>
<emphasis>JDBCドライバクラス</emphasis>
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.url</literal>
</entry>
<entry>
<emphasis>jdbc URL</emphasis>
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.username</literal>
</entry>
<entry>
<emphasis>database user</emphasis>
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.password</literal>
</entry>
<entry>
<emphasis>database user password</emphasis>
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.pool_size</literal>
</entry>
<entry>
<emphasis>プールするコネクションの最大数</emphasis>
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Hibernateのコネクションプールアルゴリズムは非常に初歩的なものです。
これはすぐに始められるようにと用意されたもので、<emphasis>製品として使用することを意図していません</emphasis>
また、パフォーマンスのテストのためのものでもありません。
最高のパフォーマンスと安定性を持ったプールを実現したければ、サードパーティのツールをお勧めします。
<literal>hibernate.connection.pool_size</literal> プロパティに
適切なコネクションプールサイズを記述してください。
このままだとHibernateのコネクションプールを使います。
例えば次のようにC3P0を使います。
</para>
<para>
C3P0はオープンソースJDBCコネクションプールで、Hibernateの <literal>lib</literal>
ディレクトリにあります。もし、<literal>hibernate.c3p0.*</literal> プロパティを
セットすれば、Hibernateは、 <literal>C3P0ConnectionProvider</literal> を使います。
もしProxoolを使いたい場合は、 <literal>hibernate.properties</literal> パッケージを
参照したり、HibernateのWebサイトでより多くの情報を取得してください。
</para>
<para>
C3P0用の <literal>hibernate.properties</literal> ファイルを例として示します:
</para>
<programlisting id="c3p0-configuration" revision="1"><![CDATA[hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
hibernate.connection.username = myuser
hibernate.connection.password = secret
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect]]></programlisting>
<para>
アプリケーションサーバ上で使う場合は、Hibernateを設定し、
アプリケーションサーバからコネクションを取得するようにしてください。
<literal>Datasource</literal> をJNDIに登録します。そして
プロパティを以下のように設定してください。
</para>
<table frame="topbot">
<title>Hibernate データソースプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
<entry>プロパティ名</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>hibernate.connection.datasource</literal>
</entry>
<entry>
<emphasis>データソースのJNDI名</emphasis>
</entry>
</row>
<row>
<entry>
<literal>hibernate.jndi.url</literal>
</entry>
<entry>
<emphasis>JNDIプロバイダのURL</emphasis> (オプション)
</entry>
</row>
<row>
<entry>
<literal>hibernate.jndi.class</literal>
</entry>
<entry>
<emphasis>JNDIクラス <literal>InitialContextFactory</literal> </emphasis> (オプション)
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.username</literal>
</entry>
<entry>
<emphasis>database user</emphasis> (オプション)
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.password</literal>
</entry>
<entry>
<emphasis>database user password</emphasis> (オプション)
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
アプリケーションサーバから提供されたJNDIデータソースを使う
<literal>hibernate.properties</literal> ファイルの例を示します:
</para>
<programlisting><![CDATA[hibernate.connection.datasource = java:/comp/env/jdbc/test
hibernate.transaction.factory_class = \
org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_lookup_class = \
org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect]]></programlisting>
<para>
JNDIデータソースから取得したJDBCコネクションは、アプリケーションサーバの
コンテナ管理トランザクションに自動的に参加します。
</para>
<para>
任意のコネクションプロパティは、与えられた” <literal>hibernate.connnection</literal>
プロパティ名によって与えられます。例えば、 <literal>charSet</literal> を設定したい場合は、
<literal>hibernate.connection.charSet</literal> を使います。
</para>
<para>
JDBCコネクションを取得する戦略を持つ独自のプラグインを定義する場合は、
<literal>org.hibernate.connection.ConnectionProvider</literal> インターフェイスを
実装してください。そして、実装クラスを <literal>hibernate.connection.provider_class</literal>
に設定してください。
</para>
</sect1>
<sect1 id="configuration-optional" revision="1">
<title>オプション設定プロパティ</title>
<para>
これらのプロパティはHibernateの挙動を制御するものです。
これらのプロパティはすべて妥当なデフォルト値があり、任意で設定します。
</para>
<para>
<emphasis>注意:これらのプロパティは"システムレベル"のみです。</emphasis>
システムレベルプロパティは <literal>java -Dproperty=value</literal> 、もしくは
<literal>hibernate.properties</literal> でのみ設定可能です。
それ以外の設定方法は <emphasis>ありません</emphasis>
</para>
<table frame="topbot" id="configuration-optional-properties" revision="8">
<title>Hibernate設定プロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
<entry>プロパティ名</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>hibernate.dialect</literal>
</entry>
<entry>
Hibernate <literal>Dialect</literal> クラス名が入ります。
これはリレーショナルデータベースごとに最適化されたSQLを生成します。
<para>
<emphasis role="strong">例:</emphasis>
<literal>full.classname.of.Dialect</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.show_sql</literal>
</entry>
<entry>
発行されたすべてのSQLをコンソールに出力します。
これはログカテゴリの <literal>org.hibernate.SQL</literal>
<literal>debug</literal> を設定する方法の代替手段です。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.format_sql</literal>
</entry>
<entry>
ログとコンソールのSQLを美しく表示します。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.default_schema</literal>
</entry>
<entry>
生成されるSQL文のテーブルに設定するスキーマ/テーブルスペースです。
<para>
<emphasis role="strong">例:</emphasis>
<literal>SCHEMA_NAME</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.default_catalog</literal>
</entry>
<entry>
生成されるSQL文のテーブルに設定するカタログです。
<para>
<emphasis role="strong">例:</emphasis>
<literal>CATALOG_NAME</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.session_factory_name</literal>
</entry>
<entry>
<literal>SessionFactory</literal> は生成後、この名前でJNDIに登録されます。
<para>
<emphasis role="strong">例:</emphasis>
<literal>jndi/composite/name</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.max_fetch_depth</literal>
</entry>
<entry>
外部結合フェッチの最大深度を設定します。結合する関連は
対一関連のみ(一対一、多対一)です。
<literal>0</literal> を指定すると外部結合フェッチは無効になります。
<para>
<emphasis role="strong">例:</emphasis>
推奨する値は <literal>0</literal> から <literal>3</literal> です。
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.default_batch_fetch_size</literal>
</entry>
<entry>
関連フェッチのデフォルトバッチサイズを指定します。
<para>
<emphasis role="strong">例:</emphasis>
推奨する値は <literal>4</literal> , <literal>8</literal> , <literal>16</literal> です。
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.default_entity_mode</literal>
</entry>
<entry>
<literal>SessionFactory</literal> からセッションをオープンしたときに
使用するエンティティのデフォルトモードを設定します。
<para>
<literal>dynamic-map</literal>, <literal>dom4j</literal>,
<literal>pojo</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.order_updates</literal>
</entry>
<entry>
項目が更新されたときに、別のSQLで主キーを更新することを強制します。
この場合、同時実行可能なシステムでは、まれにデッドロックが発生する可能性があります。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.generate_statistics</literal>
</entry>
<entry>
有効の場合、Hibernateはパフォーマンスチューニングに
有効な統計情報を収集します。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.use_identifer_rollback</literal>
</entry>
<entry>
有効の場合、オブジェクトが削除されたときに
識別子プロパティをリセットし、デフォルト値にしたものを生成します。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.use_sql_comments</literal>
</entry>
<entry>
有効の場合、SQL内にコメントを生成します。これはデバックを容易にします。
デフォルトの値は <literal>false</literal> です。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="topbot" id="configuration-jdbc-properties" revision="8">
<title>Hibernate JDBC とコネクションプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
<entry>プロパティ名</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>hibernate.jdbc.fetch_size</literal>
</entry>
<entry>
値が0でない場合、JDBCフェッチサイズを決定します
( <literal>Statement.setFetchSize()</literal> を呼びます)。
</entry>
</row>
<row>
<entry>
<literal>hibernate.jdbc.batch_size</literal>
</entry>
<entry>
値が0でない場合、HibernateがJDBC2バッチ更新を使用します。
<para>
<emphasis role="strong">例:</emphasis>
推奨する値は <literal>5</literal> から <literal>30</literal> です。
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.jdbc.batch_versioned_data</literal>
</entry>
<entry>
もしJDBCドライバが <literal>executeBatch()</literal> によって正確な行数を
返す場合、このプロパティを <literal>true</literal> にしてください
通常はこのオプションをONにします
Hibernateは、自動バージョンデータのためバッチDMLを使います。
デフォルトの値は <literal>false</literal> です。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.jdbc.factory_class</literal>
</entry>
<entry>
カスタム <literal>Batcher</literal> を選びます。
ほとんどのアプリケーションに、この設定は必要ありません。
<para>
<emphasis role="strong">例:</emphasis>
<literal>classname.of.Batcher</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.jdbc.use_scrollable_resultset</literal>
</entry>
<entry>
スクロール可能なリザルトセットを、Hibernateが使用します。
このプロパティは、JDBCコネクションがコネクションメタデータを
サポートしていることが必須条件になります。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.jdbc.use_streams_for_binary</literal>
</entry>
<entry>
JDBCへ/から <literal>binary</literal><literal>serializable</literal>
の書き込み/読み込みストリームを使います(システムレベルのプロパティ)。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.jdbc.use_get_generated_keys</literal>
</entry>
<entry>
挿入の後に自動生成された主キーを取得するための
JDBC3 <literal>PreparedStatement.getGeneratedKeys()</literal> の使用を有効にします。
これはJDBC3+ドライバとJRE1.4+を必要とし、
もしHibernateの識別子ジェネレータに問題が発生するようならfalseに設定してください。
デフォルトではコネクションメタデータを使いドライバの能力を決定します。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.provider_class</literal>
</entry>
<entry>
JDBCコネクションをHibernateに提供する独自の <literal>ConnectionProvider</literal>
名前を指定します。
<para>
<emphasis role="strong">例:</emphasis>
<literal>classname.of.ConnectionProvider</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.isolation</literal>
</entry>
<entry>
JDBCトランザクション分離レベルを設定します。
妥当な値を調べるためには <literal>java.sql.Connection</literal> をチェックしてください。
しかし使用するデータベースが、すべての分離レベルをサポートしているとは限りません。
<para>
<emphasis role="strong">例:</emphasis>
<literal>1, 2, 4, 8</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.autocommit</literal>
</entry>
<entry>
プールされているJDBCコネクションの自動コミットを有効にする非推奨
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.release_mode</literal>
</entry>
<entry>
HibernateがJDBCコネクションをリリースするかを指定します。デフォルトでは
セッションが明示的にクローズまたは切断されてもコネクションは保持します。
アプリケーションサーバのJTAデータソースの場合、
すべてのJDBCコールの後、強制的にコネクションをリリースするために <literal>after_statement</literal>
使ってください。
非JTAコネクションの場合、各トランザクションが終了したときに <literal>after_transaction</literal>
を使い、コネクションをリリースしてください。
<literal>auto</literal> にすると、
JTAやCMTトランザクションの場合、 <literal>after_statement</literal> でクローズし、
JDBCトランザクションの場合、 <literal>after_transaction</literal> でクローズします。
<para>
<emphasis role="strong">例:</emphasis>
<literal>auto</literal> (default) | <literal>on_close</literal> |
<literal>after_transaction</literal> | <literal>after_statement</literal>
</para>
<para>
注意してください。この設定は <literal>SessionFactory.openSession</literal> から
取得した <literal>Session</literal> だけに効果があります。
<literal>SessionFactory.getCurrentSession</literal> を通じて取得した
<literal>Session</literal> では、<literal>CurrentSessionContext</literal>
の実装によって、コネクションのリリースモードを設定します。
<xref linkend="architecture-current-session"/> を参照してください。
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.<emphasis>&lt;propertyName&gt;</emphasis></literal>
</entry>
<entry>
JDBCの <literal>propertyName</literal> プロパティを、
<literal>DriverManager.getConnection()</literal> に渡します。
</entry>
</row>
<row>
<entry>
<literal>hibernate.jndi.<emphasis>&lt;propertyName&gt;</emphasis></literal>
</entry>
<entry>
<literal>propertyName</literal> プロパティを、
JNDI <literal>InitialContextFactory</literal> に渡します。
</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="topbot" id="configuration-cache-properties" revision="7">
<title>Hibernate キャッシュプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
<entry>プロパティ名</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>hibernate.cache.provider_class</literal>
</entry>
<entry>
カスタム <literal>CacheProvider</literal> のクラス名です。
<para>
<emphasis role="strong">例:</emphasis>
<literal>classname.of.CacheProvider</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.cache.use_minimal_puts</literal>
</entry>
<entry>
書き込みを最小限にするために、二次キャッシュの操作を最適化します。
その代わりに、読み込みがより頻繁に発生するようになります。
このセッティングはクラスタキャッシュで役に立ちます。
Hibernate3ではクラスタキャッシュ実装用にデフォルトでは有効になっています。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.cache.use_query_cache</literal>
</entry>
<entry>
特定のクエリがキャッシュ可能な場合に、クエリキャッシュを有効にします。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.cache.use_second_level_cache</literal>
</entry>
<entry>
二次キャッシュを完全に無効にする場合に使います。
デフォルトでは有効で、クラスの <literal>&lt;cache&gt;</literal> マッピング
で制御します。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.cache.query_cache_factory</literal>
</entry>
<entry>
カスタム <literal>QueryCache</literal> インターフェイスのクラス名を
指定します。デフォルトでは <literal>StandardQueryCache</literal> になります。
<para>
<emphasis role="strong">例:</emphasis>
<literal>classname.of.QueryCache</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.cache.region_prefix</literal>
</entry>
<entry>
二次キャッシュの領域名の接頭辞です。
<para>
<emphasis role="strong">例:</emphasis>
<literal>prefix</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.cache.use_structured_entries</literal>
</entry>
<entry>
二次キャッシュに格納するデータを、人が理解しやすいフォーマットにします。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="topbot" id="configuration-transaction-properties" revision="9">
<title>Hibernate トランザクションプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
<entry>プロパティ名</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>hibernate.transaction.factory_class</literal>
</entry>
<entry>
Hibernate <literal>Transaction</literal> APIと一緒に使われる
<literal>TransactionFactory</literal> のクラス名です。
(デフォルトでは <literal>JDBCTransactionFactory</literal> です)。
<para>
<emphasis role="strong">例:</emphasis>
<literal>classname.of.TransactionFactory</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>jta.UserTransaction</literal>
</entry>
<entry>
アプリケーションサーバからJTA <literal>UserTransaction</literal> を取得するために
<literal>JTATransactionFactory</literal> に使われるJNDI名です。
<para>
<emphasis role="strong">例:</emphasis>
<literal>jndi/composite/name</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.transaction.manager_lookup_class</literal>
</entry>
<entry>
<literal>TransactionManagerLookup</literal> のクラス名です。
JTA環境において、JVMレベルのキャッシュを有効にするために必要です。
<para>
<emphasis role="strong">例:</emphasis>
<literal>classname.of.TransactionManagerLookup</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.transaction.flush_before_completion</literal>
</entry>
<entry>
有効の場合、トランザクションのcompletionフェーズの前に自動的に
セッションをフラッシュします。内臓の自動セッションコンテキスト管理に適しています。
<xref linkend="architecture-current-session"/>を参照してください。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.transaction.auto_close_session</literal>
</entry>
<entry>
有効の場合、トランザクションのcompletionフェーズの後に
セッションを自動的にクローズします。内臓の自動セッションコンテキスト管理に適しています。
<xref linkend="architecture-current-session"/>を参照してください。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="topbot" id="configuration-misc-properties" revision="10">
<title>その他のプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
<entry>プロパティ名</entry>
<entry>意味</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>hibernate.current_session_context_class</literal>
</entry>
<entry>
「現在の」<literal>Session</literal> のための(カスタム)戦略を提供します。
ビルトインストラテジーに関するその他の情報については
<xref linkend="architecture-current-session"/>を参照してください。
<para>
<emphasis role="strong">例:</emphasis>
<literal>jta</literal> | <literal>thread</literal> |
<literal>managed</literal> | <literal>custom.Class</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.query.factory_class</literal>
</entry>
<entry>
HQLパーサーの実装を選択します。
<para>
<emphasis role="strong">例:</emphasis>
<literal>org.hibernate.hql.ast.ASTQueryTranslatorFactory</literal> or
<literal>org.hibernate.hql.classic.ClassicQueryTranslatorFactory</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.query.substitutions</literal>
</entry>
<entry>
HQLとSQLのトークンをマッピングします。
(例えば、トークンは関数やリテラル名です)。
<para>
<emphasis role="strong">例:</emphasis>
<literal>hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.hbm2ddl.auto</literal>
</entry>
<entry>
<literal>SessionFactory</literal> を生成したときに、
自動的にスキーマDDLをDBに出力します。
<literal>create-drop</literal> の場合、 <literal>SessionFactory</literal>
クローズしたときに、データベーススキーマをドロップします。
<para>
<emphasis role="strong">例:</emphasis>
<literal>validate</literal> | <literal>update</literal> |
<literal>create</literal> | <literal>create-drop</literal>
</para>
</entry>
</row>
<row>
<entry>
<literal>hibernate.cglib.use_reflection_optimizer</literal>
</entry>
<entry>
実行時リフレクションの代わりのCGLIBの使用を有効にします
(システムレベルのプロパティ)
リフレクションはトラブルシューティングのときに役立つことがあります。
オプティマイザをオフにしているときでさえ、
Hibernateには必ずCGLIBが必要なことに注意してください。
このプロパティは <literal>hibernate.cfg.xml</literal> で設定できません。
<para>
<emphasis role="strong">例:</emphasis>
<literal>true</literal> | <literal>false</literal>
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
<sect2 id="configuration-optional-dialects" revision="1">
<title>SQL 方言Dialect</title>
<para>
<literal>hibernate.dialect</literal> プロパティには、
使用するデータベースの正しい <literal>org.hibernate.dialect.Dialect</literal> のサブクラスを、
必ず指定すべきです。
しかし方言を指定すれば、Hibernateは上述したプロパティのいくつかについて、
より適切なデフォルト値を使います。
そうすれば、それらを手作業で設定する手間が省けます。
</para>
<table frame="topbot" id="sql-dialects" revision="2">
<title>Hibernate SQL Dialects (<literal>hibernate.dialect</literal>)</title>
<tgroup cols="2">
<colspec colwidth="1*"/>
<colspec colwidth="2.5*"/>
<thead>
<row>
<entry>RDBMS</entry>
<entry>Dialect</entry>
</row>
</thead>
<tbody>
<row>
<entry>DB2</entry> <entry><literal>org.hibernate.dialect.DB2Dialect</literal></entry>
</row>
<row>
<entry>DB2 AS/400</entry> <entry><literal>org.hibernate.dialect.DB2400Dialect</literal></entry>
</row>
<row>
<entry>DB2 OS390</entry> <entry><literal>org.hibernate.dialect.DB2390Dialect</literal></entry>
</row>
<row>
<entry>PostgreSQL</entry> <entry><literal>org.hibernate.dialect.PostgreSQLDialect</literal></entry>
</row>
<row>
<entry>MySQL</entry> <entry><literal>org.hibernate.dialect.MySQLDialect</literal></entry>
</row>
<row>
<entry>MySQL with InnoDB</entry> <entry><literal>org.hibernate.dialect.MySQLInnoDBDialect</literal></entry>
</row>
<row>
<entry>MySQL with MyISAM</entry> <entry><literal>org.hibernate.dialect.MySQLMyISAMDialect</literal></entry>
</row>
<row>
<entry>Oracle (any version)</entry> <entry><literal>org.hibernate.dialect.OracleDialect</literal></entry>
</row>
<row>
<entry>Oracle 9i/10g</entry> <entry><literal>org.hibernate.dialect.Oracle9Dialect</literal></entry>
</row>
<row>
<entry>Sybase</entry> <entry><literal>org.hibernate.dialect.SybaseDialect</literal></entry>
</row>
<row>
<entry>Sybase Anywhere</entry> <entry><literal>org.hibernate.dialect.SybaseAnywhereDialect</literal></entry>
</row>
<row>
<entry>Microsoft SQL Server</entry> <entry><literal>org.hibernate.dialect.SQLServerDialect</literal></entry>
</row>
<row>
<entry>SAP DB</entry> <entry><literal>org.hibernate.dialect.SAPDBDialect</literal></entry>
</row>
<row>
<entry>Informix</entry> <entry><literal>org.hibernate.dialect.InformixDialect</literal></entry>
</row>
<row>
<entry>HypersonicSQL</entry> <entry><literal>org.hibernate.dialect.HSQLDialect</literal></entry>
</row>
<row>
<entry>Ingres</entry> <entry><literal>org.hibernate.dialect.IngresDialect</literal></entry>
</row>
<row>
<entry>Progress</entry> <entry><literal>org.hibernate.dialect.ProgressDialect</literal></entry>
</row>
<row>
<entry>Mckoi SQL</entry> <entry><literal>org.hibernate.dialect.MckoiDialect</literal></entry>
</row>
<row>
<entry>Interbase</entry> <entry><literal>org.hibernate.dialect.InterbaseDialect</literal></entry>
</row>
<row>
<entry>Pointbase</entry> <entry><literal>org.hibernate.dialect.PointbaseDialect</literal></entry>
</row>
<row>
<entry>FrontBase</entry> <entry><literal>org.hibernate.dialect.FrontbaseDialect</literal></entry>
</row>
<row>
<entry>Firebird</entry> <entry><literal>org.hibernate.dialect.FirebirdDialect</literal></entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="configuration-optional-outerjoin" revision="4">
<title>外部結合フェッチ</title>
<para>
もしDBがANSIか、OracleかSybaseスタイルの外部結合をサポートしている場合、
<emphasis>outer join fetching</emphasis> は、DBのSQL発行回数を節約し
パフォーマンスを良くします。DB内でより多くの処理コストが発生します
外部結合フェッチは、多対一、一対多、多対多、一対一のオブジェクト関連で
グループオブジェクトを1つのSQLで <literal>SELECT</literal> します。
</para>
<para>
<literal>hibernate.max_fetch_depth</literal> プロパティの値を <literal>0</literal> にすると
Outer join fetchingを <emphasis>すべて</emphasis> 無効にすることになります。
<literal>1</literal> やそれ以上の値を設定すると、外部結合フェッチが有効になり、
一対一と多対一関連が <literal>fetch="join"</literal> としてマッピングされます。
</para>
<para>
See <xref linkend="performance-fetching"/> for more information.
</para>
</sect2>
<sect2 id="configuration-optional-binarystreams" revision="1">
<title>バイナリストリーム</title>
<para>
OracleはJDBCドライバとの間でやりとりされる <literal>byte</literal> 配列のサイズを制限します。
<literal>binary</literal><literal>serializable</literal> 型の大きなインスタンスを使いたければ、
<literal>hibernate.jdbc.use_streams_for_binary</literal> を有効にしてください。
ただし <emphasis>これはシステムレベルの設定だけです</emphasis>
</para>
</sect2>
<sect2 id="configuration-optional-cacheprovider" revision="2">
<title>2次キャッシュとクエリーキャッシュ</title>
<para>
<literal>hibernate.cache</literal> プロパティ接頭辞は
Hibernateでプロセスやクラスタ二次キャッシュを使うとことを許可します。
<xref linkend="performance-cache"/>により多くの詳細があります。
</para>
</sect2>
<sect2 id="configuration-optional-querysubstitution">
<title>クエリー言語の置き換え</title>
<para>
<literal>hibernate.query.substitutions</literal> を使うことで、
新しいHibernateクエリトークンを定義できます。
例:
</para>
<programlisting>hibernate.query.substitutions true=1, false=0</programlisting>
<para>
これはトークン <literal>true</literal><literal>false</literal> を、
生成されるSQLにおいて整数リテラルに翻訳します。
</para>
<programlisting>hibernate.query.substitutions toLowercase=LOWER</programlisting>
<para>
これはSQLの <literal>LOWER</literal> 関数の名前の付け替えを可能にします。
</para>
</sect2>
<sect2 id="configuration-optional-statistics" revision="2">
<title>Hibernate 統計</title>
<para>
<literal>hibernate.generate_statistics</literal> を有効にした場合、
動作しているシステムをチューニングするときに、<literal>SessionFactory.getStatistics()</literal>
を経由して、Hibernateは便利な統計情報を出力します。
JMXを経由して統計情報を出力することも可能です。
Javadocの <literal>org.hibernate.stats</literal> パッケージ内の
インターフェイスにはより多くの情報があります。
</para>
</sect2>
</sect1>
<sect1 id="configuration-logging">
<title>ロギング</title>
<para>
HibernateはApache commons-logginを使って、さまざまなイベントをログとして
出力します。
</para>
<para>
commons-loggingサービスはクラスパスに <literal>log4j.jar</literal> を含めればApache Log4jに、
またJDK1.4かそれ以上で実行させればJDK1.4 loggingに直接出力します。
Log4jは <literal>http://jakarta.apache.org</literal> からダウンロードできます。
Log4jを使うためには、クラスパスに <literal>log4j.properties</literal> ファイルを配置する必要があります。
例のプロパティファイルはHibernateと一緒に配布され、それは <literal>src/</literal> ディレクトリにあります。
</para>
<para>
Hibernateのログメッセージに慣れることを強くおすすめします。
Hibernateのログは読みやすく、できる限り詳細になるように努力されています。
これは必須のトラブルシューティングデバイスです。
以下に重要なログのカテゴリを示します。
</para>
<table frame="topbot" id="log-categories" revision="2">
<title>Hibernate ログカテゴリ</title>
<tgroup cols="2">
<colspec colwidth="1*"/>
<colspec colwidth="2.5*"/>
<thead>
<row>
<entry>カテゴリ</entry>
<entry>機能</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>org.hibernate.SQL</literal></entry>
<entry>実行したすべてのSQLDDLステートメントをロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.type</literal></entry>
<entry>すべてのJDBCパラメータをロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.tool.hbm2ddl</literal></entry>
<entry>実行したすべてのSQLDDLステートメントをロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.pretty</literal></entry>
<entry>
sessionに関連するすべてのエンティティ最大のフラッシュ時間をロギングします。
</entry>
</row>
<row>
<entry><literal>org.hibernate.cache</literal></entry>
<entry>すべての2次キャッシュの動作をロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction</literal></entry>
<entry>トランザクションに関連する動作をロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.jdbc</literal></entry>
<entry>JDBCリソース取得をロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.hql.ast.AST</literal></entry>
<entry>
HQLとSQLのASTのクエリーパースをロギングします。
</entry>
</row>
<row>
<entry><literal>org.hibernate.secure</literal></entry>
<entry>すべてのJAAS分析をロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate</literal></entry>
<entry>
すべてをロギングします。(情報が大量になりますが、トラブルシューティングには便利です)
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Hibernateでアプリケーションを作成するときは、<literal>org.hibernate.SQL</literal>
カテゴリの <literal>debug</literal> を常に有効にしておいたほうが良いでしょう。
代替方法として、<literal>hibernate.show_sql</literal> を有効にする方法があります。
</para>
</sect1>
<sect1 id="configuration-namingstrategy">
<title><literal>NamingStrategy</literal> の実装</title>
<para>
インターフェイス <literal>net.sf.hibernate.cfg.NamingStrategy</literal> を使うと
データベースオブジェクトとスキーマ要素のための「命名標準」を指定できます。
</para>
<para>
Javaの識別子からデータベースの識別子を自動生成するためのルールや、
マッピングファイルで与えた「論理的な」カラムとテーブル名から
「物理的な」テーブルとカラム名を生成するためのルールを用意することができます。
この機能は繰り返しの雑音(例えば <literal>TBL_</literal> プリフィックス)を取り除き、
マッピングドキュメントの冗長さを減らすことに役立ちます。
Hibernateが使うデフォルトの戦略はかなり最小限に近いものです。
</para>
<para>
マッピングを追加する前に <literal>Configuration.setNamingStrategy()</literal> を呼ぶことで
以下のように異なる戦略を指定することができます:
</para>
<programlisting><![CDATA[SessionFactory sf = new Configuration()
.setNamingStrategy(ImprovedNamingStrategy.INSTANCE)
.addFile("Item.hbm.xml")
.addFile("Bid.hbm.xml")
.buildSessionFactory();]]></programlisting>
<para>
<literal>org.hibernate.cfg.ImprovedNamingStrategy</literal> は組み込みの戦略です。
これはいくつかのアプリケーションにとって有用な開始点となるかもしれません。
</para>
</sect1>
<sect1 id="configuration-xmlconfig" revision="2">
<title>XML設定ファイル</title>
<para>
もう1つの方法は <literal>hibernate.cfg.xml</literal> という名前のファイルで
十分な設定を指定する方法です。
このファイルは <literal>hibernate.properties</literal> ファイルの代わりとなります。
もし両方のファイルがあれば、プロパティが置き換えられます。
</para>
<para>
XML設定ファイルは初期設定で <literal>CLASSPATH</literal> に配置してください。
これが例です:
</para>
<programlisting><![CDATA[<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- a SessionFactory instance listed as /jndi/name -->
<!-- /jndi/nameのようにリストアップされたSessionFactoryインスタンス -->
<session-factory
name="java:hibernate/SessionFactory">
<!-- properties -->
<property name="connection.datasource">java:/comp/env/jdbc/MyDB</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">false</property>
<property name="transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</property>
<property name="jta.UserTransaction">java:comp/UserTransaction</property>
<!-- mapping files -->
<mapping resource="org/hibernate/auction/Item.hbm.xml"/>
<mapping resource="org/hibernate/auction/Bid.hbm.xml"/>
<!-- cache settings -->
<class-cache class="org.hibernate.auction.Item" usage="read-write"/>
<class-cache class="org.hibernate.auction.Bid" usage="read-only"/>
<collection-cache collection="org.hibernate.auction.Item.bids" usage="read-write"/>
</session-factory>
</hibernate-configuration>]]></programlisting>
<para>
見てのとおり、この方法の優位性は設定のためのマッピングファイル名を外出しにできることです。
Hibernateキャッシュをチューニングしなければならないのであれば、
<literal>hibernate.cfg.xml</literal> はより便利です。
<literal>hibernate.properties</literal><literal>hibernate.cfg.xml</literal>
どちらかを使えることを覚えておいてください。
二つは同じもので、違うところといえばXML構文を使うことの利点だけです。
</para>
<para>
XML設定を使うことで、Hibernateは以下のようにシンプルになります。
</para>
<programlisting><![CDATA[SessionFactory sf = new Configuration().configure().buildSessionFactory();]]></programlisting>
<para>
違うXML設定ファイルを使うこともできます。
</para>
<programlisting><![CDATA[SessionFactory sf = new Configuration()
.configure("catdb.cfg.xml")
.buildSessionFactory();]]></programlisting>
</sect1>
<sect1 id="configuration-j2ee" revision="1">
<title>J2EEアプリケーションサーバとの統合</title>
<para>
HibernateはJ2EE構造と統合するポイントをサポートしています。
</para>
<itemizedlist>
<listitem>
<para>
<emphasis>コンテナ管理データソース</emphasis>Hibernateは
JNDIが提供し、コンテナが管理するJDBCコネクションを使用できます。
通常、JTA準拠の <literal>TransactionManager</literal>
<literal>ResourceManager</literal> がトランザクション管理(CMT)、
特に様々なデータソースにまたがる分散トランザクションを扱います。
当然プログラムでトランザクション境界を指定できます(BMT)。
あるいは、記述したコードのポータビリティを保つために、
オプションのHibernateの <literal>Transaction</literal> APIを使いたくなるかもしれません。
</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para>
<emphasis>自動JNDIバインディング</emphasis>HibernateはJNDIが立ち上がった後に
<literal>SessionFactory</literal> を生成します。
</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para>
<emphasis>JTAセッションバインディング</emphasis>
Hibernate <literal>Session</literal> のトランザクション境界はJTAトランザクションと同じになります。
単純に <literal>SessionFactory</literal> をJNDIからlookupして、
現在の <literal>Session</literal> を取得します。
JTAトランザクションが完了したときに、Hibernateが <literal>Session</literal> をフラッシュし、クローズします。
EJBデプロイメントディスクリプタの中に、トランザクション境界を宣言します。
</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para>
<emphasis>JMXデプロイ:</emphasis> もしJMXが使用可能なアプリケーションサーバ例えばJBOSS
がある場合、HibernateをMBeanとしてデプロイすることを選べます。
これは <literal>Configuration</literal> から <literal>SessionFactory</literal>
生成するコードを無くすことができます。
コンテナは <literal>HibernateService</literal> を起動し、
サービスの依存を理想的に管理しますデータソースはHibernateやその他が起動する前に
使用できるようにしなければなりません)。
</para>
</listitem>
</itemizedlist>
<para>
環境に依存しますが、もし、アプリケーションサーバが"connection containment"の例外をスローするなら
設定のオプション <literal>hibernate.connection.aggressive_release</literal>
をtrueにしてください。
</para>
<sect2 id="configuration-optional-transactionstrategy" revision="3">
<title>トランザクション戦略設定</title>
<para>
Hibernate <literal>Session</literal> APIは、アーキテクチャ内のシステムの管轄である
あらゆるトランザクションに依存しません。
もしコネクションプールのJDBCを直接使いたい場合、JDBC APIから
トランザクションを呼ぶことができます。
もし、J2EEアプリケーションサーバで動作させるなら、Bean管理トランザクションを使い、
必要に応じて <literal>UserTransaction</literal> をJTA APIから呼ぶことになるでしょう。
</para>
<para>
2つそれ以上の環境で互換性のあるコードを維持するために、オプションとして根本的なシステムを
ラッピングするHibernate <literal>Transaction</literal> APIを推奨します。
Hibernate設定プロパティの <literal>hibernate.transaction.factory_class</literal> を設定することで
ある特定の <literal>Transaction</literal> クラスのインスタンスを持つことができます。
</para>
<para>
3つの基本的な既にある選択を挙げます
</para>
<variablelist spacing="compact">
<varlistentry>
<term><literal>org.hibernate.transaction.JDBCTransactionFactory</literal></term>
<listitem>
<para>データベース(JDBC)トランザクションに委譲します(デフォルト)</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>org.hibernate.transaction.JTATransactionFactory</literal></term>
<listitem>
<para>
もし、このコンテキスト例えば、EJBセッションBeanメソッドで進行中のトランザクションが存在する、もしくは
新しいトランザクションが開始されており、Bean管理トランザクションが使われている場合、
コンテナ管理トランザクションに委譲します。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>org.hibernate.transaction.CMTTransactionFactory</literal></term>
<listitem>
<para>コンテナ管理JTAトランザクションに委譲します</para>
</listitem>
</varlistentry>
</variablelist>
<para>
自分自身のトランザクション戦略例えば、CORBAトランザクションサービスを定義することもできます。
</para>
<para>
Hibernateのいくつかの機能例えば、二次キャッシュ、JTAによるコンテキストセッション 等)は
管理された環境の中のJTA <literal>TransactionManager</literal> へのアクセスを要求します。
J2EEがひとつのメカニズムに規格化されていないので、
アプリケーションサーバにおいて、Hibernateが <literal>TransactionManager</literal> のリファレンス
を取得する方法を明確にする必要があります。
</para>
<table frame="topbot" id="jtamanagerlookup" revision="1">
<title>JTA トランザクションマネージャ</title>
<tgroup cols="2">
<colspec colwidth="2.5*"/>
<colspec colwidth="1*"/>
<thead>
<row>
<entry>Transaction Factory</entry>
<entry align="center">Application Server</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>org.hibernate.transaction.JBossTransactionManagerLookup</literal></entry>
<entry align="center">JBoss</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction.WeblogicTransactionManagerLookup</literal></entry>
<entry align="center">Weblogic</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction.WebSphereTransactionManagerLookup</literal></entry>
<entry align="center">WebSphere</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</literal></entry>
<entry align="center">WebSphere 6</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction.OrionTransactionManagerLookup</literal></entry>
<entry align="center">Orion</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction.ResinTransactionManagerLookup</literal></entry>
<entry align="center">Resin</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction.JOTMTransactionManagerLookup</literal></entry>
<entry align="center">JOTM</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction.JOnASTransactionManagerLookup</literal></entry>
<entry align="center">JOnAS</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction.JRun4TransactionManagerLookup</literal></entry>
<entry align="center">JRun4</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction.BESTransactionManagerLookup</literal></entry>
<entry align="center">Borland ES</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="configuration-optional-jndi" revision="3">
<title><literal>SessionFactory</literal> のJNDIへの登録</title>
<para>
JNDIに登録したHibernate <literal>SessionFactory</literal> は単純に
ファクトリをルックアップし、新しい <literal>Session</literal> を作ります。
これはJNDIに登録された <literal>Datasource</literal> には関連せず、
お互いにシンプルにこれらの登録を使うことに注意してください。
</para>
<para>
もし <literal>SessionFactory</literal> をJNDIネームスペースに登録したい場合、
特別な名前(例えば、 <literal>java:hibernate/SessionFactory</literal> )を
<literal>hibernate.session_factory_name</literal> プロパティに使ってください
もしこのプロパティを省略した場合、 <literal>SessionFactory</literal>
JNDIに登録されません。これはTomcatのようなデフォルト実装でJNDIが読みより専用の環境の場合特に便利です。
</para>
<para>
<literal>SessionFactory</literal> をJNDIに登録するとき、Hibernateは
<literal>hibernate.jndi.url</literal> の値を使用し、<literal>hibernate.jndi.class</literal>
をイニシャルコンテキストとして具体化します。
もし何も設定しない場合は、デフォルトの <literal>InitialContext</literal> を使用します。
</para>
<para>
<literal>cfg.buildSessionFactory()</literal> をコール後
Hibernateは自動的に <literal>SessionFactory</literal> をJNDIに配置します。
<literal>HibernateService</literal> と一緒にJMXデプロイメントを使わない限り、
これはこの呼び出しをアプリケーション内の何らかのスタートアップコード(もしくはユーティリティクラス)
に配置しなければならないことを意味します。(後で議論します)
</para>
<para>
もしJNDI <literal>SessionFactory</literal> を使う場合、EJBや他のクラスは
JNDIルックアップを使って <literal>SessionFactory</literal> を取得します。
</para>
<para>
管理された環境では <literal>SessionFactory</literal> をJNDIにバインドし、
そうでなければ <literal>static</literal> シングルトンを使うことを推奨します。
こういった詳細からアプリケーションコードを保護するために、
<literal>HibernateUtil.getSessionFactory()</literal> のようなヘルパークラスの中に、
<literal>SessionFactory</literal> をルックアップするコードを隠すことを推奨します。
このようなヘルパークラスはHibernateを開始する便利な手段でもあります。
&mdash;1章を参照してください。
</para>
</sect2>
<sect2 id="configuration-j2ee-currentsession" revision="4">
<title>JTAによる現在のセッションコンテキストマネージメント</title>
<para>
もっとも簡単に <literal>Session</literal> とトランザクションを扱う方法は、
Hibernateが自動的に「現在の」 <literal>Session</literal> を管理することです。
<xref linkend="architecture-current-session">カレントセッション</xref> の説明を参照してください。
もし <literal>「JTA」</literal> セッションコンテキストを使った上で、
現在のJTAトランザクションとHibernate <literal>Session</literal> が関連していない場合は、
最初に <literal>sessionFactory.getCurrentSession()</literal> をコールし、
JTAトランザクションとの関連付けを行ってください。
<literal>「JTA」</literal> コンテキストの <literal>getCurrentSession()</literal>
通じて取得した <literal>Session</literal> は、トランザクションが完了する前に
自動的にフラッシュし、完了した後には自動的にクローズします。
また、各ステートメント後にJDBCコネクションを積極的にリリースします。
これによりJTAトランザクションのライフサイクルで <literal>Session</literal> を管理することができ、
ユーザーのコードからそのような管理をするコードを排除できます。
<literal>UserTransaction</literal> を通じてJTAをプログラムで管理することができます。
または、ポータブルなコードであればHibernate <literal>Transaction</literal> APIを
トランザクション境界として使うこともできます。
EJBコンテナを使うときは、CMTによる宣言的トランザクション境界が好ましいです。
</para>
</sect2>
<sect2 id="configuration-j2ee-jmx" revision="1">
<title>JMXデプロイメント</title>
<para>
<literal>SessionFactory</literal> をJNDIから取得するためには
<literal>cfg.buildSessionFactory()</literal> 行をどこかで実行していなければなりません。
あなたはこれを、<literal>static</literal> 初期化ブロック内( <literal>HibernateUtil</literal> のような)か
<emphasis>managed service</emphasis> としてHibernateをデプロイするか、どちらかで実行できます。
</para>
<para>
JBOSSのようなJMXの機能でアプリケーションサーバにデプロイするために
<literal>org.hibernate.jmx.HibernateService</literal> を使って、配置します。
実際のデプロイメントと設定はベンダー特有です。
ここで例としてJBOSS 4.0.x用の <literal>jboss-service.xml</literal> を示します。
</para>
<programlisting><![CDATA[<?xml version="1.0"?>
<server>
<mbean code="org.hibernate.jmx.HibernateService"
name="jboss.jca:service=HibernateFactory,name=HibernateFactory">
<!-- Required services -->
<depends>jboss.jca:service=RARDeployer</depends>
<depends>jboss.jca:service=LocalTxCM,name=HsqlDS</depends>
<!-- Bind the Hibernate service to JNDI -->
<attribute name="JndiName">java:/hibernate/SessionFactory</attribute>
<!-- Datasource settings -->
<attribute name="Datasource">java:HsqlDS</attribute>
<attribute name="Dialect">org.hibernate.dialect.HSQLDialect</attribute>
<!-- Transaction integration -->
<attribute name="TransactionStrategy">
org.hibernate.transaction.JTATransactionFactory</attribute>
<attribute name="TransactionManagerLookupStrategy">
org.hibernate.transaction.JBossTransactionManagerLookup</attribute>
<attribute name="FlushBeforeCompletionEnabled">true</attribute>
<attribute name="AutoCloseSessionEnabled">true</attribute>
<!-- Fetching options -->
<attribute name="MaximumFetchDepth">5</attribute>
<!-- Second-level caching -->
<attribute name="SecondLevelCacheEnabled">true</attribute>
<attribute name="CacheProviderClass">org.hibernate.cache.EhCacheProvider</attribute>
<attribute name="QueryCacheEnabled">true</attribute>
<!-- Logging -->
<attribute name="ShowSqlEnabled">true</attribute>
<!-- Mapping files -->
<attribute name="MapResources">auction/Item.hbm.xml,auction/Category.hbm.xml</attribute>
</mbean>
</server>]]></programlisting>
<para>
このファイルは <literal>META-INF</literal> ディレクトリに配置され、
JARファイルを拡張した <literal>.sar</literal> (service archive)でパッケージ化されます。
同様にHibernateパッケージも必要です。また、Hibernateはサードパーティのライブラリも要求します。
コンパイルした永続化クラスとそのマッピングファイルも同様にアーカイブ(.sarファイルに入れます。
エンタープライズbean通常はセッションbeanは自身のJARファイルを保持しますが、
1回でホットデプロイ可能なユニットのためにメインサービスアーカイブとしてこのEJB JARファイルをインクルードする
ことができます。JBossアプリケーションサーバのドキュメントにJXMサービスと
EJBデプロイメントのより多くの情報があります。
</para>
</sect2>
</sect1>
</chapter>