Author: steve.ebersole(a)jboss.com
Date: 2007-10-18 23:50:52 -0400 (Thu, 18 Oct 2007)
New Revision: 14110
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/Hibernate_Reference.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/architecture.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/association_mapping.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/basic_mapping.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/batch.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/best_practices.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/collection_mapping.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/component_mapping.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/configuration.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/events.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_mappings.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_parentchild.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_weblog.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/filters.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/inheritance_mapping.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/performance.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/persistent_classes.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/preface.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_criteria.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_hql.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_sql.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/session_api.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/toolset_guide.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/transactions.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/tutorial.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/xml.xml
core/trunk/documentation/manual/ja-JP/src/main/docbook/legal_notice.xml
Log:
updated encoding to UTF-8
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/Hibernate_Reference.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/Hibernate_Reference.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/Hibernate_Reference.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY versionNumber "3.3.0.alpha1">
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/architecture.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/architecture.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/architecture.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,13 +1,15 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="architecture">
- <title>�A�[�L�e�N�`��</title>
+ <title>アーキテクチャ</title>
<sect1 id="architecture-overview" revision="1">
- <title>�T��</title>
+ <title>概観</title>
<para>
- Hibernate�A�[�L�e�N�`���́i���Ɂj�������x������̃r���[�F
+ Hibernateアーキテクチャの(非常に)高いレベルからのビュー:
</para>
<mediaobject>
@@ -20,18 +22,18 @@
</mediaobject>
<para>
- ���̐}��Hibernate���A�A�v���P�[�V�����ɑ��ĉi�����T�[�r�X
- �i�Ɖi���I�u�W�F�N�g�j����邽�߂ɁA�f�[�^�x�[�X�Ɛݒ�f�[�^��g�����Ƃ�
- �����Ă��܂��B
+ この図はHibernateが、アプリケーションに対して永続化サービス
+ (と永続オブジェクト)を提供するために、データベースと設定データを使うことを
+ 示しています。
</para>
<para>
- �����Ŏ��s���A�[�L�e�N�`���̂��ڍׂȃr���[���������܂��傤�B
- �����ɂ��AHibernate�͏_��ł���A���낢��ȃA�v���[�`��T�|�[�g���Ă��܂��B
- �����ł́A2�̋ɒ[�ȗ���������܂��B
- �u�y���v�A�[�L�e�N�`���ł́A�A�v���P�[�V���������O��JDBC�R�l�N�V������p�ӂ��A
- �A�v���P�[�V�������g���g�����U�N�V������Ǘ����܂��B
- ���̕��@�́AHibernate API�̍ŏ����̃T�u�Z�b�g��g���܂��F
+ ここで実行時アーキテクチャのより詳細なビューをお見せしましょう。
+ あいにく、Hibernateは柔軟であり、いろいろなアプローチをサポートしています。
+ ここでは、2つの極端な例をお見せします。
+ 「軽い」アーキテクチャでは、アプリケーションが自前のJDBCコネクションを用意し、
+ アプリケーション自身がトランザクションを管理します。
+ この方法は、Hibernate APIの最小限のサブセットを使います:
</para>
<mediaobject>
@@ -44,8 +46,8 @@
</mediaobject>
<para>
- �u�d���v�A�[�L�e�N�`���́A�A�v���P�[�V��������A���̉��Ɉʒu����JDBC��JTA��API��
- ��蕥���Ē��ۉ����A���̏ڍׂ̖ʓ|��Hibernate�Ɍ������܂��B
+ 「重い」アーキテクチャは、アプリケーションから、その下に位置するJDBCやJTAのAPIを
+ 取り払って抽象化し、その詳細の面倒をHibernateに見させます。
</para>
<mediaobject>
@@ -58,19 +60,19 @@
</mediaobject>
<para>
- �ȉ��́A��̐}�Ɋ܂܂��I�u�W�F�N�g�̒�`�ł��F
+ 以下は、上の図に含まれるオブジェクトの定義です:
<variablelist spacing="compact">
<varlistentry>
<term>SessionFactory
(<literal>org.hibernate.SessionFactory</literal>)</term>
<listitem>
<para>
- 1�̃f�[�^�x�[�X�ɑ���R���p�C�����ꂽ�}�b�s���O��
- �X���b�h�Z�[�t�ȁi�X�V�s�\�́j�L���b�V���B
- <literal>Session</literal> �̃t�@�N�g���ł���A
- <literal>ConnectionProvider</literal>
�̃N���C�A���g�B
- �I�v�V�����Ƃ��āA�v���Z�X�܂��̓N���X�^���x���ɂ����āA
- �g�����U�N�V�����Ԃōė��p�\�ȃf�[�^�́i�j�L���b�V�������܂��B
+ 1つのデータベースに対するコンパイルされたマッピングの
+ スレッドセーフな(更新不能の)キャッシュ。
+ <literal>Session</literal> のファクトリであり、
+ <literal>ConnectionProvider</literal> のクライアント。
+ オプションとして、プロセスまたはクラスタレベルにおいて、
+ トランザクション間で再利用可能なデータの(二次)キャッシュを持ちます。
</para>
</listitem>
</varlistentry>
@@ -78,38 +80,38 @@
<term>Session
(<literal>org.hibernate.Session</literal>)</term>
<listitem>
<para>
- �A�v���P�[�V�����Ɖi���X�g�A�Ƃ̑Θb��\���A
- �V���O���X���b�h�ŒZ���̃I�u�W�F�N�g�B
- JDBC�R�l�N�V�������b�v���܂��B
- <literal>Transaction</literal> �̃t�@�N�g���ł��B
- �i���I�u�W�F�N�g�̕K�{�́i�ꎟ�j�L���b�V����ێ����܂��B
- ���̃L���b�V���̓I�u�W�F�N�g�O���t��i�r�Q�[�V�������鎞��A
- ���ʎq�ŃI�u�W�F�N�g�������鎞�Ɏg���܂��B
+ アプリケーションと永続ストアとの対話を表す、
+ シングルスレッドで短命のオブジェクト。
+ JDBCコネクションをラップします。
+ <literal>Transaction</literal> のファクトリです。
+ 永続オブジェクトの必須の(一次)キャッシュを保持します。
+ このキャッシュはオブジェクトグラフをナビゲーションする時や、
+ 識別子でオブジェクトを検索する時に使われます。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>Persistent objects �� Collections</term>
+ <term>Persistent objects と Collections</term>
<listitem>
<para>
-
�i������Ԃƃr�W�l�X���\�b�h���A�Z���ŃV���O���X���b�h�̃I�u�W�F�N�g�B
- ����͒ʏ��JavaBeans/POJO�̂��Ƃ����܂����A�����I�Ȃ��Ƃ́A
- ���̎��_�ł́i����1�́j <literal>Session</literal>
�Ɗ֘A���Ă��邱�Ƃł��B
- <literal>Session</literal>
���N���[�Y�����Ƃ����ɁA
- �����͐藣����đ��̃A�v���P�[�V�����w���玩�R�Ɏg�����Ƃ��ł��܂��B
- �i�Ⴆ�f�[�^�E�g�����X�t�@�E�I�u�W�F�N�g�Ƃ��āA
-
�v���[���e�[�V�����w����A�܂��̓v���[���e�[�V�����w�֒��ڎg�p�ł��܂��B�j
+ 永続化状態とビジネスメソッドを持つ、短命でシングルスレッドのオブジェクト。
+ これは通常のJavaBeans/POJOのこともありますが、特徴的なことは、
+ その時点での(ただ1つの) <literal>Session</literal>
と関連していることです。
+ <literal>Session</literal> がクローズされるとすぐに、
+ それらは切り離されて他のアプリケーション層から自由に使うことができます。
+ (例えばデータ・トランスファ・オブジェクトとして、
+ プレゼンテーション層から、またはプレゼンテーション層へ直接使用できます。)
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>Transient �� detached �� objects ��
Collections</term>
+ <term>Transient と detached な objects と
Collections</term>
<listitem>
<para>
- �����_�ł� <literal>Session</literal>
�Ɗ֘A���Ă��Ȃ��A
- �i���N���X�̃C���X�^���X�B
-
���łɃA�v���P�[�V�������ŃC���X�^���X������Ă��āA�܂��i��������Ă��Ȃ����A
- �N���[�Y���ꂽ <literal>Session</literal>
�ŃC���X�^���X�����ꂽ���̂ǂ��炩�ł��B
+ 現時点では <literal>Session</literal> と関連していない、
+ 永続クラスのインスタンス。
+ すでにアプリケーション側でインスタンス化されていて、まだ永続化されていないか、
+ クローズされた <literal>Session</literal>
でインスタンス化されたかのどちらかです。
</para>
</listitem>
</varlistentry>
@@ -117,13 +119,13 @@
<term>Transaction
(<literal>org.hibernate.Transaction</literal>)</term>
<listitem>
<para>
- (�I�v�V����)���q������ƒP��(Unit of
Work)��w�肷�邽�߂ɁA�A�v���P�[�V�������g�p����A
- �V���O���X���b�h�ŒZ���ȃI�u�W�F�N�g�B
-
���Ɉʒu����JDBC�AJTA�ACORBA�g�����U�N�V��������A�v���P�[�V�����𒊏ۉ����܂��B
- <literal>Session</literal> �́A���ɂ�
- �������� <literal>Transaction</literal>
��܂����邩�����܂���B
- �������A���̑w��API��g���ɂ���A
<literal>Transaction</literal> ��g���ɂ���A
- �g�����U�N�V�������E��ݒ肷�邱�Ƃ́A�����ăI�v�V�����ł͂���܂���I�B
+ (オプション)原子性を持つ作業単位(Unit of Work)を指定するために、アプリケーションが使用する、
+ シングルスレッドで短命なオブジェクト。
+ 下に位置するJDBC、JTA、CORBAトランザクションからアプリケーションを抽象化します。
+ <literal>Session</literal> は、時には
+ いくつかの <literal>Transaction</literal>
をまたがるかもしれません。
+ しかし、下の層のAPIを使うにせよ、 <literal>Transaction</literal>
を使うにせよ、
+ トランザクション境界を設定することは、決してオプションではありません!。
</para>
</listitem>
</varlistentry>
@@ -131,10 +133,10 @@
<term>ConnectionProvider
(<literal>org.hibernate.connection.ConnectionProvider</literal>)</term>
<listitem>
<para>
- (�I�v�V����)JDBC�R�l�N�V�����i�Ƃ��̃v�[���j�̃t�@�N�g���B
- ���̑w�Ɉʒu���� <literal>Datasource</literal> ��
- <literal>DriverManager</literal>
����A�v���P�[�V�����𒊏ۉ����܂��B
-
�A�v���P�[�V�����ɂ͌��J����܂��A�J���҂��p���܂��͎������邱�Ƃ͉\�ł��B
+ (オプション)JDBCコネクション(とそのプール)のファクトリ。
+ 下の層に位置する <literal>Datasource</literal> や
+ <literal>DriverManager</literal>
からアプリケーションを抽象化します。
+ アプリケーションには公開されませんが、開発者が継承または実装することは可能です。
</para>
</listitem>
</varlistentry>
@@ -142,8 +144,8 @@
<term>TransactionFactory
(<literal>org.hibernate.TransactionFactory</literal>)</term>
<listitem>
<para>
- (�I�v�V����) <literal>Transaction</literal>
�C���X�^���X�̃t�@�N�g���B
-
�A�v���P�[�V�����ɂ͌��J����܂��A�J���҂��p���܂��͎������邱�Ƃ͉\�ł��B
+ (オプション) <literal>Transaction</literal>
インスタンスのファクトリ。
+ アプリケーションには公開されませんが、開発者が継承または実装することは可能です。
</para>
</listitem>
</varlistentry>
@@ -151,9 +153,9 @@
<term><emphasis>Extension
Interfaces</emphasis></term>
<listitem>
<para>
- Hibernate�́A�i���w�̐U�镑����J�X�^�}�C�Y���邽�߂ɁA
- �����̃I�v�V�����g���C���^�t�F�[�X��p�ӂ��Ă��܂��B
- �ڍׂ�API�h�L�������g��Q�Ƃ��Ă��������B
+ Hibernateは、永続層の振る舞いをカスタマイズするために、
+ 多くのオプション拡張インタフェースを用意しています。
+ 詳細はAPIドキュメントを参照してください。
</para>
</listitem>
</varlistentry>
@@ -161,18 +163,18 @@
</para>
<para>
- �u�y���v�A�[�L�e�N�`���ł́A�A�v���P�[�V�����͒���JTA��JDBC�ƑΘb���邽�߂ɁA
- <literal>Transaction</literal> ��
<literal>TransactionFactory</literal> ��
- <literal>ConnectionProvider</literal> ��o�C�p�X���܂��B
+ 「軽い」アーキテクチャでは、アプリケーションは直接JTAやJDBCと対話するために、
+ <literal>Transaction</literal> や
<literal>TransactionFactory</literal> や
+ <literal>ConnectionProvider</literal> をバイパスします。
</para>
</sect1>
<sect1 id="architecture-states" revision="1">
- <title>�C���X�^���X�̏��</title>
+ <title>インスタンスの状態</title>
<para>
- �i���N���X�̃C���X�^���X�́A���̂R�̈قȂ��Ԃ̂ǂꂩ�ɂȂ�܂��B
- ����́A <emphasis>�i���R���e�L�X�g</emphasis> �ɂ���Č��܂�܂��B
- Hibernate�� <literal>Session</literal>
�I�u�W�F�N�g���A�i���R���e�L�X�g�ɂȂ�܂��B
+ 永続クラスのインスタンスは、次の3つの異なる状態のどれかになります。
+ それは、 <emphasis>永続コンテキスト</emphasis> によって決まります。
+ Hibernateの <literal>Session</literal> オブジェクトが、永続コンテキストになります。
</para>
<variablelist spacing="compact">
@@ -180,9 +182,9 @@
<term>transient</term>
<listitem>
<para>
- ���̏�Ԃ̃C���X�^���X�́A���݂�����ĉߋ��ɂ����Ă�A
- �i���R���e�L�X�g�Ɋ֘A�Â��Ă��܂���B�܂��A�i��ID�i��L�[�̒l�j��
- �����Ă��܂���B
+ この状態のインスタンスは、現在もそして過去においても、
+ 永続コンテキストに関連づいていません。また、永続ID(主キーの値)を
+ 持っていません。
</para>
</listitem>
</varlistentry>
@@ -190,12 +192,12 @@
<term>persistent</term>
<listitem>
<para>
- ���̏�Ԃ̃C���X�^���X�́A���̎��_�ʼni���R���e�L�X�g�Ɋ֘A�Â��Ă��܂��B
- �܂��A�i��ID�i��L�[�̒l�j�����A
- �����Ă��̓f�[�^�x�[�X�ɑΉ�����s�����Ă���ł��傤�B
- �X�̉i���R���e�L�X�g�̂Ȃ��ł́A�i��ID��
- Java��ID�i�I�u�W�F�N�g�̃�������̈ʒu�j�Ɠ����ł��邱�Ƃ�
- Hibernate�� <emphasis>�ۏ�</emphasis> ���܂��B
+ この状態のインスタンスは、その時点で永続コンテキストに関連づいています。
+ また、永続ID(主キーの値)を持ち、
+ たいていはデータベースに対応する行を持っているでしょう。
+ 個々の永続コンテキストのなかでは、永続IDが
+ JavaのID(オブジェクトのメモリ上の位置)と同じであることを
+ Hibernateが <emphasis>保証</emphasis> します。
</para>
</listitem>
</varlistentry>
@@ -203,12 +205,12 @@
<term>detached</term>
<listitem>
<para>
- ���̏�Ԃ̃C���X�^���X�́A���ĉi���R���e�L�X�g�Ɋ֘A�Â���ꂽ���A
- ���̃R���e�L�X�g���N���[�Y���ꂽ���A���邢�́A
- ���̃v���Z�X�ɂ��̃C���X�^���X���V���A���C�Y���ꂽ���ł��B
- ���̃C���X�^���X�́A�i��ID�����A�����Ă��̓f�[�^�x�[�X��
- �Ή�����s�����Ă���ł��傤�B�����C���X�^���X�ɑ��ẮA
- �i��ID��Java��ID�Ƃ̊֘A�́AHibernate���ۏ��܂���B
+ この状態のインスタンスは、かつて永続コンテキストに関連づけられたが、
+ そのコンテキストがクローズされたか、あるいは、
+ 他のプロセスにそのインスタンスがシリアライズされたかです。
+ このインスタンスは、永続IDを持ち、たいていはデータベースに
+ 対応する行を持っているでしょう。分離インスタンスに対しては、
+ 永続IDとJavaのIDとの関連は、Hibernateが保証しません。
</para>
</listitem>
</varlistentry>
@@ -216,157 +218,157 @@
</sect1>
<sect1 id="architecture-jmx" revision="1">
- <title>JMX�Ƃ̓���</title>
+ <title>JMXとの統合</title>
<para>
- JMX��Java�R���|�[�l���g�Ǘ���J2EE�W���ł��B
- JMX�W���T�[�r�X��ʂ��āAHibernate�͊Ǘ�����܂��B
- �f�B�X�g���r���[�V�����̒���
<literal>org.hibernate.jmx.HibernateService</literal> �Ƃ���
- MBean������p�ӂ��Ă��܂��B
+ JMXはJavaコンポーネント管理のJ2EE標準です。
+ JMX標準サービスを通して、Hibernateは管理されます。
+ ディストリビューションの中に
<literal>org.hibernate.jmx.HibernateService</literal> という
+ MBean実装を用意しています。
</para>
<para>
- JBoss
�A�v���P�[�V�����T�[�o�[���Hibernate��JMX�T�[�r�X�Ƃ��ăf�v���C������@�̗�Ƃ��ẮA
- JBoss ���[�U�K�C�h��Q�Ƃ��Ă��������B JBoss �A�v���P�[�V�����T�[�o�[�ɂ����āA
- JMX��g���ăf�v���C����ƁA���̃����b�g�������܂��B
+ JBoss アプリケーションサーバー上にHibernateをJMXサービスとしてデプロイする方法の例としては、
+ JBoss ユーザガイドを参照してください。 JBoss アプリケーションサーバーにおいて、
+ JMXを使ってデプロイすると、次のメリットが得られます。
</para>
<itemizedlist>
<listitem>
<para>
- <emphasis>�Z�b�V�����Ǘ�:</emphasis> Hibernate��
<literal>Session</literal> �̃��C�t�T�C�N���́A
- �����I��JTA�g�����U�N�V�����̃X�R�[�v�Ɍ��т����܂��B����́A��͂�蓮��
- <literal>Session</literal>
��I�[�v��������A�N���[�Y�����肷��K�v���Ȃ����Ƃ�Ӗ����܂��B
- ����́AJBoss EJB �C���^�[�Z�v�^�̎d���ɂȂ�܂��B
- �܂��A�R�[�h�̂ǂ��Ńg�����U�N�V�������E��ݒ肷�邩�ɂ��āA
- ��͂�Y�ޕK�v������܂���i������ڐA�\�ȉi���w�������Ȃ��Ă����̂Ȃ�A
- �I�v�V������Hibernate�� <literal>Transaction</literal>
��g�p�����������B�j
- <literal>Session</literal> �ɃA�N�Z�X���邽�߂ɂ́A
<literal>HibernateContext</literal> ��
- �R�[�������������B
+ <emphasis>セッション管理:</emphasis> Hibernateの
<literal>Session</literal> のライフサイクルは、
+ 自動的にJTAトランザクションのスコープに結びつけられます。これは、もはや手動で
+ <literal>Session</literal>
をオープンしたり、クローズしたりする必要がないことを意味します。
+ これは、JBoss EJB インターセプタの仕事になります。
+ また、コードのどこでトランザクション境界を設定するかについて、
+ もはや悩む必要がありません(もちろん移植可能な永続層を書かかなくていいのならば、
+ オプションのHibernateの <literal>Transaction</literal>
を使用してください。)
+ <literal>Session</literal> にアクセスするためには、
<literal>HibernateContext</literal> を
+ コールしてください。
</para>
</listitem>
<listitem>
<para>
- <emphasis>HAR �f�v���C:</emphasis> �ʏ�A(EAR �܂��� SAR
�t�@�C���ɂ���jJBoss �T�[�r�X
- �f�v���C�����g�f�B�X�N���v�^��g���āAHibernate JMX
�T�[�r�X��f�v���C���܂��B
- ����́AHibernate�� <literal>SessionFactory</literal>
�̑S�Ă̈�ʓI�Ȑݒ�I�v�V������
-
�T�|�[�g���܂��B�������ˑR�Ƃ��ăf�v���C�����g�f�B�X�N���v�^�̂Ȃ��ɂ��ׂẴ}�b�s���O�t�@�C����
- ���O������K�v������܂��B
- ����A�I�v�V������HAR�f�v���C�����g��g�����Ƃ��߂��Ȃ�A
- JBoss�͎����I��HAR�t�@�C���̂Ȃ��̑S�Ẵ}�b�s���O�t�@�C�����o���܂��B
+ <emphasis>HAR デプロイ:</emphasis> 通常、(EAR または SAR
ファイルにある)JBoss サービス
+ デプロイメントディスクリプタを使って、Hibernate JMX サービスをデプロイします。
+ それは、Hibernateの <literal>SessionFactory</literal>
の全ての一般的な設定オプションを
+ サポートします。しかし依然としてデプロイメントディスクリプタのなかにすべてのマッピングファイルの
+ 名前を挙げる必要があります。
+ もし、オプションのHARデプロイメントを使うことを決めたなら、
+ JBossは自動的にHARファイルのなかの全てのマッピングファイルを検出します。
</para>
</listitem>
</itemizedlist>
<para>
- �����̃I�v�V�����ɂ��Ă̏ڍׂȏ��́AJBoss�A�v���P�[�V�����T�[�o���[�U�K�C�h��
- �Q�l�ɂ��Ă��������B
+ これらのオプションについての詳細な情報は、JBossアプリケーションサーバユーザガイドを
+ 参考にしてください。
</para>
<para>
- JMX�T�[�r�X�Ƃ��ė��p�\�ȑ��̋@�\�ɁAHibernate���s�����v�����܂��B
- <xref linkend="configuration-optional-statistics"/>
�����������B
+ JMXサービスとして利用可能な他の機能に、Hibernate実行時統計情報があります。
+ <xref linkend="configuration-optional-statistics"/>
を見てください。
</para>
</sect1>
<sect1 id="architecture-jca" revision="1">
- <title>JCA �T�|�[�g</title>
+ <title>JCA サポート</title>
<para>
- Hibernate �� JCA �R�l�N�^�Ƃ��Ă�ݒ�ł��܂��B�ڍׂɂ��ẮAWeb�T�C�g���Ă��������B
- Hibernate JCA �T�|�[�g�́A���̂Ƃ�������i�K�Ƃ��čl�����Ă��邱�Ƃɒ��ӂ��Ă��������B
+ Hibernate は JCA コネクタとしても設定できます。詳細については、Webサイトを見てください。
+ Hibernate JCA サポートは、今のところ実験段階として考えられていることに注意してください。
</para>
</sect1>
<sect1 id="architecture-current-session" revision="2">
- <title>�R���e�L�X�g��̃Z�b�V����</title>
+ <title>コンテキスト上のセッション</title>
<para>
- Hibernate
��g�����A�v���P�[�V�����́A�قƂ�ǁA�Ȃ�炩�̌`��"�R���e�L�X�g���"�Z�b�V�������K�v�ɂȂ�܂��B
-
�u�R���e�L�X�g��̃Z�b�V�����v�́A����̃R���e�L�X�g�̃X�R�[�v�̂Ȃ��ŗL���ȃZ�b�V�����̂��Ƃł��B
- �������A�ʏ�A�v���P�[�V�������ƂɃR���e�L�X�g��\�������̂̒�`�͈قȂ�܂��B
- ������A�قȂ镡���̃R���e�L�X�g�́A�����_�ɑ��ĈقȂ�X�R�[�v���`���܂��B
- �o�[�W����3.0���O�� Hibernate �ł́A�����
<literal>ThreadLocal</literal> �x�[�X�́u�R���e�L�X�g��̃Z�b�V�����v��
- ���p���邩�A <literal>HibernateUtil</literal>
�̂悤�ȃw���p�[�N���X�𗘗p���邩�A
- proxy/interception �x�[�X�́u�R���e�L�X�g��̃Z�b�V�����v�����
- �iSpring �� Pico �̂悤�ȁj�T�[�h�p�[�e�B�̃t���[�����[�N�𗘗p���邩�̂����ꂩ�ł����B
+ Hibernate を使ったアプリケーションは、ほとんど、なんらかの形で"コンテキスト上の"セッションが必要になります。
+ 「コンテキスト上のセッション」は、特定のコンテキストのスコープのなかで有効なセッションのことです。
+ しかし、通常アプリケーションごとにコンテキストを構成するものの定義は異なります。
+ しかも、異なる複数のコンテキストは、現時点に対して異なるスコープを定義します。
+ バージョン3.0より前の Hibernate では、自作の <literal>ThreadLocal</literal>
ベースの「コンテキスト上のセッション」を
+ 利用するか、 <literal>HibernateUtil</literal> のようなヘルパークラスを利用するか、
+ proxy/interception ベースの「コンテキスト上のセッション」を提供する
+ (Spring や Pico のような)サードパーティのフレームワークを利用するかのいずれかでした。
</para>
<para>
- �o�[�W���� 3.0.1 ����AHibernate �ɂ�
<literal>SessionFactory.getCurrentSession()</literal> ��
- �����܂����B ����́A <literal>JTA</literal>
�g�����U�N�V�����̎g�p��O��ɂ��Ă��܂��B
- <literal>JTA</literal>
�g�����U�N�V�����́A���݂̃Z�b�V�����̃X�R�[�v�ƃR���e�L�X�g�̗������`���܂��B
- Hibernate �`�[���́A���̂��Ƃ�咣���܂��B
- ����ȃX�^���h�A������ <literal>JTA TransactionManager</literal>
���������n������A
- <literal>J2EE</literal> �R���e�i��Ƀf�v���C����邩�ǂ����ɂ�����炸�A
- �قƂ�ǂ́i���ׂĂƂ͌���Ȃ����j�A�v���P�[�V�������A
- <literal>JTA</literal> �g�����U�N�V�����Ǘ���g�p���ׂ��ł���ƁB
- ���̍l���Ɋ�Â��ƁA <literal>JTA</literal>
�x�[�X�́u�R���e�L�X�g��̃Z�b�V�����v��
- �g�������Ȃ��ł��傤�B
+ バージョン 3.0.1 から、Hibernate には
<literal>SessionFactory.getCurrentSession()</literal> が
+ 加わりました。 これは、 <literal>JTA</literal> トランザクションの使用を前提にしています。
+ <literal>JTA</literal> トランザクションは、現在のセッションのスコープとコンテキストの両方を定義します。
+ Hibernate チームは、次のことを主張します。
+ 巨大なスタンドアロンの <literal>JTA TransactionManager</literal> 実装が成熟したら、
+ <literal>J2EE</literal> コンテナ上にデプロイされるかどうかにかかわらず、
+ ほとんどの(すべてとは言わないが)アプリケーションが、
+ <literal>JTA</literal> トランザクション管理を使用すべきであると。
+ この考えに基づくと、 <literal>JTA</literal> ベースの「コンテキスト上のセッション」を
+ 使うしかないでしょう。
</para>
<para>
- �������A�o�[�W���� 3.1 ����́A
<literal>SessionFactory.getCurrentSession()</literal> �̌�̏������A
- �v���K�u���ɂȂ�܂����B
-
�����āA���݂̃Z�b�V�������`����X�R�[�v�ƃR���e�L�X�g�̃v���K�r���e�B��\�ɂ��邽�߂ɁA
- �V�����g���C���^�t�F�[�X (
<literal>org.hibernate.context.CurrentSessionContext</literal> ) ��
- �V�����\���p�����[�^ (
<literal>hibernate.current_session_context_class</literal> ) ���lj�����܂����B
+ しかし、バージョン 3.1 からは、
<literal>SessionFactory.getCurrentSession()</literal> の後の処理が、
+ プラガブルになりました。
+ これを受けて、現在のセッションを定義するスコープとコンテキストのプラガビリティを可能にするために、
+ 新しい拡張インタフェース (
<literal>org.hibernate.context.CurrentSessionContext</literal> ) と
+ 新しい構成パラメータ (
<literal>hibernate.current_session_context_class</literal> ) が追加されました。
</para>
<para>
- <literal>org.hibernate.context.CurrentSessionContext</literal>
�C���^�t�F�[�X�̋K��ɂ��Ă�
- �ڍׂȓ�e�� Javadoc ��Q�Ƃ��Ă��������B
- ����ɂ́A <literal>currentSession()</literal>
�Ƃ���1�̃��\�b�h����`����Ă���A
- ���̎����́A���݂́u�R���e�L�X�g��̃Z�b�V�����v��ǐՂ��邱�ƂɐӔC�����܂��B
- ���̂܂g����悤�ɁAHibernate�͂��̃C���^�t�F�[�X�̎�����2���Ă��܂��B
+ <literal>org.hibernate.context.CurrentSessionContext</literal>
インタフェースの規約についての
+ 詳細な内容は Javadoc を参照してください。
+ それには、 <literal>currentSession()</literal> という1つのメソッドが定義されており、
+ その実装は、現在の「コンテキスト上のセッション」を追跡することに責任を持ちます。
+ そのまま使えるように、Hibernateはこのインタフェースの実装を2つ提供しています。
</para>
<itemizedlist>
<listitem>
<para>
<literal>org.hibernate.context.JTASessionContext</literal> -
- <literal>JTA</literal>
�g�����U�N�V�����ɂ���āA���݂̃Z�b�V�������ǐՂ���A
- �X�R�[�v���߂��܂��B���̏����́A�Â�JTA�����̃A�v���[�`�Ƃ܂����������ł��B
- �ڍׂ�Javadoc��Q�Ƃ��Ă��������B
+ <literal>JTA</literal> トランザクションによって、現在のセッションが追跡され、
+ スコープを決められます。この処理は、古いJTAだけのアプローチとまったく同じです。
+ 詳細はJavadocを参照してください。
</para>
</listitem>
<listitem>
<para>
<literal>org.hibernate.context.ThreadLocalSessionContext</literal> -
- �X���b�h�̎��s�ɂ���āA���݂̃Z�b�V�������ǐՂ���܂��B
- �ڍׂ�Javadoc��Q�Ƃ��Ă��������B
+ スレッドの実行によって、現在のセッションが追跡されます。
+ 詳細はJavadocを参照してください。
</para>
</listitem>
<listitem>
<para>
<literal>org.hibernate.context.ManagedSessionContext</literal> -
- �X���b�h�̎��s�ɂ���āA���݂̃Z�b�V�������ǐՂ���܂��B
- �������A���̃N���X��static���\�b�h��
<literal>Session</literal> �C���X�^���X��
- �o�C���h/�A���o�C���h����ӔC�͂��Ȃ��ɂ���܂��B
- ����͌����� <literal>Session</literal>
��I�[�v���A�t���b�V���A�N���[�Y���܂���B
+ スレッドの実行によって、現在のセッションが追跡されます。
+ しかし、このクラスのstaticメソッドで <literal>Session</literal> インスタンスを
+ バインド/アンバインドする責任はあなたにあります。
+ これは決して <literal>Session</literal> をオープン、フラッシュ、クローズしません。
</para>
</listitem>
</itemizedlist>
<para>
- �n�߂�2�̎����́A"1�Z�b�V���� - 1�f�[�^�x�[�X�g�����U�N�V����"
�v���O���~���O���f������܂��B
- �����
<emphasis>���N�G�X�g���Ƃ̃Z�b�V�����isession-per-request�j</emphasis>
�Ƃ��Ă�m���Ă���A�g���Ă��܂��B
- Hibernate �Z�b�V�����̊J�n�ƏI���́A�f�[�^�x�[�X�g�����U�N�V�����̊��ԂŌ��܂�܂��B
- JTA��g��Ȃ����ʂ�JSE�ŁA�v���O������̃g�����U�N�V�������E�ݒ��s���Ȃ�A
- �R�[�h�����b�̃g�����U�N�V�����V�X�e����B�����邽�߂ɁA
- Hibernate <literal>Transaction</literal> API��g���Ƃ悢�ł��傤�B
- JTA��g���Ȃ�A�g�����U�N�V�����̋��E�ݒ�ɂ́AJTA�C���^�[�t�F�C�X��g���Ă��������B
-
CMT��T�|�[�g����EJB�R���e�i�Ŏ��s������Ȃ�A�g�����U�N�V�������E�͐錾�I�ɒ�`�ł��邽�߁A
- �R�[�h��Ńg�����U�N�V������Z�b�V�����̋��E��ݒ肷��K�v�͂���܂���B
- ����ɏڍׂȏ���R�[�h�̗�́A <xref linkend="transactions"/>
��Q�Ƃ��Ă��������B
+ 始めの2つの実装は、"1セッション - 1データベーストランザクション" プログラミングモデルを提供します。
+ これは <emphasis>リクエストごとのセッション(session-per-request)</emphasis>
としても知られており、使われています。
+ Hibernate セッションの開始と終了は、データベーストランザクションの期間で決まります。
+ JTAを使わない普通のJSEで、プログラム上のトランザクション境界設定を行うなら、
+ コードから基礎のトランザクションシステムを隠蔽するために、
+ Hibernate <literal>Transaction</literal> APIを使うとよいでしょう。
+ JTAを使うなら、トランザクションの境界設定には、JTAインターフェイスを使ってください。
+ CMTをサポートするEJBコンテナで実行するつもりなら、トランザクション境界は宣言的に定義できるため、
+ コード上でトランザクションやセッションの境界を設定する必要はありません。
+ さらに詳細な情報やコードの例は、 <xref linkend="transactions"/> を参照してください。
</para>
<para>
- <literal>hibernate.current_session_context_class</literal>
�ݒ�p�����[�^�́A
- <literal>org.hibernate.context.CurrentSessionContext</literal>
�̂ǂ̎�����g������w�肵�܂��B
- ���ʌ݊����̂��߁A���̃p�����[�^���ݒ肳�ꂸ
-
<literal>org.hibernate.transaction.TransactionManagerLookup</literal>
���ݒ肳��Ă����ꍇ�A
- Hibernate��
<literal>org.hibernate.context.JTASessionContext</literal>
��g�����Ƃɒ��ӂ��Ă��������B
- �ʏ킱�̃p�����[�^�̒l�ɂ́A3�̎����̒�����g�p��������N���X�̖��O�ڎw�肵�܂��B
- �������A"jta", "thread",
"managed"�Ƃ������ꂼ��̏ȗ�����p�ӂ���Ă��܂��B
+ <literal>hibernate.current_session_context_class</literal>
設定パラメータは、
+ <literal>org.hibernate.context.CurrentSessionContext</literal>
のどの実装を使うかを指定します。
+ 下位互換性のため、このパラメータが設定されず
+
<literal>org.hibernate.transaction.TransactionManagerLookup</literal>
が設定されていた場合、
+ Hibernateは
<literal>org.hibernate.context.JTASessionContext</literal> を使うことに注意してください。
+ 通常このパラメータの値には、3つの実装の中から使用する実装クラスの名前を直接指定します。
+ しかし、"jta", "thread",
"managed"というそれぞれの省略名も用意されています。
</para>
</sect1>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/association_mapping.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/association_mapping.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/association_mapping.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,39 +1,41 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="associations">
- <title>�֘A�}�b�s���O</title>
+ <title>関連マッピング</title>
<sect1 id="assoc-intro" revision="1">
- <title>�C���g���_�N�V����</title>
+ <title>イントロダクション</title>
<para>
- �֘A�}�b�s���O�͂����Η����ł�����̂ɂȂ�܂��B
- ���̏͂ł́A��{�I�Ȉ��̃P�[�X�ɂ��ďq�ׂ܂��B
- �P�����̃}�b�s���O����n�߁A���ꂩ��o�����̃P�[�X�ɂ��čl���Ă����܂��B
- ��Ƃ��āA<literal>Person</literal> ��
<literal>Address</literal> ��p���܂��B
+ 関連マッピングはしばしば理解が最も難しいものになります。
+ この章では、基本的な一つ一つのケースについて述べます。
+ 単方向のマッピングから始め、それから双方向のケースについて考えていきます。
+ 例として、<literal>Person</literal> と
<literal>Address</literal> を用います。
</para>
<para>
- �֘A�́A�����e�[�u�������邩���ǂ����ƁA
- ���d�x�ɂ���ĕ��ނ��邱�Ƃɂ��܂��B
+ 関連は、結合テーブルを入れるかかどうかと、
+ 多重度によって分類することにします。
</para>
<para>
- ���ׂĂ̗��not null�̊O���L�[��g�p���܂��B
- �����Hibernate�̗v���ł͂���܂���B
- not null�����O�����Ƃ��Ă�A�}�b�s���O�͖��Ȃ����삵�܂��B
+ すべての例でnot nullの外部キーを使用します。
+ これはHibernateの要件ではありません。
+ not null制約を外したとしても、マッピングは問題なく動作します。
</para>
</sect1>
<sect1 id="assoc-unidirectional" revision="1">
- <title>�P�����֘A</title>
+ <title>単方向関連</title>
<sect2 id="assoc-unidirectional-m21">
- <title>���Έ�</title>
+ <title>多対一</title>
<para>
- <emphasis>�P�������Έ�֘A</emphasis> �͒P�����֘A�̒��ōł��ʓI�Ȃ�̂ł��B
+ <emphasis>単方向多対一関連</emphasis> は単方向関連の中で最も一般的なものです。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -58,11 +60,11 @@
</sect2>
<sect2 id="assoc-unidirectional-121">
- <title>��Έ�</title>
+ <title>一対一</title>
<para>
- <emphasis>�O���L�[�̒P������Έ�֘A</emphasis> �͂قƂ�Ǔ�����̂ł��B
- �B��Ⴄ�̂́A�J�����̃��j�[�N�Ȑ���ł��B
+ <emphasis>外部キーの単方向一対一関連</emphasis> はほとんど同じものです。
+ 唯一違うのは、カラムのユニークな制約です。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -86,8 +88,8 @@
]]></programlisting>
<para>
- <emphasis>��L�[�̒P������Έ�֘A</emphasis>
�͒ʏ�A���ʂ�ID�W�F�l���[�^��g���܂��B
- �i���̗�ł͊֘A�̕������t�ɂȂ��Ă��邱�Ƃɒ��ӂ��Ă��������j
+ <emphasis>主キーの単方向一対一関連</emphasis> は通常、特別なIDジェネレータを使います。
+ (この例では関連の方向が逆になっていることに注意してください)
</para>
<programlisting><![CDATA[<class name="Person">
@@ -112,11 +114,11 @@
</sect2>
<sect2 id="assoc-unidirectional-12m">
- <title>��Α�</title>
+ <title>一対多</title>
<para>
- <emphasis>�O���L�[�̒P������Α��֘A</emphasis> �͂ƂĂ����ȃP�[�X�ŁA
- ���܂萄������Ă��܂���B
+ <emphasis>外部キーの単方向一対多関連</emphasis> はとても特殊なケースで、
+ あまり推奨されていません。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -141,7 +143,7 @@
]]></programlisting>
<para>
- ���̂悤�Ȋ֘A�̂��߂Ɍ����e�[�u����g�����Ƃ��E�߂��܂��B
+ このような関連のために結合テーブルを使うことをお薦めします。
</para>
</sect2>
@@ -149,16 +151,16 @@
</sect1>
<sect1 id="assoc-unidirectional-join" revision="1">
- <title>�����e�[�u����g�����P�����֘A</title>
+ <title>結合テーブルを使った単方向関連</title>
<sect2 id="assoc-unidirectional-join-12m">
- <title>��Α�</title>
+ <title>一対多</title>
<para>
- <emphasis>�����e�[�u����g�����P������Α��֘A</emphasis>
- �͂��D�܂����ł��B
- <literal>unique="true"</literal>
�̎w��ɂ��A���d�x�����Α������Α�
- �ɕς�������Ƃɒ��ӂ��ĉ������B
+ <emphasis>結合テーブルを使った単方向一対多関連</emphasis>
+ はより好ましいです。
+ <literal>unique="true"</literal> の指定により、多重度が多対多から一対多
+ に変わったことに注意して下さい。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -187,11 +189,11 @@
</sect2>
<sect2 id="assoc-unidirectional-join-m21">
- <title>���Έ�</title>
+ <title>多対一</title>
<para>
- <emphasis>�����e�[�u���̒P�������Έ�֘A</emphasis> ��
- �֘A���C�ӂł���Ƃ��ɔ��Ɉ�ʓI�Ȃ�̂ł��B
+ <emphasis>結合テーブルの単方向多対一関連</emphasis> は
+ 関連が任意であるときに非常に一般的なものです。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -221,11 +223,11 @@
</sect2>
<sect2 id="assoc-unidirectional-join-121">
- <title>��Έ�</title>
+ <title>一対一</title>
<para>
- <emphasis>�����e�[�u���̒P������Έ�֘A</emphasis> �́A�{���ɓ���ł���
- �s�\�ł͂���܂���B
+ <emphasis>結合テーブルの単方向一対一関連</emphasis> は、本当に特殊ですが
+ 不可能ではありません。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -257,10 +259,10 @@
</sect2>
<sect2 id="assoc-unidirectional-join-m2m">
- <title>���Α�</title>
+ <title>多対多</title>
<para>
- �Ō�ɁA<emphasis>�P�������Α��֘A</emphasis> �����܂��B
+ 最後に、<emphasis>単方向多対多関連</emphasis> を示します。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -290,14 +292,14 @@
</sect1>
<sect1 id="assoc-bidirectional" revision="1">
- <title>�o�����֘A</title>
+ <title>双方向関連</title>
<sect2 id="assoc-bidirectional-m21" revision="2">
- <title>��Α�/���Έ�</title>
+ <title>一対多/多対一</title>
<para>
- <emphasis>�o�������Έ�֘A</emphasis> �͍ł��ʓI�Ȋ֘A�ł��B
- �i�W���I�Ȑe�q�W�ł��j
+ <emphasis>双方向多対一関連</emphasis> は最も一般的な関連です。
+ (標準的な親子関係です)
</para>
<programlisting><![CDATA[<class name="Person">
@@ -325,12 +327,12 @@
]]></programlisting>
<para>
- <literal>List</literal>
�i�܂��͑��̃C���f�b�N�X�t���̃R���N�V�����j��g���Ȃ�A
- �O���L�[�� <literal>key</literal> �J������ <literal>not
null</literal> �ɐݒ肵�A
- �R���N�V���������e�v�f�̃C���f�b�N�X�����e�i���X����悤�ɁA
- �֘A�����K�v������܂�
- �i<literal>update="false"</literal> ����
<literal>insert="false"</literal>
- �Ɛݒ肵�āA���Α����z�I��inverse�ɂ��܂��j�F
+ <literal>List</literal> (または他のインデックス付きのコレクション)を使うなら、
+ 外部キーの <literal>key</literal> カラムを <literal>not
null</literal> に設定し、
+ コレクション側が各要素のインデックスをメンテナンスするように、
+ 関連を扱う必要があります
+ (<literal>update="false"</literal> かつ
<literal>insert="false"</literal>
+ と設定して、反対側を仮想的にinverseにします):
</para>
<programlisting><![CDATA[<class name="Person">
@@ -354,21 +356,21 @@
</class>]]></programlisting>
<para>
- ����O���L�[�J������ <literal>NOT NULL</literal> �ł���Ȃ�A
- �R���N�V�����}�b�s���O��
<literal><key></literal> �v�f��
- <literal>not-null="true"</literal>
�ɂ��邱�Ƃ͏d�v�ł��B
- ����q�ɂȂ��� <literal><column></literal>
�v�f�����ł͂Ȃ��A
- <literal><key></literal> �v�f��
<literal>not-null="true"</literal>
- �ƒ�`���Ȃ��悤�ɂ��Ă��������B
+ もし外部キーカラムが <literal>NOT NULL</literal> であるならば、
+ コレクションマッピングの <literal><key></literal> 要素を
+ <literal>not-null="true"</literal> にすることは重要です。
+ 入れ子になった <literal><column></literal> 要素だけではなく、
+ <literal><key></literal> 要素も
<literal>not-null="true"</literal>
+ と定義しないようにしてください。
</para>
</sect2>
<sect2 id="assoc-bidirectional-121">
- <title>��Έ�</title>
+ <title>一対一</title>
<para>
- <emphasis>�O���L�[�̑o������Έ�֘A</emphasis> �͔��Ɉ�ʓI�ł��B
+ <emphasis>外部キーの双方向一対一関連</emphasis> は非常に一般的です。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -394,7 +396,7 @@
]]></programlisting>
<para>
- <emphasis>��L�[�̑o������Έ�֘A</emphasis>
�͓����ID�W�F�l���[�^��g���܂��B
+ <emphasis>主キーの双方向一対一関連</emphasis> は特殊なIDジェネレータを使います。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -423,15 +425,15 @@
</sect1>
<sect1 id="assoc-bidirectional-join" revision="1">
- <title>�����e�[�u����g�����o�����֘A</title>
+ <title>結合テーブルを使った双方向関連</title>
<sect2 id="assoc-bidirectional-join-12m">
- <title>��Α�/���Έ�</title>
+ <title>一対多/多対一</title>
<para>
- <emphasis>�����e�[�u���̑o������Α��֘A</emphasis> �ł��B
- <literal>inverse="true"</literal>
���֘A�[�A�R���N�V�����A�����̂����ꂩ��
- �ݒ�ł��邱�Ƃɒ��ӂ��Ă��������B
+ <emphasis>結合テーブルの双方向一対多関連</emphasis> です。
+ <literal>inverse="true"</literal> が関連端、コレクション、結合のいずれかに
+ 設定できることに注意してください。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -469,11 +471,11 @@
</sect2>
<sect2 id="assoc-bidirectional-join-121">
- <title>��Έ�</title>
+ <title>一対一</title>
<para>
- <emphasis>�����e�[�u���̑o������Έ�֘A</emphasis>
- �͔��ɓ���ł����A�\�ł��B
+ <emphasis>結合テーブルの双方向一対一関連</emphasis>
+ は非常に特殊ですが、可能です。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -515,10 +517,10 @@
</sect2>
<sect2 id="assoc-bidirectional-join-m2m" revision="1">
- <title>���Α�</title>
+ <title>多対多</title>
<para>
- �Ō�ɁA<emphasis>�o�������Α��֘A</emphasis> �����܂��B
+ 最後に、<emphasis>双方向多対多関連</emphasis> を示します。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -554,15 +556,15 @@
</sect1>
<sect1 id="assoc-complex">
- <title>��蕡�G�Ȋ֘A�}�b�s���O</title>
+ <title>より複雑な関連マッピング</title>
<para>
- ��蕡�G�Ȋ֘A������ <emphasis>�ɂ߂�</emphasis> �H�ł��B
- �}�b�s���O�h�L�������g��SQL���ߍ��ނ��ƂŁA
- ����ɕ��G�ȏ������Ƃ��ł��܂��B
- �Ⴆ�A<literal>accountNumber</literal>,
<literal>effectiveEndDate</literal>,
- <literal>effectiveStartDate</literal>
�J��������account�i�����j���̗�������e�[�u���́A
- �ȉ��̂悤�Ƀ}�b�s���O���܂��B
+ より複雑な関連結合は <emphasis>極めて</emphasis> 稀です。
+ マッピングドキュメントにSQL文を埋め込むことで、
+ さらに複雑な状況を扱うことができます。
+ 例えば、<literal>accountNumber</literal>,
<literal>effectiveEndDate</literal>,
+ <literal>effectiveStartDate</literal>
カラムを持つaccount(口座)情報の履歴を扱うテーブルは、
+ 以下のようにマッピングします。
</para>
<programlisting><![CDATA[<properties
name="currentAccountKey">
@@ -575,9 +577,9 @@
<property name="effectiveStateDate" type="date"
not-null="true"/>]]></programlisting>
<para>
- �����āA�֘A�� <emphasis>�����_��</emphasis> �C���X�^���X
- �i<literal>effectiveEndDate</literal>
��null�ł����́j�Ƀ}�b�s���O���܂��B
- �ȉ��̂悤�ɂȂ�܂��F
+ そして、関連を <emphasis>現時点の</emphasis> インスタンス
+ (<literal>effectiveEndDate</literal> がnullであるもの)にマッピングします。
+ 以下のようになります:
</para>
<programlisting><![CDATA[<many-to-one
name="currentAccountInfo"
@@ -588,11 +590,11 @@
</many-to-one>]]></programlisting>
<para>
- ����ɕ��G�ȗ�ł́A<literal>Employee�i�]�ƈ��j</literal> ��
<literal>Organization�i�g�D�j</literal>
- �Ԃ̊֘A�� <literal>Employment�i�ٗp�j</literal>
�e�[�u���ŕێ������ꍇ��z�����Ă��������B
- ���̃e�[�u���ɂ͌ٗp�f�[�^�̗������ׂĊ܂܂�܂��B
- ����Ə]�ƈ��� <emphasis>�ł�ŋ߂�</emphasis> �ٗp�҂�\���֘A
- �i�ł�ŋ߂� <literal>startDate</literal>
����́j�́A���̂悤�Ƀ}�b�s���O�ł��܂��F
+ さらに複雑な例では、<literal>Employee(従業員)</literal> と
<literal>Organization(組織)</literal>
+ 間の関連が <literal>Employment(雇用)</literal> テーブルで保持される場合を想像してください。
+ このテーブルには雇用データの履歴がすべて含まれます。
+ すると従業員の <emphasis>最も最近の</emphasis> 雇用者を表す関連
+ (最も最近の <literal>startDate</literal> を持つもの)は、このようにマッピングできます:
</para>
<programlisting><![CDATA[<join>
@@ -609,8 +611,8 @@
</join>]]></programlisting>
<para>
- ���̋@�\�͔��ɋ��͂ł��B
- ���������̂悤�ȏꍇ�A���ʂ�HQL��criteria�N�G����g�����������H�I�ł��B
+ この機能は非常に強力です。
+ しかしこのような場合、普通はHQLやcriteriaクエリを使う方がより実践的です。
</para>
</sect1>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/basic_mapping.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/basic_mapping.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/basic_mapping.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,25 +1,26 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<chapter id="mapping">
- <title>��{�I��O/R�}�b�s���O</title>
+ <title>基本的なO/Rマッピング</title>
<sect1 id="mapping-declaration" revision="1">
- <title>�}�b�s���O��`</title>
+ <title>マッピング定義</title>
<para>
- �I�u�W�F�N�g/�����[�V���i���}�b�s���O�͒ʏ�XML�h�L�������g�Œ�`���܂��B
- �}�b�s���O�h�L�������g�́A�ǂ݂₷�����ƂŕҏW���₷���悤�Ƀf�U�C������Ă��܂��B
-
�}�b�s���O�����Java���S�A�܂�e�[�u����`�ł͂Ȃ��i���N���X�̒�`�Ɋ�Â��č\�z����Ă��܂��B
+ オブジェクト/リレーショナルマッピングは通常XMLドキュメントで定義します。
+ マッピングドキュメントは、読みやすく手作業で編集しやすいようにデザインされています。
+ マッピング言語はJava中心、つまりテーブル定義ではなく永続クラスの定義に基づいて構築されています。
</para>
<para>
- ������Hibernate���[�U��XML�}�b�s���O�̋L�q����Ƃōs���܂����A
- XDoclet, Middlegen, AndroMDA�Ƃ����悤�ȃ}�b�s���O�h�L�������g������c�[����
- ���������݂��܂��B
+ 多くのHibernateユーザはXMLマッピングの記述を手作業で行いますが、
+ XDoclet, Middlegen, AndroMDAというようなマッピングドキュメントを生成するツールが
+ いくつか存在します。
</para>
<para>
- �T���v���̃}�b�s���O����n�߂܂��傤�F
+ サンプルのマッピングから始めましょう:
</para>
<programlisting id="mapping-declaration-ex1"
revision="1"><![CDATA[<?xml version="1.0"?>
@@ -82,16 +83,16 @@
</class>
<class name="Dog">
- <!-- ������Dog�p�̃}�b�s���O�����܂� -->
+ <!-- ここにDog用のマッピング書きます -->
</class>
</hibernate-mapping>]]></programlisting>
<para>
- �}�b�s���O�h�L�������g�̓�e�������܂��B�B
- �������A�����ł�Hibernate�����s���Ɏg���h�L�������g�v�f�Ƒ����ɂ��Ă̂ݐ�����܂��B
- �}�b�s���O�h�L�������g�́A�������̃I�v�V���������Ɨv�f��܂�ł��܂��i�Ⴆ��
<literal>not-null</literal> �����j�B
-
�����̓X�L�[�}�G�N�X�|�[�g�c�[�����o�͂���f�[�^�x�[�X�X�L�[�}�ɉe����^�����̂ł��B
+ マッピングドキュメントの内容を説明します。。
+ ただし、ここではHibernateが実行時に使うドキュメント要素と属性についてのみ説明します。
+ マッピングドキュメントは、いくつかのオプション属性と要素を含んでいます(例えば
<literal>not-null</literal> 属性)。
+ それらはスキーマエクスポートツールが出力するデータベーススキーマに影響を与えるものです。
</para>
@@ -101,51 +102,51 @@
<title>Doctype</title>
<para>
- XML�}�b�s���O�ł́A�����������悤�ȃh�L�������g�^��K����`���ׂ��ł��B
- ���ۂ�DTD�́A��L��URL��
<literal>hibernate-x.x.x/src/org/hibernate</literal> �f�B���N�g���A �܂���
- <literal>hibernate.jar</literal> ��ɂ���܂��B
- Hibernate�͏�ɁA���̃N���X�p�X���DTD��T���n�߂܂��B
- �C���^�[�l�b�g�ɂ���DTD�t�@�C����T�����Ƃ����Ȃ�A
- �N���X�p�X�̓�e���āADTD�錾��m�F���Ă��������B
+ XMLマッピングでは、お見せしたようなドキュメント型を必ず定義すべきです。
+ 実際のDTDは、上記のURLの
<literal>hibernate-x.x.x/src/org/hibernate</literal> ディレクトリ、 または
+ <literal>hibernate.jar</literal> 内にあります。
+ Hibernateは常に、そのクラスパス内でDTDを探し始めます。
+ インターネットにあるDTDファイルを探そうとしたなら、
+ クラスパスの内容を見て、DTD宣言を確認してください。
</para>
<sect3 id="mapping-declaration-entity-resolution">
<title>
- �G���e�B�e�B�E���]���o
+ エンティティ・リゾルバ
</title>
<para>
- �O�q�����悤�ɁAHibernate�͂܂��N���X�p�X���DTD������悤�Ƃ��܂��B
- <literal>org.xml.sax.EntityResolver</literal>
�̃J�X�^��������
- XML�t�@�C����ǂݍ��ނ��߂�SAXReader�ɓo�^���邱�Ƃɂ���āADTD������܂��B
- ���̃J�X�^���� <literal>EntityResolver</literal>
��2�̈قȂ�V�X�e��ID���O��Ԃ�F�����܂��B
+ 前述したように、Hibernateはまずクラスパス内でDTDを解決しようとします。
+ <literal>org.xml.sax.EntityResolver</literal> のカスタム実装を
+ XMLファイルを読み込むためのSAXReaderに登録することによって、DTDを解決します。
+ このカスタムの <literal>EntityResolver</literal>
は2つの異なるシステムID名前空間を認識します。
</para>
<itemizedlist>
<listitem>
<para>
- <literal>Hibernate���O���</literal> �́A���]���o��
-
<
literal>http://hibernate.sourceforge.net/</literal>
�Ŏn�܂�V�X�e��ID�ɓ��B�����Ƃ��ɁA
- �F������܂��B
-
�����ă��]���o�́AHibernate�̃N���X���[�h�����N���X���[�_��p���āA
- �����̃G���e�B�e�B������悤�Ƃ��܂��B
+ <literal>Hibernate名前空間</literal> は、リゾルバが
+
<
literal>http://hibernate.sourceforge.net/</literal> で始まるシステムIDに到達したときに、
+ 認識されます。
+ そしてリゾルバは、Hibernateのクラスをロードしたクラスローダを用いて、
+ これらのエンティティを解決しようとします。
</para>
</listitem>
<listitem>
<para>
- <literal>���[�U���O���</literal> �́A���]���o��
- URL�v���g�R���� <literal>classpath://</literal>
��g�����V�X�e��ID�ɓ��B�����Ƃ��ɁA
-
�F������܂��B�����ă��]���o�́A(1)�J�����g�X���b�h�̃R���e�L�X�g�N���X���[�_�[�A
- �܂���(2)Hibernate�̃N���X���[�h�����N���X���[�_��g���āA
- �����̃G���e�B�e�B������悤�Ƃ��܂��B
+ <literal>ユーザ名前空間</literal> は、リゾルバが
+ URLプロトコルの <literal>classpath://</literal>
を使ったシステムIDに到達したときに、
+ 認識されます。そしてリゾルバは、(1)カレントスレッドのコンテキストクラスローダー、
+ または(2)Hibernateのクラスをロードしたクラスローダを使って、
+ これらのエンティティを解決しようとします。
</para>
</listitem>
</itemizedlist>
<para>
- ���L�́A���[�U���O��Ԃ�g������ł��F
+ 下記は、ユーザ名前空間を使った例です:
</para>
<programlisting><![CDATA[<?xml version="1.0"?>
@@ -164,8 +165,8 @@
&types;
</hibernate-mapping>]]></programlisting>
<para>
- ������ <literal>types.xml</literal> ��
<literal>your.domain</literal> �p�b�P�[�W��̃��\�[�X�ł���A
- �J�X�^�� <xref
linkend="mapping-types-custom">typedef</xref> ��܂ނ܂��B
+ ここで <literal>types.xml</literal> は
<literal>your.domain</literal> パッケージ内のリソースであり、
+ カスタム <xref
linkend="mapping-types-custom">typedef</xref> を含むます。
</para>
</sect3>
@@ -176,14 +177,14 @@
<title>hibernate-mapping</title>
<para>
-
���̗v�f�ɂ͂������I�v�V��������������܂��B<literal>schema</literal> ������
<literal>catalog</literal> �����́A
-
���̃}�b�s���O���Q�Ƃ���e�[�u�����A���̑����ɂ���Ďw�肳�ꂽ�X�L�[�}��(�܂���)�J�^���O�ɑ����邱�Ƃ�w�肵�܂��B
-
���̑������w�肳���ƁA�e�[�u�����͗^����ꂽ�X�L�[�}���ƃJ�^���O���ŏC������܂��B�����̑������w�肳��Ă��Ȃ���A
- �e�[�u�����͏C������܂���B<literal>default-cascade</literal>
�����́A
- <literal>cascade</literal>
������w�肵�Ă��Ȃ��v���p�e�B��R���N�V�����ɁA
- �ǂ̃J�X�P�[�h�X�^�C�����蓖�Ă邩��w�肵�܂��B
- <literal>auto-import</literal> �����́A
- �N�G�������ŏC������Ă��Ȃ��N���X����A�f�t�H���g�Ŏg����悤�ɂ��܂��B
+ この要素にはいくつかオプション属性があります。<literal>schema</literal> 属性と
<literal>catalog</literal> 属性は、
+ このマッピングが参照するテーブルが、この属性によって指定されたスキーマと(または)カタログに属することを指定します。
+ この属性が指定されると、テーブル名は与えられたスキーマ名とカタログ名で修飾されます。これらの属性が指定されていなければ、
+ テーブル名は修飾されません。<literal>default-cascade</literal> 属性は、
+ <literal>cascade</literal> 属性を指定していないプロパティやコレクションに、
+ どのカスケードスタイルを割り当てるかを指定します。
+ <literal>auto-import</literal> 属性は、
+ クエリ言語内で修飾されていないクラス名を、デフォルトで使えるようにします。
</para>
<programlistingco>
@@ -208,62 +209,62 @@
<calloutlist>
<callout arearefs="hm1">
<para>
-
<literal>schema</literal>�i�I�v�V�����j�F�f�[�^�x�[�X�X�L�[�}�̖��O�B
+ <literal>schema</literal>(オプション):データベーススキーマの名前。
</para>
</callout>
<callout arearefs="hm2">
<para>
- <literal>catalog</literal>
�i�I�v�V�����j�F�f�[�^�x�[�X�J�^���O�̖��O�B
+ <literal>catalog</literal>
(オプション):データベースカタログの名前。
</para>
</callout>
<callout arearefs="hm3">
<para>
- <literal>default-cascade</literal> �i�I�v�V���� -
�f�t�H���g�� <literal>none</literal>�j�F
- �f�t�H���g�̃J�X�P�[�h�X�^�C���B
+ <literal>default-cascade</literal> (オプション -
デフォルトは <literal>none</literal>):
+ デフォルトのカスケードスタイル。
</para>
</callout>
<callout arearefs="hm4">
<para>
- <literal>default-access</literal> (�I�v�V���� -
�f�t�H���g�� <literal>property</literal> �j�F
- Hibernate���v���p�e�B�ɃA�N�Z�X����ۂɍ̂�ׂ��헪�B
<literal>PropertyAccessor</literal>
- ��������邱�ƂŃJ�X�^�}�C�Y�\�B
+ <literal>default-access</literal> (オプション -
デフォルトは <literal>property</literal> ):
+ Hibernateがプロパティにアクセスする際に採るべき戦略。
<literal>PropertyAccessor</literal>
+ を実装することでカスタマイズ可能。
</para>
</callout>
<callout arearefs="hm5">
<para>
- <literal>default-lazy</literal> (�I�v�V���� -
�f�t�H���g�� <literal>true</literal> )�F
- <literal>lazy</literal>
�������w�肳��Ă��Ȃ��N���X��R���N�V�����}�b�s���O�ɑ���f�t�H���g�l�B
+ <literal>default-lazy</literal> (オプション - デフォルトは
<literal>true</literal> ):
+ <literal>lazy</literal>
属性が指定されていないクラスやコレクションマッピングに対するデフォルト値。
</para>
</callout>
<callout arearefs="hm6">
<para>
- <literal>auto-import</literal> �i�I�v�V���� -
�f�t�H���g�� <literal>true</literal>�j�F
-
�N�G�������ŁA�i���̃}�b�s���O��̃N���X�́j�C������Ă��Ȃ��N���X����g���邩�ǂ�����w�肵�܂��B
+ <literal>auto-import</literal> (オプション - デフォルトは
<literal>true</literal>):
+ クエリ言語内で、(このマッピング内のクラスの)修飾されていないクラス名を使えるかどうかを指定します。
</para>
</callout>
<callout arearefs="hm7">
<para>
- <literal>package</literal> (�I�v�V����):
�}�b�s���O�h�L�������g��ŏC������Ă��Ȃ��N���X���ɑ��Ċ��蓖�Ă�A
- �p�b�P�[�W�̐ړ���(prefix)��w�肵�܂��B
+ <literal>package</literal> (オプション):
マッピングドキュメント内で修飾されていないクラス名に対して割り当てる、
+ パッケージの接頭辞(prefix)を指定します。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- �i�C������Ă��Ȃ��j�������O�̉i���N���X��2����Ȃ�A
- <literal>auto-import="false"</literal>
��ݒ肷�ׂ��ł��B
- 2�̃N���X�Ɂh�C���|�[�g���ꂽ�h�������O���蓖�Ă悤�Ƃ���ƁAHibernate�͗�O�𓊂��܂��B
+ (修飾されていない)同じ名前の永続クラスが2つあるなら、
+ <literal>auto-import="false"</literal> を設定すべきです。
+ 2つのクラスに”インポートされた”同じ名前を割り当てようとすると、Hibernateは例外を投げます。
</para>
<para>
- <literal>hibernate-mapping</literal>
�v�f�́A�ŏ��̗�Ŏ������悤�ɂ������̉i�� <literal><class></literal>
- �}�b�s���O��l�X�g�ł��܂��B
-
�������A�P�̃}�b�s���O�t�@�C���ł͂����ЂƂ̉i���N���X(�܂��͂ЂƂ̃N���X�K�w)�Ƀ}�b�s���O����悤�ɂ��A
-
����ɉi���X�[�p�[�N���X�̌�Ŏw�肷��ׂ��ł��傤(�������̃c�[���͂��̂悤�ȃ}�b�s���O�t�@�C����z�肵�Ă��܂�)�B
- �Ⴆ�Ύ��̂悤�ɂȂ�܂��B�F <literal>Cat.hbm.xml</literal> ,
- <literal>Dog.hbm.xml</literal> , �܂��͌p����g���Ȃ�
<literal>Animal.hbm.xml</literal> �B
+ <literal>hibernate-mapping</literal> 要素は、最初の例で示したようにいくつかの永続
<literal><class></literal>
+ マッピングをネストできます。
+ しかし、1つのマッピングファイルではただひとつの永続クラス(またはひとつのクラス階層)にマッピングするようにし、
+ さらに永続スーパークラスの後で指定するべきでしょう(いくつかのツールはこのようなマッピングファイルを想定しています)。
+ 例えば次のようになります。: <literal>Cat.hbm.xml</literal> ,
+ <literal>Dog.hbm.xml</literal> , または継承を使うなら
<literal>Animal.hbm.xml</literal> 。
</para>
</sect2>
@@ -272,7 +273,7 @@
<title>class</title>
<para>
- <literal>class</literal> �v�f��g���āA�i���N���X��錾�ł��܂��B
+ <literal>class</literal> 要素を使って、永続クラスを宣言できます。
</para>
<programlistingco>
@@ -328,140 +329,140 @@
<calloutlist>
<callout arearefs="class1">
<para>
- <literal>name</literal>
(�I�v�V����)�F�i���N���X�i�܂��̓C���^�[�t�F�C�X�j�̊��S�C��Java�N���X���B
-
������̑�����w�肵�Ȃ���APOJO�ł͂Ȃ��G���e�B�e�B�ɑ���}�b�s���O�Ƃ��Ĉ����܂��B
+ <literal>name</literal>
(オプション):永続クラス(またはインターフェイス)の完全修飾Javaクラス名。
+ もしこの属性を指定しなければ、POJOではないエンティティに対するマッピングとして扱われます。
</para>
</callout>
<callout arearefs="class2">
<para>
- <literal>table</literal> (�I�v�V���� -
�f�t�H���g�͏C������Ă��Ȃ��N���X��)�F�f�[�^�x�[�X�e�[�u���̖��O
+ <literal>table</literal> (オプション -
デフォルトは修飾されていないクラス名):データベーステーブルの名前
</para>
</callout>
<callout arearefs="class3">
<para>
- <literal>discriminator-value</literal>
(�I�v�V���� - �f�t�H���g�̓N���X��)�F
- �|�����[�t�B�b�N�ȐU�镑���Ɏg����X�̃T�u�N���X���ʂ��邽�߂̒l�B
- �l�� <literal>null</literal> ��
<literal>not null</literal> �̂����ꂩ����܂��B
+ <literal>discriminator-value</literal> (オプション -
デフォルトはクラス名):
+ ポリモーフィックな振る舞いに使われる個々のサブクラスを識別するための値。
+ 値は <literal>null</literal> か <literal>not
null</literal> のいずれかを取ります。
</para>
</callout>
<callout arearefs="class4">
<para>
- <literal>mutable</literal> (�I�v�V�����A
�f�t�H���g�� <literal>true</literal> )�F
- ���̃N���X�̃C���X�^���X���X�V�\�i�܂��͕s�\�j�ł��邱�Ƃ�w�肵�܂��B
+ <literal>mutable</literal> (オプション、 デフォルトは
<literal>true</literal> ):
+ そのクラスのインスタンスが更新可能(または不可能)であることを指定します。
</para>
</callout>
<callout arearefs="class5">
<para>
- <literal>schema</literal> �i�I�v�V�����j�F
- ���[�g��
<literal><hibernate-mapping></literal>
�v�f�Ŏw�肳�ꂽ�X�L�[�}����I�[�o�[���C�h���܂��B
+ <literal>schema</literal> (オプション):
+ ルートの
<literal><hibernate-mapping></literal>
要素で指定されたスキーマ名をオーバーライドします。
</para>
</callout>
<callout arearefs="class6">
<para>
- <literal>catalog</literal>
�i�I�v�V�����j�F���[�g�� <literal><hibernate-mapping></literal>
- �v�f�Ŏw�肳�ꂽ�J�^���O����I�[�o�[���C�h���܂��B
+ <literal>catalog</literal> (オプション):ルートの
<literal><hibernate-mapping></literal>
+ 要素で指定されたカタログ名をオーバーライドします。
</para>
</callout>
<callout arearefs="class7">
<para>
- <literal>proxy</literal>
�i�I�v�V�����j�F�x���������v���L�V�Ɏg���C���^�[�t�F�C�X��w�肵�܂��B
- �i��������N���X�����̂�̂�w�肷�邱�Ƃ�\�ł��B
+ <literal>proxy</literal>
(オプション):遅延初期化プロキシに使うインターフェイスを指定します。
+ 永続化するクラス名そのものを指定することも可能です。
</para>
</callout>
<callout arearefs="class8">
<para>
- <literal>dynamic-update</literal> �i�I�v�V�����A
�f�t�H���g�� <literal>false</literal> �j�F
- �l���ύX���ꂽ�J����������܂�SQL��
<literal>UPDATE</literal> ����A���s���ɐ������邱�Ƃ�w�肵�܂��B
+ <literal>dynamic-update</literal> (オプション、 デフォルトは
<literal>false</literal> ):
+ 値が変更されたカラムだけを含むSQLの <literal>UPDATE</literal>
文を、実行時に生成することを指定します。
</para>
</callout>
<callout arearefs="class9">
<para>
- <literal>dynamic-insert</literal> �i�I�v�V����,
�f�t�H���g�� <literal>false</literal> �j�F
- �l��null�ł͂Ȃ��J����������܂�SQL��
<literal>INSERT</literal> ����A���s���ɐ������邱�Ƃ�w�肵�܂��B
+ <literal>dynamic-insert</literal> (オプション, デフォルトは
<literal>false</literal> ):
+ 値がnullではないカラムだけを含むSQLの <literal>INSERT</literal>
文を、実行時に生成することを指定します。
</para>
</callout>
<callout arearefs="class10">
<para>
- <literal>select-before-update</literal>
(�I�v�V����, �f�t�H���g�� <literal>false</literal>):
- �I�u�W�F�N�g���ύX���ꂽ�̂��m���łȂ��Ȃ�AHibernate��SQL��
<literal>UPDATE</literal> ��
- <emphasis>�����Ď��s���Ȃ�</emphasis>
���Ƃ�w�肵�܂��B
- �������̏ꍇ(���ۓI�ɂ́A�ꎞ�I�u�W�F�N�g��
<literal>update()</literal> ��g���A
-
�V�����Z�b�V�����Ɗ֘A�t����ꂽ������)�A<literal>UPDATE</literal>
�����ۂɕK�v���ǂ������肷�邽�߂ɁA
- Hibernate���]����SQL�� <literal>SELECT</literal>
������s���邱�Ƃ�Ӗ����܂��B
+ <literal>select-before-update</literal> (オプション,
デフォルトは <literal>false</literal>):
+ オブジェクトが変更されたのが確実でないならば、HibernateがSQLの
<literal>UPDATE</literal> を
+ <emphasis>決して実行しない</emphasis> ことを指定します。
+ ある特定の場合(実際的には、一時オブジェクトが
<literal>update()</literal> を使い、
+ 新しいセッションと関連付けられた時だけ)、<literal>UPDATE</literal>
が実際に必要かどうかを決定するために、
+ Hibernateが余分なSQLの <literal>SELECT</literal>
文を実行することを意味します。
</para>
</callout>
<callout arearefs="class11">
<para>
- (optional, �f�t�H���g�ł�
<literal>implicit</literal> ): implicit�i�Öفj��explicit�i�����j�́A
- �ǂ���̃N�G���|�����[�t�B�Y����g�������肵�܂��B
+ (optional, デフォルトでは <literal>implicit</literal> ):
implicit(暗黙)かexplicit(明示)の、
+ どちらのクエリポリモーフィズムを使うか決定します。
</para>
</callout>
<callout arearefs="class12">
<para>
- <literal>where</literal> �i�I�v�V�����j�F
- ���̃N���X�̃I�u�W�F�N�g��������Ƃ��Ɏg�p����A�C�ӂ�SQL��
<literal>WHERE</literal> ����w�肵�܂��B
+ <literal>where</literal> (オプション):
+ このクラスのオブジェクトを検索するときに使用する、任意のSQLの
<literal>WHERE</literal> 条件を指定します。
</para>
</callout>
<callout arearefs="class13">
<para>
- <literal>persister</literal>
�i�I�v�V�����j�F�J�X�^�� <literal>ClassPersister</literal> ��w�肵�܂��B
+ <literal>persister</literal> (オプション):カスタム
<literal>ClassPersister</literal> を指定します。
</para>
</callout>
<callout arearefs="class14">
<para>
- <literal>batch-size</literal> �i�I�v�V����,
�f�t�H���g�� <literal>1</literal> �j�F
-
���ʎq�ł��̃N���X�̃C���X�^���X������Ƃ��́u�o�b�`�T�C�Y�v��w�肵�܂��B
+ <literal>batch-size</literal> (オプション, デフォルトは
<literal>1</literal> ):
+ 識別子でこのクラスのインスタンスを復元するときの「バッチサイズ」を指定します。
</para>
</callout>
<callout arearefs="class15">
<para>
- <literal>optimistic-lock</literal>
�i�I�v�V����,�f�t�H���g�� <literal>version</literal> �j�F
- �y�σ��b�N�헪���肵�܂��B
+ <literal>optimistic-lock</literal> (オプション,デフォルトは
<literal>version</literal> ):
+ 楽観ロック戦略を決定します。
</para>
</callout>
<callout arearefs="class16">
<para>
- <literal>lazy</literal> �i�I�v�V�����j�F
<literal>lazy="false"</literal> �Ɛݒ肷�邱�ƂŁA
- �x���t�F�b�`���ł��Ȃ��Ȃ�܂��B
+ <literal>lazy</literal> (オプション):
<literal>lazy="false"</literal> と設定することで、
+ 遅延フェッチができなくなります。
</para>
</callout>
<callout arearefs="class17">
<para>
- <literal>entity-name</literal>
�i�I�v�V�����A�f�t�H���g�̓N���X���j�F
-
Hibernate3�ł̓N���X��������}�b�s���O�ł��i�ꍇ�ɂ���Ă͈Ⴄ�e�[�u���ɑ��Ă�j�A
-
Java���x����Map��XML�ŕ\�������G���e�B�e�B�}�b�s���O���\�ł��B
-
�����̏ꍇ�A�G���e�B�e�B�ɑ��ĔC�ӂ̖��O��A�����I�ɕt���Ȃ��Ă͂Ȃ�܂���B
- �ڂ����� <xref
linkend="persistent-classes-dynamicmodels"/> �� <xref
linkend="xml"/> ��Q�Ƃ��Ă��������B
+ <literal>entity-name</literal>
(オプション、デフォルトはクラス名):
+ Hibernate3ではクラスが複数回マッピングでき(場合によっては違うテーブルに対しても)、
+ JavaレベルでMapやXMLで表現されるエンティティマッピングが可能です。
+ これらの場合、エンティティに対して任意の名前を、明示的に付けなくてはなりません。
+ 詳しくは <xref
linkend="persistent-classes-dynamicmodels"/> と <xref
linkend="xml"/> を参照してください。
</para>
</callout>
<callout arearefs="class18">
<para>
- <literal>check</literal>
�i�I�v�V�����j�F�����I�ɃX�L�[�}�����邽�߂ɁA
- �����s�� <emphasis>check</emphasis>
���������SQL���B
+ <literal>check</literal>
(オプション):自動的にスキーマを生成するために、
+ 複数行の <emphasis>check</emphasis> 制約を生成するSQL式。
</para>
</callout>
<callout arearefs="class19">
<para>
- <literal>rowid</literal>
�i�I�v�V�����j�FHibernate�́A�����T�|�[�g���Ă���f�[�^�x�[�X��ROWID��
- �Ă���̂�g�����Ƃ��ł��܂��B
- �Ⴆ��Oracle��g���Ă���Ƃ��A���̃I�v�V������
<literal>rowid</literal> ��ݒ肷��A
- Hiberante��update���������邽�߂�
<literal>rowid</literal> �Ƃ������ʂȃJ������g�����Ƃ��ł��܂��B
- ROWID�͏ڍׂȎ����ł���A�ۑ����ꂽ�^�v���̕����I�Ȉʒu��\���Ă��܂��B
+ <literal>rowid</literal>
(オプション):Hibernateは、それをサポートしているデータベースでROWIDと
+ 呼ばれるものを使うことができます。
+ 例えばOracleを使っているとき、このオプションに
<literal>rowid</literal> を設定すれば、
+ Hiberanteはupdateを高速化するために
<literal>rowid</literal> という特別なカラムを使うことができます。
+ ROWIDは詳細な実装であり、保存されたタプルの物理的な位置を表しています。
</para>
</callout>
<callout arearefs="class20">
<para>
- <literal>subselect</literal>
�i�I�v�V�����j�F�s�ς��ǂݎ���p�ł���G���e�B�e�B��
- �f�[�^�x�[�X�̕��⍇���isubselect�j�Ƀ}�b�s���O���܂��B
- ������̃e�[�u���̑���Ƀr���[����������ΗL�p�ł����A
- �����łȂ��̂Ȃ�L�p�ł͂���܂���B���ڂ������͉��L��Q�Ƃ��Ă��������B
+ <literal>subselect</literal>
(オプション):不変かつ読み取り専用であるエンティティを
+ データベースの副問合せ(subselect)にマッピングします。
+ もし元のテーブルの代わりにビューを持ちたければ有用ですが、
+ そうでないのなら有用ではありません。より詳しい情報は下記を参照してください。
</para>
</callout>
<callout arearefs="class21">
<para>
- <literal>abstract</literal> �i�I�v�V�����j�F
- <literal><union-subclass></literal>
�K�w��̒��ۃX�[�p�[�N���X�Ƀ}�[�N���邽�߂Ɏg���܂��B
+ <literal>abstract</literal> (オプション):
+ <literal><union-subclass></literal>
階層内の抽象スーパークラスにマークするために使います。
</para>
</callout>
@@ -469,102 +470,102 @@
</programlistingco>
<para>
- �i���N���X�̖��O�ɃC���^�[�t�F�C�X��w�肵�Ă�܂�������肠��܂���B
- ���̂Ƃ��� <literal><subclass></literal>
�v�f��g���āA
- ���̃C���^�[�t�F�C�X���������N���X���`���Ă��������B
- <emphasis>static</emphasis> �ȓ���N���X�ł�i�����ł��܂��B
- ���̂Ƃ��͕W���`���A�Ⴆ�� <literal>eg.Foo$Bar</literal>
��g���ăN���X����w�肵�Ă��������B
+ 永続クラスの名前にインターフェイスを指定してもまったく問題ありません。
+ そのときは <literal><subclass></literal> 要素を使って、
+ そのインターフェイスを実装するクラスを定義してください。
+ <emphasis>static</emphasis> な内部クラスでも永続化できます。
+ そのときは標準形式、例えば <literal>eg.Foo$Bar</literal>
を使ってクラス名を指定してください。
</para>
<para>
- <literal>mutable="false"</literal>
�w������s�σN���X�́A
- �A�v���P�[�V�����ɂ��X�V��폜���o���Ȃ����Ƃ�����܂��B
- ����ɂ��AHibernate���p�t�H�[�}���X�������P���܂��B
+ <literal>mutable="false"</literal> 指定をした不変クラスは、
+ アプリケーションによる更新や削除が出来ないことがあります。
+ これにより、Hibernateがパフォーマンスを少し改善します。
</para>
<para>
- �I�v�V������ <literal>proxy</literal>
�����ɂ��A�N���X�̉i���C���X�^���X�̒x�����������\�ɂȂ�܂��B
- Hibernate�͍ŏ��ɁA�w�肵���C���^�[�t�F�C�X���������CGLIB�v���L�V��Ԃ��܂��B
- ���ۂ̉i���I�u�W�F�N�g�̓v���L�V�̃��\�b�h��Ăяo���Ƃ��Ƀ��[�h���܂��B
- �ȉ��́u�x���������̂��߂̃v���L�V�v��Q�Ƃ��Ă��������B
+ オプションの <literal>proxy</literal>
属性により、クラスの永続インスタンスの遅延初期化が可能になります。
+ Hibernateは最初に、指定したインターフェイスを実装したCGLIBプロキシを返します。
+ 実際の永続オブジェクトはプロキシのメソッドを呼び出すときにロードします。
+ 以下の「遅延初期化のためのプロキシ」を参照してください。
</para>
<para>
- <emphasis>�ÖٓI</emphasis>
�|�����[�t�B�Y���Ƃ́A���̓��Ӗ����Ă��܂��B
-
��̓N���X�̃C���X�^���X���A�X�[�p�[�N���X����������C���^�[�t�F�C�X�A�܂����̃N���X��w�肷��N�G���ɂ���ĕԂ���邱�ƂŁA
-
�����͂��̃N���X�̃T�u�N���X�̃C���X�^���X���A���̃N���X���g��w�肵���N�G���ɂ���ĕԂ���邱�Ƃł��B
- �܂��A<emphasis>�����I</emphasis>
�|�����[�t�B�Y���Ƃ́A���̓��Ӗ����Ă��܂��B
- ��̓N���X�̃C���X�^���X���A���̃N���X���I�Ɏw�肵���N�G���ɂ���Ă̂ݕԂ���邱�ƂŁA
-
�����̓N���X��w�肵���N�G�����A<literal><class></literal>
�v�f�̒��� <literal><subclass></literal> ��
- <literal><joined-subclass></literal>
�ƃ}�b�s���O����Ă���T�u�N���X�̃C���X�^���X������Ԃ����Ƃł��B
- �قƂ�ǂ̗p�r�ł̓f�t�H���g��
<literal>polymorphism="implicit"</literal> ���K�ł��B
-
�����I�ȃ|�����[�t�B�Y���́A2�̈�����N���X�������e�[�u���Ƀ}�b�s���O����Ă���Ƃ��ɗL�p�ł�
- �i����ɂ���ăe�[�u���J�����̃T�u�Z�b�g��܂ށA�u�y�ʂȁv�N���X���\�ɂȂ�܂��j�B
+ <emphasis>暗黙的</emphasis> ポリモーフィズムとは、次の二つを意味しています。
+ 一つはクラスのインスタンスが、スーパークラスや実装したインターフェイス、またそのクラスを指定するクエリによって返されることで、
+ もう一つはそのクラスのサブクラスのインスタンスが、そのクラス自身を指定したクエリによって返されることです。
+ また、<emphasis>明示的</emphasis> ポリモーフィズムとは、次の二つを意味しています。
+ 一つはクラスのインスタンスが、そのクラスを明示的に指定したクエリによってのみ返されることで、
+ もう一つはクラスを指定したクエリが、<literal><class></literal>
要素の中で <literal><subclass></literal> や
+ <literal><joined-subclass></literal>
とマッピングされているサブクラスのインスタンスだけを返すことです。
+ ほとんどの用途ではデフォルトの
<literal>polymorphism="implicit"</literal> が適切です。
+ 明示的なポリモーフィズムは、2つの違ったクラスが同じテーブルにマッピングされているときに有用です
+ (これによってテーブルカラムのサブセットを含む、「軽量な」クラスが可能になります)。
</para>
<para>
- <literal>persister</literal>
������w�肷�邱�ƂŁA�N���X�̉i�����헪��J�X�^�}�C�Y�ł��܂��B
- �Ⴆ��
<literal>org.hibernate.persister.EntityPersister</literal>
���g�̃T�u�N���X��w�肵����A
- �܂��Ⴆ�X�g�A�h�v���V�[�W���R�[���A�t���b�g�t�@�C���փV���A���C�Y�A
- LDAP�Ȃǂ�ʂ����i�������������
<literal>org.hibernate.persister.ClassPersister</literal>
- �C���^�[�t�F�C�X�̊��S�ɐV����������ł��܂��B�ȒP�ȗ�Ƃ���
<literal>org.hibernate.test.CustomPersister</literal>
- �����������i����� <literal>Hashtable</literal>
�́u�i�����v�ł��j�B
+ <literal>persister</literal>
属性を指定することで、クラスの永続化戦略をカスタマイズできます。
+ 例えば
<literal>org.hibernate.persister.EntityPersister</literal> 自身のサブクラスを指定したり、
+ また例えばストアドプロシージャコール、フラットファイルへシリアライズ、
+ LDAPなどを通した永続性を実装する
<literal>org.hibernate.persister.ClassPersister</literal>
+ インターフェイスの完全に新しい実装を提供できます。簡単な例として
<literal>org.hibernate.test.CustomPersister</literal>
+ を見てください(これは <literal>Hashtable</literal> の「永続化」です)。
</para>
<para>
- <literal>dynamic-update</literal> ��
<literal>dynamic-insert</literal> �̐ݒ�̓T�u�N���X�Ɍp������܂���B
- ���̂��� <literal><subclass></literal> ��
<literal><joined-subclass></literal> �v�f��w�肷�邱�Ƃ�o���܂��B
-
�����̐ݒ�̓p�t�H�[�}���X����コ���鎖�����܂����A���Ƃ����Ƃ����܂��̂ŁA�T�d�Ɏg�p���Ă��������B
+ <literal>dynamic-update</literal> と
<literal>dynamic-insert</literal> の設定はサブクラスに継承されません。
+ そのため <literal><subclass></literal> や
<literal><joined-subclass></literal> 要素を指定することも出来ます。
+ これらの設定はパフォーマンスを向上させる事もありますが、落とすこともありますので、慎重に使用してください。
</para>
<para>
- <literal>select-before-update</literal>
�̎g�p�͒ʏ�p�t�H�[�}���X�𗎂Ƃ��܂��B
- ��� <literal>Session</literal>
�֕����C���X�^���X�̃O���t��Ēlj�����Ȃ�A
- �f�[�^�x�[�X�X�V�̃g���K��s�K�v�ɌĂяo���̂����Ƃ����_�ŁA���ɗL�p�ł��B
+ <literal>select-before-update</literal> の使用は通常パフォーマンスを落とします。
+ もし <literal>Session</literal> へ分離インスタンスのグラフを再追加するなら、
+ データベース更新のトリガを不必要に呼び出すのを避けるという点で、非常に有用です。
</para>
<para>
- <literal>dynamic-update</literal>
��L���ɂ���A�y�σ��b�N�헪��I�Ԃ��ƂɂȂ�܂��B
+ <literal>dynamic-update</literal> を有効にすれば、楽観ロック戦略を選ぶことになります。
</para>
<itemizedlist>
<listitem>
<para>
- <literal>version</literal>
�o�[�W����/�^�C���X�^���v�J������`�F�b�N���܂�
+ <literal>version</literal> バージョン/タイムスタンプカラムをチェックします
</para>
</listitem>
<listitem>
<para>
- <literal>all</literal> ���ׂẴJ������`�F�b�N���܂��B
+ <literal>all</literal> すべてのカラムをチェックします。
</para>
</listitem>
<listitem>
<para>
- <literal>dirty</literal>
�ύX�����J������`�F�b�N���A�����X�V�ł���悤�ɂ��܂��B
+ <literal>dirty</literal>
変更したカラムをチェックし、同時更新できるようにします。
</para>
</listitem>
<listitem>
<para>
- <literal>none</literal> �y�σ��b�N��g�p���܂���
+ <literal>none</literal> 楽観ロックを使用しません
</para>
</listitem>
</itemizedlist>
<para>
-
Hibernate�Ŋy�ϓI���b�N�헪��g���Ȃ�A�o�[�W����/�^�C���X�^���v�J������g�����Ƃ�
- <emphasis> ����</emphasis> ���������߂��܂��B
- �y�ϓI���b�N�̓p�t�H�[�}���X�̊ϓ_�����œK�ł���A����ɕ����C���X�^���X�ւ̏C��
- �i�܂� <literal>Session.marge()</literal> ���g����Ƃ��j
- �𐳊m�Ɉ������Ƃ̂ł���B��̐헪�ł����܂��B
+ Hibernateで楽観的ロック戦略を使うなら、バージョン/タイムスタンプカラムを使うことを
+ <emphasis> 非常に</emphasis> 強くお勧めします。
+ 楽観的ロックはパフォーマンスの観点からも最適であり、さらに分離インスタンスへの修正
+ (つまり <literal>Session.marge()</literal> が使われるとき)
+ を正確に扱うことのできる唯一の戦略でもあります。
</para>
<para>
- Hibernate�̃}�b�s���O�ɂƂ��ăr���[�ƕ��ʂ̃e�[�u���̊ԂɈႢ�͂Ȃ��A
- �f�[�^�x�[�X���x���ł͓��ߓI�ł�
- �i�������r���[���S�ɂ̓T�|�[�g���Ă��Ȃ�DBMS�����܂��B
- ���ɁA�X�V�̂���r���[�ɑ��Ă͂����ł��j�B
- �r���[��g�������Ă�A�f�[�^�x�[�X�ō쐬�ł��Ȃ����Ƃ�����܂�
- �i�Ⴆ�A���K�V�[�X�L�[�}�̏ꍇ�j�B
- ���̏ꍇ�ɂ́A�s�ς��ǂݎ���p�̃G���e�B�e�B�ɗ^����ꂽSQL�̕��⍇������}�b�v�ł��܂��B
+ Hibernateのマッピングにとってビューと普通のテーブルの間に違いはなく、
+ データベースレベルでは透過的です
+ (ただしビューを完全にはサポートしていないDBMSもあります。
+ 特に、更新のあるビューに対してはそうです)。
+ ビューを使いたくても、データベースで作成できないことがあります
+ (例えば、レガシースキーマの場合)。
+ この場合には、不変かつ読み取り専用のエンティティに与えられたSQLの副問合せ文をマップできます。
</para>
<programlisting><![CDATA[<class name="Summary">
@@ -581,10 +582,10 @@
</class>]]></programlisting>
<para>
- �e�[�u�����̃G���e�B�e�B�Ɠ�������悤�ɒ�`���Ă��������B
-
�I�[�g�t���b�V�����m���ɋN����悤�ɁA�܂����o�G���e�B�e�B�ɑ���N�G�����Â��f�[�^��
- �Ԃ��Ȃ��悤�ɂ��邽�߂ł��B
- <literal><subselect></literal>
�͑����ƃl�X�g�����}�b�s���O�����̂ǂ���ł���p�ł��܂��B
+ テーブルをこのエンティティと同期するように定義してください。
+ オートフラッシュが確実に起こるように、また導出エンティティに対するクエリが古いデータを
+ 返さないようにするためです。
+ <literal><subselect></literal>
は属性とネストしたマッピング属性のどちらでも利用できます。
</para>
</sect2>
@@ -593,9 +594,9 @@
<title>id</title>
<para>
- �}�b�v���ꂽ�N���X�̓f�[�^�x�[�X�e�[�u���̎�L�[�J�������`
<emphasis>���Ȃ���Ȃ�܂���</emphasis> �B
-
�قƂ�ǂ̃N���X�ɂ̓C���X�^���X�̃��j�[�N�Ȏ��ʎq��ێ�����JavaBeans�X�^�C���̃v���p�e�B�����܂��B
- <literal><id></literal>
�v�f�́A���̃v���p�e�B�����L�[�J�����ւ̃}�b�s���O���`���܂��B
+ マップされたクラスはデータベーステーブルの主キーカラムを定義
<emphasis>しなければなりません</emphasis> 。
+ ほとんどのクラスにはインスタンスのユニークな識別子を保持するJavaBeansスタイルのプロパティもあります。
+ <literal><id></literal>
要素は、そのプロパティから主キーカラムへのマッピングを定義します。
</para>
<programlistingco>
@@ -619,60 +620,60 @@
<calloutlist>
<callout arearefs="id1">
<para>
-
<literal>name</literal>�i�I�v�V�����j�F���ʎq�v���p�e�B�̖��O�B
+ <literal>name</literal>(オプション):識別子プロパティの名前。
</para>
</callout>
<callout arearefs="id2">
<para>
-
<literal>type</literal>�i�I�v�V�����j�FHibernate�̌^�������O�B
+ <literal>type</literal>(オプション):Hibernateの型を示す名前。
</para>
</callout>
<callout arearefs="id3">
<para>
- <literal>column</literal>�i�I�v�V���� -
�f�t�H���g�̓v���p�e�B���j�F
- ��L�[�J�����̖��O�B
+ <literal>column</literal>(オプション -
デフォルトはプロパティ名):
+ 主キーカラムの名前。
</para>
</callout>
<callout arearefs="id4">
<para>
- <literal>unsaved-value</literal>�i�I�v�V���� -
�f�t�H���g�̒l��sensible�j�F
- �C���X�^���X���V�����C���X�^���X�����ꂽ
- �i�Z�[�u����Ă��Ȃ��j���Ƃ����A���ʎq�v���p�e�B�̒l�B
- �ȑO��Session�ŃZ�[�u�܂��̓��[�h���ꂽ�ꎞ�I�C���X�^���X�Ƌ�ʂ��邽�߂�
- �g���܂��B
+ <literal>unsaved-value</literal>(オプション -
デフォルトの値はsensible):
+ インスタンスが新しくインスタンス化された
+ (セーブされていない)ことを示す、識別子プロパティの値。
+ 以前のSessionでセーブまたはロードされた一時的インスタンスと区別するために
+ 使います。
</para>
</callout>
<callout arearefs="id5">
<para>
- <literal>access</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>property</literal> �j�F
- �v���p�e�B�̒l�փA�N�Z�X���邽�߂�Hibernate���g���헪�ł��B
+ <literal>access</literal>(オプション - デフォルトは
<literal>property</literal> ):
+ プロパティの値へアクセスするためにHibernateが使う戦略です。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- <literal>name</literal>
�������Ȃ���A�N���X�ɂ͎��ʎq�v���p�e�B���Ȃ���̂Ƃ݂Ȃ���܂��B
+ <literal>name</literal> 属性がなければ、クラスには識別子プロパティがないものとみなされます。
</para>
<para>
- <literal>unsaved-value</literal>
������Hibernate3�ł͂قƂ�ǂ̏ꍇ�A�K�v�ł͂���܂���B
+ <literal>unsaved-value</literal>
属性はHibernate3ではほとんどの場合、必要ではありません。
</para>
<para>
- �����L�[�����K�V�[�f�[�^�ɃA�N�Z�X�ł���悤�ɁA
- <literal><composite-id></literal>
�Ƃ�����ւ̃}�b�s���O��`������܂��B
- ���������̗p�r�ւ̎g�p�͑S���������߂ł��܂���B
+ 複合キーを持つレガシーデータにアクセスできるように、
+ <literal><composite-id></literal>
という代替のマッピング定義があります。
+ しかし他の用途への使用は全くおすすめできません。
</para>
<sect3 id="mapping-declaration-id-generator"
revision="2">
- <title>�W�F�l���[�^</title>
+ <title>ジェネレータ</title>
<para>
- �I�v�V������ <literal><generator></literal>
�q�v�f�́A
-
�i���N���X�̃C���X�^���X�̃��j�[�N�Ȏ��ʎq�����邽�߂Ɏg���AJava�N���X��w�肵�܂��B
-
�W�F�l���[�^�C���X�^���X�̐ݒ�A������͏������Ƀp�����[�^���K�v�ł���A<literal><param></literal>
- �v�f��g���ēn�����Ƃ��ł��܂��B
+ オプションの <literal><generator></literal>
子要素は、
+ 永続クラスのインスタンスのユニークな識別子を生成するために使う、Javaクラスを指定します。
+
ジェネレータインスタンスの設定、もしくは初期化にパラメータが必要であれば、<literal><param></literal>
+ 要素を使って渡すことができます。
</para>
<programlisting><![CDATA[<id name="id"
type="long" column="cat_id">
@@ -683,11 +684,11 @@
</id>]]></programlisting>
<para>
- ���ׂẴW�F�l���[�^�́A�C���^�[�t�F�C�X
- <literal>org.hibernate.id.IdentifierGenerator</literal>
��������܂��B
-
����͂ƂĂ�P���ȃC���^�[�t�F�C�X�Ȃ̂ŁA���ʂȎ�����Ǝ��ɗp�ӂ���A�v���P�[�V��������邩�����܂���B
- ������Hibernate�͑g�ݍ��݂̎���������p�ӂ��Ă��܂��B
- �g�ݍ��݂̃W�F�l���[�^�ɂ͈ȉ��̃V���[�g�J�b�g��������܂��F
+ すべてのジェネレータは、インターフェイス
+ <literal>org.hibernate.id.IdentifierGenerator</literal>
を実装します。
+ これはとても単純なインターフェイスなので、特別な実装を独自に用意するアプリケーションもあるかもしれません。
+ しかしHibernateは組み込みの実装をいくつも用意しています。
+ 組み込みのジェネレータには以下のショートカット名があります:
<variablelist>
<varlistentry>
@@ -695,9 +696,9 @@
<listitem>
<para>
<literal>long</literal> ,
<literal>short</literal> ,
- <literal>int</literal> �^�̎��ʎq�����܂��B
-
�����͑��̃v���Z�X�������e�[�u���Ƀf�[�^��}�����Ȃ��Ƃ��������j�[�N�ł��B
-
<emphasis>�N���X�^��ł͎g��Ȃ��ł�������</emphasis> �B
+ <literal>int</literal> 型の識別子を生成します。
+ これらは他のプロセスが同じテーブルにデータを挿入しないときだけユニークです。
+ <emphasis>クラスタ内では使わないでください</emphasis> 。
</para>
</listitem>
</varlistentry>
@@ -705,10 +706,10 @@
<term><literal>identity</literal></term>
<listitem>
<para>
- DB2, MySQL, MS SQL Server, Sybase,
HypersonicSQL�̎��ʎq�J������
- �T�|�[�g���܂��B
- �Ԃ���鎯�ʎq�̌^�� <literal>long</literal> ,
<literal>short</literal> ,
- <literal>int</literal> �̂����ꂩ�ł��B
+ DB2, MySQL, MS SQL Server, Sybase, HypersonicSQLの識別子カラムを
+ サポートします。
+ 返される識別子の型は <literal>long</literal> ,
<literal>short</literal> ,
+ <literal>int</literal> のいずれかです。
</para>
</listitem>
</varlistentry>
@@ -716,9 +717,9 @@
<term><literal>sequence</literal></term>
<listitem>
<para>
- DB2, PostgreSQL, Oracle, SAP DB,
McKoi�̃V�[�P���X��AInterbase�̃W�F�l���[�^��g�p���܂��B
- �Ԃ���鎯�ʎq�̌^�� <literal>long</literal> ,
<literal>short</literal> ,
- <literal>int</literal> �̂����ꂩ�ł��B
+ DB2, PostgreSQL, Oracle, SAP DB,
McKoiのシーケンスや、Interbaseのジェネレータを使用します。
+ 返される識別子の型は <literal>long</literal> ,
<literal>short</literal> ,
+ <literal>int</literal> のいずれかです。
</para>
</listitem>
</varlistentry>
@@ -727,11 +728,11 @@
<listitem>
<para
id="mapping-declaration-id-hilodescription" revision="1">
<literal>long</literal> ,
<literal>short</literal> ,
- <literal>int</literal>
�^�̎��ʎq������I�ɐ�������hi/lo�A���S���Y����g���܂��B
-
hi�l�̃\�[�X�Ƃ��āA�e�[�u���ƃJ������^���܂�(�f�t�H���g�ł͂��ꂼ��
<literal>hibernate_unique_key</literal> ��
- <literal>next_hi</literal> )�B
+ <literal>int</literal>
型の識別子を効率的に生成するhi/loアルゴリズムを使います。
+ hi値のソースとして、テーブルとカラムを与えます(デフォルトではそれぞれ
<literal>hibernate_unique_key</literal> と
+ <literal>next_hi</literal> )。
-
hi/lo�A���S���Y���͓���̃f�[�^�x�[�X�ɑ��Ă̂݃��j�[�N�Ȏ��ʎq�����܂��B
+ hi/loアルゴリズムは特定のデータベースに対してのみユニークな識別子を生成します。
</para>
</listitem>
</varlistentry>
@@ -740,8 +741,8 @@
<listitem>
<para>
<literal>long</literal> ,
<literal>short</literal> ,
- <literal>int</literal>
�^�̎��ʎq������I�ɐ�������hi/lo�A���S���Y����g���܂��B
- �w�肳�ꂽ�f�[�^�x�[�X�V�[�P���X��^���܂��B
+ <literal>int</literal>
型の識別子を効率的に生成するhi/loアルゴリズムを使います。
+ 指定されたデータベースシーケンスを与えます。
</para>
</listitem>
@@ -750,8 +751,8 @@
<term><literal>uuid</literal></term>
<listitem>
<para>
-
(IP�A�h���X���g�p�����)�l�b�g���[�N��Ń��j�[�N�ȕ�����^�̎��ʎq�����邽�߂ɁA
-
128�r�b�g��UUID�A���S���Y����g�p���܂��BUUID�͒���32��16�i�����̕�����Ƃ��ăG���R�[�h����܂��B
+ (IPアドレスが使用される)ネットワーク内でユニークな文字列型の識別子を生成するために、
+ 128ビットのUUIDアルゴリズムを使用します。UUIDは長さ32の16進数字の文字列としてエンコードされます。
</para>
</listitem>
</varlistentry>
@@ -759,7 +760,7 @@
<term><literal>guid</literal></term>
<listitem>
<para>
- MS
SQL�T�[�o��MySQL�Ńf�[�^�x�[�X����������GUID�������g�p���܂��B
+ MS SQLサーバとMySQLでデータベースが生成するGUID文字列を使用します。
</para>
</listitem>
</varlistentry>
@@ -767,8 +768,8 @@
<term><literal>native</literal></term>
<listitem>
<para>
- �g�p����f�[�^�x�[�X�̐��\�ɂ��
<literal>identity</literal> , <literal>sequence</literal> ,
- <literal>hilo</literal> �̂����ꂩ���I��܂��B
+ 使用するデータベースの性能により <literal>identity</literal>
, <literal>sequence</literal> ,
+ <literal>hilo</literal> のいずれかが選ばれます。
</para>
</listitem>
</varlistentry>
@@ -776,9 +777,9 @@
<term><literal>assigned</literal></term>
<listitem>
<para>
- <literal>save()</literal> ���Ă��O�ɁA
- �A�v���P�[�V�������I�u�W�F�N�g�Ɏ��ʎq�����ł���悤�ɂ��܂��B
- <literal><generator></literal>
���w�肳��Ă��Ȃ���A���ꂪ�f�t�H���g�̐헪�ɂȂ�܂��B
+ <literal>save()</literal> が呼ばれる前に、
+ アプリケーションがオブジェクトに識別子を代入できるようにします。
+ <literal><generator></literal>
が指定されていなければ、これがデフォルトの戦略になります。
</para>
</listitem>
</varlistentry>
@@ -786,8 +787,8 @@
<term><literal>select</literal></term>
<listitem>
<para>
- ���郆�j�[�N�L�[�ɂ��s�̑I��Ǝ�L�[�̒l�̕����ɂ��A
- �f�[�^�x�[�X�g���K�����蓖�Ă���L�[��擾���܂��B
+ あるユニークキーによる行の選択と主キーの値の復元により、
+ データベーストリガが割り当てた主キーを取得します。
</para>
</listitem>
</varlistentry>
@@ -795,8 +796,8 @@
<term><literal>foreign</literal></term>
<listitem>
<para>
- ���̊֘A�I�u�W�F�N�g�̎��ʎq��g���܂��B
-
���ʂ́A<literal><one-to-one></literal>
��L�[�֘A�Ƒg�ݍ��킹�Ďg���܂��B
+ 他の関連オブジェクトの識別子を使います。
+
普通は、<literal><one-to-one></literal> 主キー関連と組み合わせて使います。
</para>
</listitem>
</varlistentry>
@@ -806,14 +807,14 @@
</sect3>
<sect3 id="mapping-declaration-id-hilo"
revision="1">
- <title>Hi/lo �A���S���Y��</title>
+ <title>Hi/lo アルゴリズム</title>
<para>
- <literal>hilo</literal> ��
<literal>seqhilo</literal> �W�F�l���[�^�́A
- ���ʎq�����̑�\�I�ȃA�v���[�`�ł���hi/lo�A���S���Y����2�̑�֎�������܂��B
+ <literal>hilo</literal> と
<literal>seqhilo</literal> ジェネレータは、
+ 識別子生成の代表的なアプローチであるhi/loアルゴリズムの2つの代替実装を提供します。
-
1�Ԗڂ̎����́A����ɗ��p�����"hi"�l��ێ�����u���ʂȁv�f�[�^�x�[�X�e�[�u����
- �K�v�Ƃ��܂��B
- 2�Ԗڂ̎����́AOracle�X�^�C���̃V�[�P���X��g���܂��i�T�|�[�g����Ă���ꍇ�j�B
+ 1番目の実装は、次回に利用される"hi"値を保持する「特別な」データベーステーブルを
+ 必要とします。
+ 2番目の実装は、Oracleスタイルのシーケンスを使います(サポートされている場合)。
</para>
<programlisting><![CDATA[<id name="id"
type="long" column="cat_id">
@@ -832,31 +833,31 @@
</id>]]></programlisting>
<para>
- �c�O�Ȃ���Hibernate�ւ̓Ǝ��� <literal>Connection</literal>
�����Ƃ��ɂ́A<literal>hilo</literal> ��g���܂���B
-
Hibernate��JTA�Ń��X�g����Ă���ڑ���擾���邽�߂ɃA�v���P�[�V�����T�[�o�[�̃f�[�^�\�[�X��g�p���Ă���Ƃ��ɂ́A
-
<literal>hibernate.transaction.manager_lookup_class</literal>
��K�ɐݒ肵�Ȃ���Ȃ�܂���B
+ 残念ながらHibernateへの独自の <literal>Connection</literal>
を提供するときには、<literal>hilo</literal> を使えません。
+ HibernateがJTAでリストされている接続を取得するためにアプリケーションサーバーのデータソースを使用しているときには、
+
<literal>hibernate.transaction.manager_lookup_class</literal>
を適切に設定しなければなりません。
</para>
</sect3>
<sect3 id="mapping-declaration-id-uuid">
- <title>UUID �A���S���Y��</title>
+ <title>UUID アルゴリズム</title>
<para>
- UUID�ɂ͈ȉ��̂�̂��܂܂�܂��F
- IP�A�h���X�AJVM�̃X�^�[�g�A�b�v�^�C���i4����1�b�̐��m���j�A
- �V�X�e�����ԁA�iJVM�ɑ��ă��j�[�N�ȁj�J�E���^�l�B
- Java�R�[�h����MAC�A�h���X������A�h���X��擾���邱�Ƃ͂ł��Ȃ��̂ŁA
- JNI���g���Ȃ��Ƃ��̍ŗǂ̕��@�ł��B
+ UUIDには以下のものが含まれます:
+ IPアドレス、JVMのスタートアップタイム(4分の1秒の正確さ)、
+ システム時間、(JVMに対してユニークな)カウンタ値。
+ JavaコードからMACアドレスやメモリアドレスを取得することはできないので、
+ JNIが使えないときの最良の方法です。
</para>
</sect3>
<sect3 id="mapping-declaration-id-sequences">
- <title>���ʎq�J�����ƃV�[�P���X</title>
+ <title>識別子カラムとシーケンス</title>
<para>
- ���ʎq�J������T�|�[�g���Ă���f�[�^�x�[�X�iDB2, MySQL, Sybase, MS
SQL�j�ł́A
- <literal>identity</literal> �L�[������g���܂��B
- �V�[�P���X��T�|�[�g����f�[�^�x�[�X�iDB2, Oracle, PostgreSQL,
Interbase, McKoi, SAP DB�j�ł́A
- <literal>sequence</literal> �X�^�C���̃L�[������g���܂��B
- �ǂ���̐헪��A�V�����I�u�W�F�N�g��}�����邽�߂ɁASQL�N�G����2�K�v�Ƃ��܂��B
+ 識別子カラムをサポートしているデータベース(DB2, MySQL, Sybase, MS SQL)では、
+ <literal>identity</literal> キー生成を使えます。
+ シーケンスをサポートするデータベース(DB2, Oracle, PostgreSQL, Interbase, McKoi, SAP
DB)では、
+ <literal>sequence</literal> スタイルのキー生成を使えます。
+ どちらの戦略も、新しいオブジェクトを挿入するために、SQLクエリを2つ必要とします。
</para>
<programlisting><![CDATA[<id name="id"
type="long" column="person_id">
@@ -870,36 +871,36 @@
</id>]]></programlisting>
<para>
- �N���X�v���b�g�t�H�[���̊J���ł́A<literal>native</literal>
�헪��
+ クロスプラットフォームの開発では、<literal>native</literal> 戦略は
<literal>identity</literal> ,
<literal>sequence</literal> ,
- <literal>hilo</literal> �헪�̒�����1��I���܂����A
- ����͎g�p���Ă���f�[�^�x�[�X�̔\�͂Ɉˑ����܂��B
+ <literal>hilo</literal> 戦略の中から1つを選択しますが、
+ これは使用しているデータベースの能力に依存します。
</para>
</sect3>
<sect3 id="mapping-declaration-id-assigned">
- <title>���ʎq�̊��蓖��</title>
+ <title>識別子の割り当て</title>
<para>
-
�A�v���P�[�V�����Ɏ��ʎq���蓖�Ă��������̂ł����(Hibernate�����������̂ł͂Ȃ��j�A
- <literal>assigned</literal>
�W�F�l���[�^��g�����Ƃ��ł��܂��B
- ���̓��ʂȃW�F�l���[�^�́A���łɃI�u�W�F�N�g�̎��ʎq�v���p�e�B�ɑ�����ꂽ�l��
-
���ʎq�Ɏg���܂��B���̃W�F�l���[�^�͎�L�[���㗝�L�[�̑���Ɏ��R�L�[�ł���ꍇ�Ɏg�p���܂��B
- <literal><generator></literal>
�v�f��w�肵�Ȃ��ꍇ�̃f�t�H���g�̓���ɂȂ�܂��B
+ アプリケーションに識別子を割り当てさせたいのであれば(Hibernateが生成するものではなく)、
+ <literal>assigned</literal> ジェネレータを使うことができます。
+ この特別なジェネレータは、すでにオブジェクトの識別子プロパティに代入された値を
+ 識別子に使います。このジェネレータは主キーが代理キーの代わりに自然キーである場合に使用します。
+ <literal><generator></literal>
要素を指定しない場合のデフォルトの動作になります。
</para>
<para>
- <literal>assigned</literal> �W�F�l���[�^��I����ƁA
- Hibernate��
<literal>unsaved-value="undefined"</literal> ��g�p���܂��B
- �����āA�o�[�W������^�C���X�^���v�̃v���p�e�B���Ȃ��ꍇ��
<literal>Interceptor.isUnsaved()</literal>
- ���`���Ȃ������ꍇ�ɂ́A�C���X�^���X���ꎞ�I(transient)�Ȃ�̂ł���̂��A
-
�܂��̓Z�b�V�������番��(detached)������̂��ǂ������߂邽�߂ɁA�f�[�^�x�[�X�ׂ܂��B
+ <literal>assigned</literal> ジェネレータを選択すると、
+ Hibernateは
<literal>unsaved-value="undefined"</literal> を使用します。
+ そして、バージョンやタイムスタンプのプロパティがない場合や
<literal>Interceptor.isUnsaved()</literal>
+ を定義しなかった場合には、インスタンスが一時的(transient)なものであるのか、
+ またはセッションから分離(detached)したものかどうかを決めるために、データベースを調べます。
</para>
</sect3>
<sect3 id="mapping-declaration-id-select">
- <title>�g���K�ɂ�芄�蓖�Ă�ꂽ��L�[</title>
+ <title>トリガにより割り当てられた主キー</title>
<para>
-
���K�V�[�X�L�[�}�̂��߂ɂ̂ݎw�肵�܂�(Hibernate�̓g���K��g����DDL�����܂���)�B
+ レガシースキーマのためにのみ指定します(Hibernateはトリガを使ってDDLを生成しません)。
</para>
<programlisting><![CDATA[<id name="id"
type="long" column="person_id">
@@ -909,9 +910,9 @@
</id>]]></programlisting>
<para>
- ��̗�̒��ŁA�N���X�Ŏ��R�L�[�Ƃ��Ē�`���ꂽ
- <literal>socialSecurityNumber</literal>
�Ƃ������O�̃��j�[�N�Ȓl�̃v���p�e�B�ƁA
- �l���g���K�ɂ�萶������� <literal>person_id</literal>
�Ƃ������O�̑㗝�L�[������܂��B
+ 上の例の中で、クラスで自然キーとして定義された
+ <literal>socialSecurityNumber</literal>
という名前のユニークな値のプロパティと、
+ 値がトリガにより生成される <literal>person_id</literal>
という名前の代理キーがあります。
</para>
</sect3>
@@ -934,11 +935,11 @@
</composite-id>]]></programlisting>
<para>
- �����L�[�̂���e�[�u���ɑ��A
- ���ʎq�v���p�e�B�Ƃ��ăN���X�̕����̃v���p�e�B��}�b�s���O���邱�Ƃ��ł��܂��B
- <literal><composite-id></literal>
�v�f�́A�q�v�f�Ƃ���
- <literal><key-property></literal>
�v���p�e�B�}�b�s���O��
- <literal><key-many-to-one></literal>
�}�b�s���O�����܂��B
+ 複合キーのあるテーブルに対し、
+ 識別子プロパティとしてクラスの複数のプロパティをマッピングすることができます。
+ <literal><composite-id></literal> 要素は、子要素として
+ <literal><key-property></literal> プロパティマッピングと
+ <literal><key-many-to-one></literal>
マッピングを受け入れます。
</para>
<programlisting><![CDATA[<composite-id>
@@ -947,27 +948,27 @@
</composite-id>]]></programlisting>
<para>
- �������ʎq�̓�������������邽�߂ɂ́A�i���N���X��
<literal>equals()</literal> ��
- <literal>hashCode()</literal> ��I�[�o�[���C�h
<emphasis>���Ȃ���Ȃ�܂���</emphasis> �B
- �܂� <literal>Serializable</literal> ��������Ȃ�������܂���B
+ 複合識別子の等価性を実装するためには、永続クラスが <literal>equals()</literal> と
+ <literal>hashCode()</literal> をオーバーライド
<emphasis>しなければなりません</emphasis> 。
+ また <literal>Serializable</literal> も実装しなければいけません。
</para>
<para>
- �c�O�Ȃ��畡�����ʎq�̂��߂̂��̕��@�́A
- �i���I�u�W�F�N�g�����g�̎��ʎq�ł��邱�Ƃ�Ӗ����Ă��܂��B
- �I�u�W�F�N�g���g���ʎq�Ƃ���ȏ�֗̕��ȁu�������v�͂���܂���B
- �����L�[�Ɋ֘A�����i����Ԃ� <literal>load()</literal>
�o����悤�ɂȂ�O�ɁA
- �i���N���X���g��C���X�^���X�����A���ʎq�v���p�e�B��ݒ肵�Ȃ���Ȃ�܂���B
- <emphasis> �g�ݍ��݂�</emphasis> �������ʎq�ƌĂ�邱�̃A�v���[�`�́A
- �{�i�I�ȃA�v���P�[�V�����ɂ͌����Ă��܂���B
+ 残念ながら複合識別子のためのこの方法は、
+ 永続オブジェクトが自身の識別子であることを意味しています。
+ オブジェクト自身を識別子とする以上の便利な「扱い方」はありません。
+ 複合キーに関連した永続状態を <literal>load()</literal> 出来るようになる前に、
+ 永続クラス自身をインスタンス化し、識別子プロパティを設定しなければなりません。
+ <emphasis> 組み込みの</emphasis> 複合識別子と呼ばれるこのアプローチは、
+ 本格的なアプリケーションには向いていません。
</para>
<para>
- 2�ڂ̕��@�� <emphasis> �}�b�v���ꂽ</emphasis>
�������ʎq�ƌĂ���̂ŁA
-
<literal><composite-id></literal>�G�������g��Ŏw�肵�����ʃv���p�e�B��
- �i���N���X�ƕ����������ʎq�N���X�̗����ɏd�����đ��݂��܂��B
+ 2つ目の方法は <emphasis> マップされた</emphasis> 複合識別子と呼ばれるもので、
+
<literal><composite-id></literal>エレメント内で指定した識別プロパティが
+ 永続クラスと分離した識別子クラスの両方に重複して存在します。
</para>
<programlisting><![CDATA[<composite-id
class="MedicareId" mapped="true">
@@ -976,65 +977,65 @@
</composite-id>]]></programlisting>
<para>
- ���̗�ł́A�������ʎq�N���X�i <literal>MedicareId</literal>
�j�ƃG���e�B�e�B�N���X���g�̗������A
- <literal>medicareNumber</literal> ��
<literal>dependent</literal> �Ƃ������O�̃v���p�e�B�����܂��B
- ���ʎq�N���X�́A<literal>equals()</literal> ��
<literal>hashCode()</literal> ��I�[�o���C�h���A
- <literal>Serializable</literal> ��������Ȃ��Ă͂Ȃ�܂���B
- ���̕��@�ɂ́A���炩�ɃR�[�h���d������Ƃ����s�s��������܂��B
+ この例では、複合識別子クラス( <literal>MedicareId</literal>
)とエンティティクラス自身の両方が、
+ <literal>medicareNumber</literal> と
<literal>dependent</literal> という名前のプロパティを持ちます。
+ 識別子クラスは、<literal>equals()</literal> と
<literal>hashCode()</literal> をオーバライドし、
+ <literal>Serializable</literal> を実装しなくてはなりません。
+ この方法には、明らかにコードが重複するという不都合があります。
</para>
<para>
- ���̑����̓}�b�s���O�����������ʎq��w�肷�邽�߂Ɏg�p���܂��B
+ 次の属性はマッピングした複合識別子を指定するために使用します。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>mapped</literal> (�I�v�V�����A�f�t�H���g��
<literal>false</literal> ):
-
�}�b�s���O�����������ʎq���g�p����邱�ƂƁA��܂��ꂽ�v���p�e�B�̃}�b�s���O���A
- �G���e�B�e�B�N���X�ƕ������ʎq�N���X�̗�����Q�Ƃ��邱�Ƃ����܂��B
+ <literal>mapped</literal> (オプション、デフォルトは
<literal>false</literal> ):
+ マッピングした複合識別子が使用されることと、包含されたプロパティのマッピングが、
+ エンティティクラスと複合識別子クラスの両方を参照することを示します。
</para>
</listitem>
<listitem>
<para>
- <literal>class</literal>
(�I�v�V����,�������}�b�s���O�����������ʎq�ɂ͕K�{):
- �������ʎq�Ƃ��Ďg�p����N���X�B
+ <literal>class</literal> (オプション,ただしマッピングした複合識別子には必須):
+ 複合識別子として使用するクラス。
</para>
</listitem>
</itemizedlist>
<para>
- 3�ڂ̂���ɕ֗��ȕ��@�́A�������ʎq��<xref
linkend="components-compositeid"/>���
- �R���|�[�l���g�N���X�Ƃ��Ď������邱�Ƃł��B
- ���ŋL�q���Ă��鑮���́A���̑�֕��@�ɂ̂ݓK�p����܂��B
+ 3つ目のさらに便利な方法は、複合識別子を<xref
linkend="components-compositeid"/>内の
+ コンポーネントクラスとして実装することです。
+ 下で記述している属性は、この代替方法にのみ適用されます。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>name</literal> (�I�v�V����,
���̃A�v���[�`�ł͕K�{):
-
�������ʎq��ێ�����R���|�[�l���g�^�C�v�̃v���p�e�B(9�͂�Q�Ƃ��Ă�������).
+ <literal>name</literal> (オプション, このアプローチでは必須):
+ 複合識別子を保持するコンポーネントタイプのプロパティ(9章を参照してください).
</para>
</listitem>
<listitem>
<para>
- <literal>access</literal> (�I�v�V���� - �f�t�H���g��
<literal>property</literal> ):
- Hibernate���v���p�e�B�̒l�ɃA�N�Z�X���邽�߂Ɏg�p���ׂ��헪�B
+ <literal>access</literal> (オプション - デフォルトは
<literal>property</literal> ):
+ Hibernateがプロパティの値にアクセスするために使用すべき戦略。
</para>
</listitem>
<listitem>
<para>
<literal>class</literal>
- �i�I�v�V���� -
�f�t�H���g�̓��t���N�V�����ɂ�茈�肳���v���p�e�B�̌^�j�F
- �������ʎq�Ƃ��Ďg����R���|�[�l���g�̃N���X�i���̐߂��Ă��������j�B
+ (オプション - デフォルトはリフレクションにより決定されるプロパティの型):
+ 複合識別子として使われるコンポーネントのクラス(次の節を見てください)。
</para>
</listitem>
</itemizedlist>
<para>
- ����3�ڂ̕��@�� <emphasis> ���ʎq�R���|�[�l���g</emphasis>
�ƌĂсA
- �قƂ�ǂ��ׂẴA�v���P�[�V�����ɑ��Đ���������@�ł��B
+ この3つ目の方法は <emphasis> 識別子コンポーネント</emphasis> と呼び、
+ ほとんどすべてのアプリケーションに対して推奨する方法です。
</para>
</sect2>
@@ -1043,12 +1044,12 @@
<title>discriminator</title>
<para>
- <literal><discriminator></literal> �v�f�́A
-
table-per-class-hierarchy�}�b�s���O�헪��g���|�����[�t�B�b�N�ȉi�����ɕK�v�ł���A
- �e�[�u���̎��ʃJ�������`���܂��B
- ���ʃJ�����́A����s�ɑ��ĉi���w���ǂ̃T�u�N���X��C���X�^���X�����邩��
- �`����}�[�J�[�l��܂�ł��܂��B
- �ȉ��̂悤�Ȍ^�ɐ�������܂��F <literal>string</literal> ,
<literal>character</literal> ,
+ <literal><discriminator></literal> 要素は、
+ table-per-class-hierarchyマッピング戦略を使うポリモーフィックな永続化に必要であり、
+ テーブルの識別カラムを定義します。
+ 識別カラムは、ある行に対して永続層がどのサブクラスをインスタンス化するかを
+ 伝えるマーカー値を含んでいます。
+ 以下のような型に制限されます: <literal>string</literal> ,
<literal>character</literal> ,
<literal>integer</literal>,
<literal>byte</literal> ,
<literal>short</literal> , <literal>boolean</literal> ,
<literal>yes_no</literal> ,
<literal>true_false</literal>.
@@ -1072,56 +1073,56 @@
<calloutlist>
<callout arearefs="discriminator1">
<para>
- <literal>column</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>class</literal> �j�F
- ���ʃJ�����̖��O�B
+ <literal>column</literal>(オプション - デフォルトは
<literal>class</literal> ):
+ 識別カラムの名前。
</para>
</callout>
<callout arearefs="discriminator2">
<para>
<literal>type</literal>
- �i�I�v�V���� - �f�t�H���g��
<literal>string</literal> �j�FHibernate�̌^�������O�B
+ (オプション - デフォルトは <literal>string</literal>
):Hibernateの型を示す名前。
</para>
</callout>
<callout arearefs="discriminator3">
<para>
<literal>force</literal>
- �i�I�v�V���� - �f�t�H���g��
<literal>false</literal> �j�F
- ���[�g�N���X�̂��ׂẴC���X�^���X��������ꍇ�ł����Ă�A
- Hibernate���g�p�ł��鎯�ʃJ�����̎w���u�����v���܂��B
+ (オプション - デフォルトは <literal>false</literal> ):
+ ルートクラスのすべてのインスタンスを検索する場合であっても、
+ Hibernateが使用できる識別カラムの指定を「強制」します。
</para>
</callout>
<callout arearefs="discriminator4">
<para>
<literal>insert</literal>
- �i�I�v�V���� - �f�t�H���g��
<literal>true</literal> �j�F
-
������ʃJ�������}�b�s���O���镡�����ʎq�̈ꕔ�Ȃ�A<literal>false</literal>
�Ɛݒ肵�Ă��������B
- (Hibernate��SQL�� <literal>INSERT</literal>
�ɂ͊܂܂�Ȃ����Ƃ�m�点��)
+ (オプション - デフォルトは <literal>true</literal> ):
+
もし識別カラムがマッピングする複合識別子の一部ならば、<literal>false</literal> と設定してください。
+ (HibernateにSQLの <literal>INSERT</literal>
には含まれないことを知らせる)
</para>
</callout>
<callout arearefs="discriminator5">
<para>
- <literal>formula</literal>
(�I�v�V����)�^���]�������Ƃ��Ɏ��s�����C�ӂ�SQL���B
- �R���e���c�x�[�X�̎��ʂ�\�ɂ��܂��B
+ <literal>formula</literal>
(オプション)型が評価されるときに実行される任意のSQL式。
+ コンテンツベースの識別を可能にします。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- ���ʃJ�����̎��ۂ̒l�́A <literal><class></literal>
��
- <literal><subclass></literal> �v�f��
- <literal>discriminator-value</literal> �����Ŏw�肳��܂��B
+ 識別カラムの実際の値は、 <literal><class></literal> と
+ <literal><subclass></literal> 要素の
+ <literal>discriminator-value</literal> 属性で指定されます。
</para>
<para>
- �i���N���X�փ}�b�s���O����Ȃ���]���ȁv���ʒl���s��
- �e�[�u���ɂ���A�i���̂Ƃ��Ɍ���j<literal>force</literal>
�����͗L���ł��B
- �������A���ʂ͂����������Ƃ͂���܂���B
+ 永続クラスへマッピングされない「余分な」識別値を持つ行が
+ テーブルにあれば、(そのときに限り)<literal>force</literal> 属性は有効です。
+ ただし、普通はそういうことはありません。
</para>
<para>
- <literal>formula</literal>
������g���ƁA�s�̌^��]�����邽�߂ɔC�ӂ�SQL����錾�ł��܂��B
+ <literal>formula</literal> 属性を使うと、行の型を評価するために任意のSQL式を宣言できます。
</para>
<programlisting><![CDATA[<discriminator
@@ -1131,13 +1132,13 @@
</sect2>
<sect2 id="mapping-declaration-version" revision="4">
- <title>version�i�I�v�V�����j</title>
+ <title>version(オプション)</title>
<para>
- <literal><version></literal>
�v�f�̓I�v�V�����ł���A
- �e�[�u�����o�[�W�����f�[�^��܂ނ��Ƃ����܂��B
- ����� <emphasis>�����O�g�����U�N�V����</emphasis>
- ��g�����Ȃ�A���ɖ𗧂��܂��i�ȉ����Ă��������j�B
+ <literal><version></literal> 要素はオプションであり、
+ テーブルがバージョンデータを含むことを示します。
+ これは <emphasis>ロングトランザクション</emphasis>
+ を使うつもりなら、特に役立ちます(以下を見てください)。
</para>
<programlistingco>
@@ -1163,85 +1164,85 @@
<calloutlist>
<callout arearefs="version1">
<para>
- <literal>column</literal>�i�I�v�V���� -
�f�t�H���g�̓v���p�e�B���j:
- �o�[�W�����ԍ���ێ�����J�����̖��O�B
+ <literal>column</literal>(オプション - デフォルトはプロパティ名):
+ バージョン番号を保持するカラムの名前。
</para>
</callout>
<callout arearefs="version2">
<para>
- <literal>name</literal>
�F�i���N���X�̃v���p�e�B�̖��O�B
+ <literal>name</literal> :永続クラスのプロパティの名前。
</para>
</callout>
<callout arearefs="version3">
<para>
<literal>type</literal>
- �i�I�v�V���� - �f�t�H���g��
<literal>integer</literal> �j�F�o�[�W�����ԍ��̌^�B
+ (オプション - デフォルトは <literal>integer</literal>
):バージョン番号の型。
</para>
</callout>
<callout arearefs="version4">
<para>
<literal>access</literal>
- �i�I�v�V���� - �f�t�H���g��
<literal>property</literal> �j�F
- �v���p�e�B�̒l�ւ̃A�N�Z�X��Hibernate���g���헪�B
+ (オプション - デフォルトは <literal>property</literal> ):
+ プロパティの値へのアクセスにHibernateが使う戦略。
</para>
</callout>
<callout arearefs="version5">
<para>
<literal>unsaved-value</literal>
- �i�I�v�V���� - �f�t�H���g��
<literal>undefined</literal> �j�F
- �C���X�^���X���V�����C���X�^���X�����ꂽ���Ƃ���
- �i�Z�[�u����Ă��Ȃ����Ƃ����j�o�[�W�����v���p�e�B�̒l�B
- �ȑO��Session�ŃZ�[�u�܂��̓��[�h���ꂽ�ꎞ�I�ȃC���X�^���X�Ƌ�ʂ��邽�߂�
- �g���܂��B
- �i <literal>undefined</literal>
�͎��ʎq�v���p�e�B�̒l���g���邱�Ƃ�w�肵�܂��B�j
+ (オプション - デフォルトは <literal>undefined</literal> ):
+ インスタンスが新しくインスタンス化されたことを示す
+ (セーブされていないことを示す)バージョンプロパティの値。
+ 以前のSessionでセーブまたはロードされた一時的なインスタンスと区別するために
+ 使います。
+ ( <literal>undefined</literal>
は識別子プロパティの値が使われることを指定します。)
</para>
</callout>
<callout arearefs="version6">
<para>
- <literal>generated</literal> (�I�v�V���� -
�f�t�H���g�� <literal>never</literal> ):
-
���̃o�[�W�����̃v���p�e�B�̒l���A�f�[�^�x�[�X�ɂ���Đ������ꂽ���Ƃ�w�肵�܂��B
- <xref
linkend="mapping-generated">�����v���p�e�B</xref> �̋c�_���Ă��������B
+ <literal>generated</literal> (オプション - デフォルトは
<literal>never</literal> ):
+ このバージョンのプロパティの値が、データベースによって生成されたことを指定します。
+ <xref
linkend="mapping-generated">生成プロパティ</xref> の議論を見てください。
</para>
</callout>
<callout arearefs="version7">
<para>
- <literal>insert</literal> (�I�v�V���� -
�f�t�H���g�� <literal>true</literal> ):
- SQL��insert���Ƀo�[�W�����E�J������܂߂�ׂ����ǂ�����w�肵�܂��B
- ����f�[�^�x�[�X�E�J�����̃f�t�H���g�l��
<literal>0</literal> �ƒ�`�����Ƃ��ɂ́A
- <literal>false</literal> �ɐݒ肷��Ɨǂ��ł��傤�B
+ <literal>insert</literal> (オプション - デフォルトは
<literal>true</literal> ):
+ SQLのinsert文にバージョン・カラムを含めるべきかどうかを指定します。
+ もしデータベース・カラムのデフォルト値が <literal>0</literal>
と定義されるときには、
+ <literal>false</literal> に設定すると良いでしょう。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- �o�[�W�����ԍ��� Hibernate�� <literal>long</literal> ,
<literal>integer</literal> ,
+ バージョン番号は Hibernateの <literal>long</literal> ,
<literal>integer</literal> ,
<literal>short</literal> ,
<literal>timestamp</literal> ,
- <literal>calendar</literal> �^�̂����ꂩ�ł��B
+ <literal>calendar</literal> 型のいずれかです。
</para>
<para>
-
�o�[�W������^�C���X�^���v�̃v���p�e�B�́A�������ꂽ�C���X�^���X�ɑ���null�ł����Ă͂Ȃ�܂���B
- ���̂��߂ǂ̂悤�� <literal>unsaved-value</literal> �헪���w�肳��Ă�A
- Hibernate��null�̃o�[�W������^�C���X�^���v���������ׂẴC���X�^���X��A
- �ꎞ�I�Ȃ�̂ł���Ɣ��f���܂��B
+ バージョンやタイムスタンプのプロパティは、分離されたインスタンスに対してnullであってはなりません。
+ そのためどのような <literal>unsaved-value</literal> 戦略が指定されても、
+ Hibernateはnullのバージョンやタイムスタンプを持ったすべてのインスタンスを、
+ 一時的なものであると判断します。
- <emphasis>
null���e����o�[�W������^�C���X�^���v�̃v���p�e�B���`���邱�Ƃ́A
- �ߓn�I�Ɉꎞ�I�u�W�F�N�g�Ƃ��邱�Ƃ�h���ȒP�ȕ��@�ł��B
- ���Ɏ��ʎq�̊��蓖�Ă╡���L�[��g�p���Ă���Ƃ��ɂ͓��ɗL�p�ł��B</emphasis>
+ <emphasis> nullを許容するバージョンやタイムスタンプのプロパティを定義することは、
+ 過渡的に一時オブジェクトとすることを防ぐ簡単な方法です。
+ 特に識別子の割り当てや複合キーを使用しているときには特に有用です。</emphasis>
</para>
</sect2>
<sect2 id="mapping-declaration-timestamp"
revision="4">
- <title>timestamp�i�I�v�V�����j</title>
+ <title>timestamp(オプション)</title>
<para>
- �I�v�V������ <literal><timestamp></literal>
�v�f�́A
- �e�[�u�����^�C���X�^���v�f�[�^��܂ނ��Ƃ����܂��B
- ����̓o�[�W�����t���̑���̕��@�Ƃ��ėp�ӂ���Ă��܂��B
- �^�C���X�^���v�͂�Ƃ�Ɗy�ϓI���b�N�ɂ�������S���̒Ⴂ�����ł��B
- �������A�v���P�[�V�����͈قȂ�p�r�Ŏg�����Ƃ���邩�����܂���B
+ オプションの <literal><timestamp></literal> 要素は、
+ テーブルがタイムスタンプデータを含むことを示します。
+ これはバージョン付けの代わりの方法として用意されています。
+ タイムスタンプはもともと楽観的ロックにおける安全性の低い実装です。
+ しかしアプリケーションは異なる用途で使うこともあるかもしれません。
</para>
<programlistingco>
@@ -1265,66 +1266,66 @@
<calloutlist>
<callout arearefs="timestamp1">
<para>
- <literal>column</literal>�i�I�v�V���� -
�f�t�H���g�̓v���p�e�B���j�F
- �^�C���X�^���v��ێ�����J�����̖��O�B
+ <literal>column</literal>(オプション - デフォルトはプロパティ名):
+ タイムスタンプを保持するカラムの名前。
</para>
</callout>
<callout arearefs="timestamp2">
<para>
- <literal>name</literal> �F
- �i���N���X�ł���Java �� <literal>Date</literal >�^
�܂���
- <literal>Timestamp</literal> �^
�́AJavaBeans�X�^�C���v���p�e�B�̖��O�B
+ <literal>name</literal> :
+ 永続クラスであるJava の <literal>Date</literal >型 または
+ <literal>Timestamp</literal> 型
の、JavaBeansスタイルプロパティの名前。
</para>
</callout>
<callout arearefs="timestamp3">
<para>
<literal>access</literal>
- �i�I�v�V���� - �f�t�H���g��
<literal>property</literal> �j�F
- �v���p�e�B�̒l�ւ̃A�N�Z�X��Hibernate���g���헪�B
+ (オプション - デフォルトは <literal>property</literal> ):
+ プロパティの値へのアクセスにHibernateが使う戦略。
</para>
</callout>
<callout arearefs="timestamp4">
<para>
<literal>unsaved-value</literal>
- �i�I�v�V���� - �f�t�H���g��
<literal>null</literal> �j�F
- �C���X�^���X���V�����C���X�^���X�����ꂽ
- �i�Z�[�u����Ă��Ȃ��j���Ƃ����o�[�W�����v���p�e�B�̒l�B
- �ȑO��Session�ŃZ�[�u�܂��̓��[�h���ꂽ�ꎞ�I�ȃC���X�^���X��
- ��ʂ��邽�߂Ɏg���܂��B
- �i <literal>undefined</literal> �Ǝw�肷��ƁA
- ���ʎq�v���p�e�B�̒l���g���܂��B�j
+ (オプション - デフォルトは <literal>null</literal> ):
+ インスタンスが新しくインスタンス化された
+ (セーブされていない)ことを示すバージョンプロパティの値。
+ 以前のSessionでセーブまたはロードされた一時的なインスタンスと
+ 区別するために使われます。
+ ( <literal>undefined</literal> と指定すると、
+ 識別子プロパティの値が使われます。)
</para>
</callout>
<callout arearefs="timestamp5">
<para>
- <literal>source</literal> (�I�v�V���� -
�f�t�H���g�� <literal>vm</literal> ):
- Hibernate�͂ǂ�����^�C���X�^���v�̒l��擾����ׂ��ł��傤���H
- �f�[�^�x�[�X����ł��傤���A���݂�JVM����ł��傤���H
-
�f�[�^�x�[�X�ɂ��^�C���X�^���v�́AHibernate��"���̒l"���肷�邽�߂�
- �f�[�^�x�[�X��q�b�g���Ȃ���Ȃ�Ȃ����߁A�I�[�o�w�b�h�����܂��B
- �������N���X�^���ł�JVM����擾��������S�ł��B
- �f�[�^�x�[�X�̌��݂̃^�C���X�^���v�̎擾��T�|�[�g����
- ���ׂĂ� <literal>�f�[�^�x�[�X����</literal>
���m���Ă���킯�ł͂Ȃ����Ƃ�
- ���ӂ��Ă��������B�܂�����ŁA�������������߂ɁA
- ���b�N�Ŏg�p����ɂ͈��S�łȂ���̂����܂�(�Ⴆ��Oracle 8)�B
+ <literal>source</literal> (オプション - デフォルトは
<literal>vm</literal> ):
+ Hibernateはどこからタイムスタンプの値を取得するべきでしょうか?
+ データベースからでしょうか、現在のJVMからでしょうか?
+ データベースによるタイムスタンプは、Hibernateが"次の値"を決定するために
+ データベースをヒットしなければならないため、オーバヘッドを招きます。
+ しかしクラスタ環境ではJVMから取得するより安全です。
+ データベースの現在のタイムスタンプの取得をサポートする
+ すべての <literal>データベース方言</literal>
が知られているわけではないことに
+ 注意してください。また一方で、精密さを欠くために、
+ ロックで使用するには安全でないものもあります(例えばOracle 8)。
</para>
</callout>
<callout arearefs="timestamp6">
<para>
- <literal>generated</literal> (�I�v�V���� -
�f�t�H���g�� <literal>never</literal> ):
-
���̃^�C���X�^���v�E�v���p�e�B�̒l���A�f�[�^�x�[�X�ɂ���Đ�������邱�Ƃ�w�肵�܂��B
- <xref
linkend="mapping-generated">�����v���p�e�B</xref> ��Q�Ƃ��Ă��������B
+ <literal>generated</literal> (オプション - デフォルトは
<literal>never</literal> ):
+ このタイムスタンプ・プロパティの値が、データベースによって生成されることを指定します。
+ <xref
linkend="mapping-generated">生成プロパティ</xref> を参照してください。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- <literal><timestamp></literal> ��
- <literal><version
type="timestamp"></literal> �Ɠ����ł��邱�Ƃɒ��ӂ��Ă��������B
- <literal><timestamp
source="db"></literal> ��
- <literal><version
type="dbtimestamp"></literal> �Ɠ����ł��邱�Ƃɒ��ӂ��Ă��������B
+ <literal><timestamp></literal> は
+ <literal><version
type="timestamp"></literal> と等価であることに注意してください。
+ <literal><timestamp
source="db"></literal> は
+ <literal><version
type="dbtimestamp"></literal> と等価であることに注意してください。
</para>
</sect2>
@@ -1332,7 +1333,7 @@
<title>property</title>
<para>
- <literal><property></literal>
�v�f�́A�N���X�̉i���I��JavaBean�X�^�C���̃v���p�e�B���`���܂��B
+ <literal><property></literal>
要素は、クラスの永続的なJavaBeanスタイルのプロパティを定義します。
</para>
<programlistingco>
@@ -1375,135 +1376,135 @@
<calloutlist>
<callout arearefs="property1">
<para>
-
<literal>name</literal>�F�������Ŏn�܂�v���p�e�B���B
+ <literal>name</literal>:小文字で始まるプロパティ名。
</para>
</callout>
<callout arearefs="property2">
<para>
- <literal>column</literal>�i�I�v�V���� -
�f�t�H���g�̓v���p�e�B���j�F
- �}�b�s���O���ꂽ�f�[�^�x�[�X�e�[�u���̃J�����̖��O�B
- �l�X�g����
<literal><column></literal> �v�f�ł�w��ł��܂��B
+ <literal>column</literal>(オプション - デフォルトはプロパティ名):
+ マッピングされたデータベーステーブルのカラムの名前。
+ ネストした <literal><column></literal>
要素でも指定できます。
</para>
</callout>
<callout arearefs="property3">
<para>
-
<literal>type</literal>�i�I�v�V�����j�FHibernate�̌^�������O�B
+ <literal>type</literal>(オプション):Hibernateの型を示す名前。
</para>
</callout>
<callout arearefs="property4-5">
<para>
<literal>update, insert</literal>
- �i�I�v�V���� - �f�t�H���g��
<literal>true</literal> �j�F
- �}�b�s���O���ꂽ�J������SQL��
- <literal>UPDATE</literal> ��
<literal>INSERT</literal> �Ɋ܂܂�邱�Ƃ�w�肵�܂��B
- �����Ƃ� <literal>false</literal> �ɐݒ肷��ƁA
- �����J�����Ƀ}�b�s���O���ꂽ���̃v���p�e�B��g���K��
-
���̃A�v���P�[�V�����ɂ���ď��������ꂽ�����ȁu���o�v�v���p�e�B���\�ɂȂ�܂��B
+ (オプション - デフォルトは <literal>true</literal> ):
+ マッピングされたカラムがSQLの
+ <literal>UPDATE</literal> や
<literal>INSERT</literal> に含まれることを指定します。
+ 両方とも <literal>false</literal> に設定すると、
+ 同じカラムにマッピングされた他のプロパティやトリガや
+ 他のアプリケーションによって初期化された純粋な「導出」プロパティが可能になります。
</para>
</callout>
<callout arearefs="property6">
<para>
- <literal>formula</literal>�i�I�v�V�����j�F
- <emphasis>�v�Z</emphasis>
�v���p�e�B�̂��߂̒l���`����SQL���B
- �v�Z���ꂽ�v���p�e�B�͎��g�̃J�����ւ̃}�b�s���O������܂���B
+ <literal>formula</literal>(オプション):
+ <emphasis>計算</emphasis> プロパティのための値を定義するSQL式。
+ 計算されたプロパティは自身のカラムへのマッピングがありません。
</para>
</callout>
<callout arearefs="property7">
<para>
- <literal>access</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>property</literal> �j�F
- �v���p�e�B�̒l�ւ̃A�N�Z�X��Hibernate���g���헪�B
+ <literal>access</literal>(オプション - デフォルトは
<literal>property</literal> ):
+ プロパティの値へのアクセスにHibernateが使う戦略。
</para>
</callout>
<callout arearefs="property8">
<para>
- <literal>lazy</literal> (optional - �f�t�H���g��
<literal>false</literal> ):
-
�C���X�^���X�ϐ��ɍŏ��ɃA�N�Z�X�����Ƃ��ɁA�v���p�e�B��x�����Ď擾����悤�w�肵�܂��B
- (�o�C�g�R�[�h������쐬���鎞�Ԃ��K�v�ɂȂ�܂�)�B
+ <literal>lazy</literal> (optional - デフォルトは
<literal>false</literal> ):
+ インスタンス変数に最初にアクセスしたときに、プロパティを遅延して取得するよう指定します。
+ (バイトコード実装を作成する時間が必要になります)。
</para>
</callout>
<callout arearefs="property9">
<para>
- <literal>unique</literal>
(�I�v�V����):�J�����Ƀ��j�[�N��������DDL�̐�����\�ɂ��܂��B
- �܂��A<literal>property-ref</literal>
�̃^�[�Q�b�g�Ƃ��邱�Ƃ�ł��܂��B
+ <literal>unique</literal>
(オプション):カラムにユニーク制約をつけるDDLの生成を可能にします。
+ また、<literal>property-ref</literal>
のターゲットとすることもできます。
</para>
</callout>
<callout arearefs="property10">
<para>
- <literal>not-null</literal>
(�I�v�V����):�J������null�l������DDL�̐�����\�ɂ��܂��B
+ <literal>not-null</literal>
(オプション):カラムにnull値を許可するDDLの生成を可能にします。
</para>
</callout>
<callout arearefs="property11">
<para>
- <literal>optimistic-lock</literal> (�I�v�V���� -
�f�t�H���g�� <literal>true</literal> ):
- ���̃v���p�e�B�̍X�V�Ɋy�σ��b�N�̎擾��v�����邩�ǂ�����w�肵�܂��B
-
����������A���̃v���p�e�B���_�[�e�B�ł���Ƃ��Ƀo�[�W�����𑝂₷�ׂ������肵�܂��B
+ <literal>optimistic-lock</literal> (オプション -
デフォルトは <literal>true</literal> ):
+ このプロパティの更新に楽観ロックの取得を要求するかどうかを指定します。
+ 言い換えれば、このプロパティがダーティであるときにバージョンを増やすべきかを決定します。
</para>
</callout>
<callout arearefs="property12">
<para>
- <literal>generated</literal> (�I�v�V���� -
�f�t�H���g�� <literal>never</literal> ):
- �v���p�e�B�̒l���A�f�[�^�x�[�X�ɂ���Đ������ꂽ���Ƃ�w�肵�܂��B
- <xref
linkend="mapping-generated">�����v���p�e�B</xref> ��Q�Ƃ��Ă��������B
+ <literal>generated</literal> (オプション - デフォルトは
<literal>never</literal> ):
+ プロパティの値が、データベースによって生成されたことを指定します。
+ <xref
linkend="mapping-generated">生成プロパティ</xref> を参照してください。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- <emphasis>typename</emphasis> �ɂ͈ȉ��̒l���\�ł��F
+ <emphasis>typename</emphasis> には以下の値が可能です:
</para>
<orderedlist spacing="compact">
<listitem>
<para>
- Hibernate�̊�{�^�̖��O�i�� <literal>integer, string,
character,
- date, timestamp, float, binary, serializable, object,
blob</literal> �j�B
+ Hibernateの基本型の名前(例 <literal>integer, string, character,
+ date, timestamp, float, binary, serializable, object,
blob</literal> )。
</para>
</listitem>
<listitem>
<para>
- �f�t�H���g�̊�{�^��Java�N���X�� �i�� <literal>int, float,
- char, java.lang.String, java.util.Date, java.lang.Integer,
java.sql.Clob</literal> �j�B
+ デフォルトの基本型のJavaクラス名 (例 <literal>int, float,
+ char, java.lang.String, java.util.Date, java.lang.Integer,
java.sql.Clob</literal> )。
</para>
</listitem>
<listitem>
<para>
- �V���A���C�Y�\��Java�N���X�̖��O�B
+ シリアライズ可能なJavaクラスの名前。
</para>
</listitem>
<listitem>
<para>
- �J�X�^���^�̃N���X���i��
<literal>com.illflow.type.MyCustomType</literal> �j�B
+ カスタム型のクラス名(例
<literal>com.illflow.type.MyCustomType</literal> )。
</para>
</listitem>
</orderedlist>
<para>
- �^��w�肵�Ȃ���AHibernate�͐�����Hibernate�̌^�𐄑����邽�߂ɁA
- �w�肳�ꂽ�v���p�e�B�ɑ��ă��t���N�V������g���܂��B
- Hibernate�̓��[��2, 3, 4���̏����Ɏg���A
- getter�v���p�e�B�̕Ԃ�l�̃N���X�̖��O���߂��悤�Ƃ��܂��B
- ����������ŏ�ɏ\���ł���Ƃ͌���܂���B
- �ꍇ�ɂ���ẮA<literal>type</literal> �������K�v�ȏꍇ������܂��B
- �i�Ⴆ�� <literal>Hibernate.DATE</literal> ��
<literal>Hibernate.TIMESTAMP</literal> ���ʂ��邽�߁A
- �܂��̓J�X�^���^��w�肷�邽�߂Ȃǂł��B�j
+ 型を指定しなければ、Hibernateは正しいHibernateの型を推測するために、
+ 指定されたプロパティに対してリフレクションを使います。
+ Hibernateはルール2, 3, 4をその順序に使い、
+ getterプロパティの返り値のクラスの名前を解釈しようとします。
+ しかしこれで常に十分であるとは限りません。
+ 場合によっては、<literal>type</literal> 属性が必要な場合があります。
+ (例えば <literal>Hibernate.DATE</literal> と
<literal>Hibernate.TIMESTAMP</literal> を区別するため、
+ またはカスタム型を指定するためなどです。)
</para>
<para>
- <literal>access</literal> �����ŁA
- ���s����Hibernate���ǂ̂悤�Ƀv���p�e�B�ɃA�N�Z�X���邩�𐧌�ł��܂��B
- �f�t�H���g�ł�Hibernate�̓v���p�e�B��get/set�̃y�A��R�[�����܂��B
- <literal>access="field"</literal> �Ǝw�肷��A
-
Hibernate�̓��t���N�V������g��get/set�̃y�A�����ɁA���ڃt�B�[���h�ɃA�N�Z�X���܂��B
- �C���^�[�t�F�C�X
<literal>org.hibernate.property.PropertyAccessor</literal> ��
- ��������N���X��w�肷�邱�ƂŁA�v���p�e�B�ւ̃A�N�Z�X�ɓƎ��̐헪��w�肷�邱�Ƃ��ł��܂��B
+ <literal>access</literal> 属性で、
+ 実行時にHibernateがどのようにプロパティにアクセスするかを制御できます。
+ デフォルトではHibernateはプロパティのget/setのペアをコールします。
+ <literal>access="field"</literal> と指定すれば、
+ Hibernateはリフレクションを使いget/setのペアを介さずに、直接フィールドにアクセスします。
+ インターフェイス
<literal>org.hibernate.property.PropertyAccessor</literal> を
+ 実装するクラスを指定することで、プロパティへのアクセスに独自の戦略を指定することができます。
</para>
<para>
- ���ɋ��͂ȓ����͐����v���p�e�B�ł��B
- �����̃v���p�e�B�͓��R�ǂݎ���p�ł���A�v���p�e�B�̒l�̓��[�h���Ɍv�Z����܂��B
- �v�Z��SQL���Ƃ��Đ錾����ƁA���̃v���p�e�B��
- �C���X�^���X���[�h����SQL�N�G���� <literal>SELECT</literal>
��̃T�u�N�G���ɕϊ�����܂��B
+ 特に強力な特徴は生成プロパティです。
+ これらのプロパティは当然読み取り専用であり、プロパティの値はロード時に計算されます。
+ 計算をSQL式として宣言すると、このプロパティは
+ インスタンスをロードするSQLクエリの <literal>SELECT</literal>
句のサブクエリに変換されます。
</para>
<programlisting><![CDATA[
@@ -1514,10 +1515,10 @@
AND li.orderNumber = orderNumber
)"/>]]></programlisting>
<para>
- ����̃J����(��ł� <literal>customerId</literal>
������ɂ�����܂�)�̃G�C���A�X��錾���邱�ƂȂ��A
- �G���e�B�e�B���g�̃e�[�u����Q�Ƃł��邱�Ƃɒ��ӂ��Ă��������B
- ���������g�p�������Ȃ���A
- �l�X�g���� <literal><formula></literal>
�}�b�s���O�v�f��g���邱�Ƃɂ���ӂ��Ă��������B
+ 特定のカラム(例では <literal>customerId</literal>
がそれにあたります)のエイリアスを宣言することなく、
+ エンティティ自身のテーブルを参照できることに注意してください。
+ もし属性を使用したくなければ、
+ ネストした <literal><formula></literal>
マッピング要素を使えることにも注意してください。
</para>
</sect2>
@@ -1526,9 +1527,9 @@
<title>many-to-one</title>
<para>
- ���̉i���N���X�ւ̒ʏ�̊֘A�� <literal>many-to-one</literal>
�v�f��g���Ē�`���܂��B
- �����[�V���i�����f���͑��Έ�֘A�ł��B
- �܂肠��e�[�u���̊O���L�[�́A�^�[�Q�b�g�ƂȂ�e�[�u���̎�L�[�J������Q�Ƃ��Ă��܂��B
+ 他の永続クラスへの通常の関連は <literal>many-to-one</literal> 要素を使って定義します。
+ リレーショナルモデルは多対一関連です。
+ つまりあるテーブルの外部キーは、ターゲットとなるテーブルの主キーカラムを参照しています。
</para>
<programlistingco>
@@ -1578,156 +1579,156 @@
<calloutlist>
<callout arearefs="manytoone1">
<para>
- <literal>name</literal>�F�v���p�e�B���B
+ <literal>name</literal>:プロパティ名。
</para>
</callout>
<callout arearefs="manytoone2">
<para>
- <literal>column</literal>
(�I�v�V����):�O���L�[�J�����̖��O�B
- �l�X�g����
<literal><column></literal> �v�f�ł�w��ł��܂��B
+ <literal>column</literal> (オプション):外部キーカラムの名前。
+ ネストした <literal><column></literal>
要素でも指定できます。
</para>
</callout>
<callout arearefs="manytoone3">
<para>
- <literal>class</literal>�i�I�v�V���� -
�f�t�H���g�́A
- ���t���N�V�����ɂ�茈�肳���v���p�e�B�̌^�j�F�֘A�N���X�̖��O�B
+ <literal>class</literal>(オプション - デフォルトは、
+ リフレクションにより決定されるプロパティの型):関連クラスの名前。
</para>
</callout>
<callout arearefs="manytoone4">
<para>
- <literal>cascade</literal>�i�I�v�V�����j�F
-
�ǂ̑����A�e�I�u�W�F�N�g����֘A�I�u�W�F�N�g�ւƃJ�X�P�[�h�����邩��w�肵�܂��B
+ <literal>cascade</literal>(オプション):
+ どの操作を、親オブジェクトから関連オブジェクトへとカスケードさせるかを指定します。
</para>
</callout>
<callout arearefs="manytoone5">
<para>
- <literal>fetch</literal> (�I�v�V���� -
�f�t�H���g�� <literal>select</literal> ):
- �O�������t�F�b�`�������I��t�F�b�`�isequential select
fetch�j��I���܂��B
+ <literal>fetch</literal> (オプション - デフォルトは
<literal>select</literal> ):
+ 外部結合フェッチか順次選択フェッチ(sequential select fetch)を選択します。
</para>
</callout>
<callout arearefs="manytoone6-7">
<para>
- <literal>update, insert</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>true</literal> �j�F
- �}�b�s���O���ꂽ�J������SQL��
<literal>UPDATE</literal> �܂���
- <literal>INSERT</literal> ���Ɋ܂܂�邱�Ƃ�w�肵�܂��B
- �����Ƃ� <literal>false</literal> �ɐݒ肷��ƁA
- ���̒l�������J�����Ƀ}�b�s���O���ꂽ���̃v���p�e�B��g���K��
-
���̃A�v���P�[�V�����ɂ���ď��������ꂽ�����ȁu���o�v�v���p�e�B���\�ɂȂ�܂��B
+ <literal>update, insert</literal>(オプション - デフォルトは
<literal>true</literal> ):
+ マッピングされたカラムがSQLの <literal>UPDATE</literal> または
+ <literal>INSERT</literal> 文に含まれることを指定します。
+ 両方とも <literal>false</literal> に設定すると、
+ その値が同じカラムにマッピングされた他のプロパティやトリガや
+ 他のアプリケーションによって初期化された純粋な「導出」プロパティが可能になります。
</para>
</callout>
<callout arearefs="manytoone8">
<para>
- <literal>property-ref</literal>�i�I�v�V�����j�F
- ���̊O���L�[�Ɍ������ꂽ�֘A�N���X�̃v���p�e�B���B
- ����w�肵�Ȃ���A�֘A�N���X�̎�L�[���g���܂��B
+ <literal>property-ref</literal>(オプション):
+ この外部キーに結合された関連クラスのプロパティ名。
+ 何も指定しなければ、関連クラスの主キーが使われます。
</para>
</callout>
<callout arearefs="manytoone9">
<para>
- <literal>access</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>property</literal> �j�F
- �v���p�e�B�̒l�ւ̃A�N�Z�X��Hibernate���g���헪�B
+ <literal>access</literal>(オプション - デフォルトは
<literal>property</literal> ):
+ プロパティの値へのアクセスにHibernateが使う戦略。
</para>
</callout>
<callout arearefs="manytoone10">
<para>
- <literal>unique</literal>�i�I�v�V�����j�F
- �O���L�[�J�����ɑ��ă��j�[�N��������DDL�̐�����\�ɂ��܂��B
- �܂��A<literal>property-ref</literal>
�̃^�[�Q�b�g�ɂ��邱�Ƃ�ł��܂��B
- ����ɂ��֘A�̑��d�x����ʓI�Ɉ�Έ�ɂ��܂��B
+ <literal>unique</literal>(オプション):
+ 外部キーカラムに対してユニーク制約をつけたDDLの生成を可能にします。
+ また、<literal>property-ref</literal>
のターゲットにすることもできます。
+ これにより関連の多重度を効果的に一対一にします。
</para>
</callout>
<callout arearefs="manytoone11">
<para>
- <literal>not-null</literal>
(�I�v�V����):�O���L�[�J�����ɑ��āA
- null�l������DDL�̐�����\�ɂ��܂�
+ <literal>not-null</literal> (オプション):外部キーカラムに対して、
+ null値を許可するDDLの生成を可能にします
</para>
</callout>
<callout arearefs="manytoone12">
<para>
- <literal>optimistic-lock</literal> (�I�v�V���� -
�f�t�H���g�� <literal>true</literal> ):
- ���̃v���p�e�B�̍X�V�Ɋy�ϓI���b�N�̎擾��v�����邩�ǂ�����w�肵�܂��B
-
����������A���̃v���p�e�B���_�[�e�B�ł���Ƃ��Ƀo�[�W�����𑝂₷�ׂ������肵�܂��B
+ <literal>optimistic-lock</literal> (オプション -
デフォルトは <literal>true</literal> ):
+ このプロパティの更新に楽観的ロックの取得を要求するかどうかを指定します。
+ 言い換えれば、このプロパティがダーティであるときにバージョンを増やすべきかを決定します。
</para>
</callout>
<callout arearefs="manytoone13">
<para>
- <literal>lazy</literal> (�I�v�V���� -
�f�t�H���g�� <literal>proxy</literal> ):
- �f�t�H���g�ł́A���d�x�P�̊֘A���v���L�V�ƂȂ�܂��B
- <literal>lazy="no-proxy"</literal>
�́A�C���X�^���X�ϐ��ɍŏ��ɃA�N�Z�X�����Ƃ��ɁA
- �v���p�e�B��x���t�F�b�`����悤�w�肵�܂�
- (�r���h���Ƀo�C�g�R�[�h�������K�v�ɂȂ�܂�)�B
- <literal>lazy="false"</literal>
�͊֘A���ɑ����Ƀt�F�b�`����悤�w�肵�܂��B
+ <literal>lazy</literal> (オプション - デフォルトは
<literal>proxy</literal> ):
+ デフォルトでは、多重度1の関連がプロキシとなります。
+ <literal>lazy="no-proxy"</literal>
は、インスタンス変数に最初にアクセスしたときに、
+ プロパティを遅延フェッチするよう指定します
+ (ビルド時にバイトコード実装が必要になります)。
+ <literal>lazy="false"</literal>
は関連を常に即時にフェッチするよう指定します。
</para>
</callout>
<callout arearefs="manytoone14">
<para>
- <literal>not-found</literal> (�I�v�V���� -
�f�t�H���g�� <literal>exception</literal> ):
- ���������s��Q�Ƃ���O���L�[��ǂ̂悤�Ɉ�������w�肵�܂��B
- <literal>ignore</literal>
�͌��������s��null�֘A�Ƃ��Ĉ����܂��B
+ <literal>not-found</literal> (オプション - デフォルトは
<literal>exception</literal> ):
+ 欠落した行を参照する外部キーをどのように扱うかを指定します。
+ <literal>ignore</literal> は欠落した行をnull関連として扱います。
</para>
</callout>
<callout arearefs="manytoone15">
<para>
- <literal>entity-name</literal>
(�I�v�V����):�֘A�����N���X�̃G���e�B�e�B���B
+ <literal>entity-name</literal>
(オプション):関連したクラスのエンティティ名。
</para>
</callout>
</calloutlist>
<callout arearefs="manytoone16">
<para>
- <literal>formula</literal> (�I�v�V����):
- <emphasis> �v�Z���ꂽ</emphasis>
�O���L�[�ɑ��Ēl���`����SQL��
+ <literal>formula</literal> (オプション):
+ <emphasis> 計算された</emphasis> 外部キーに対して値を定義するSQL式
</para>
</callout>
</programlistingco>
<para>
- <literal>cascade</literal> ������
<literal>none</literal> �ȊO�̈Ӗ��̂���l���ݒ肷��ƁA
- �֘A�I�u�W�F�N�g�ւ��鑀�삪�`�d���邱�ƂɂȂ�܂��B
- �Ӗ��̂���l�Ƃ�Hibernate�̊�{����̖��O�̂��ƂŁA
- <literal>delete-orphan</literal> ��
<literal>all</literal> �A���얼��J���}�ŋ�����g�ݍ��킹
- �i�Ⴆ��
<literal>cascade="persist,merge,evict"</literal> ��
- <literal>cascade="all,delete-orphan"</literal>�j�A
- �܂����ꂾ���łȂ� <literal>persist, merge, delete, save-update, evict,
replicate, lock,
- refresh</literal> �̂��Ƃ�w���܂��B
- �ڂ�������� <xref linkend="objectstate-transitive"/>
�����������B
- �l����̊֘A(many-to-one��one-to-one�֘A)�́A
- �P�Ƃł̍폜�iorphan delete)��T�|�[�g���Ă��Ȃ����Ƃɒ��ӂ��Ă��������B
+ <literal>cascade</literal> 属性に
<literal>none</literal> 以外の意味のある値をを設定すると、
+ 関連オブジェクトへある操作が伝播することになります。
+ 意味のある値とはHibernateの基本操作の名前のことで、
+ <literal>delete-orphan</literal> と
<literal>all</literal> 、操作名をカンマで区切った組み合わせ
+ (例えば
<literal>cascade="persist,merge,evict"</literal> や
+ <literal>cascade="all,delete-orphan"</literal>)、
+ またそれだけでなく <literal>persist, merge, delete, save-update, evict,
replicate, lock,
+ refresh</literal> のことを指します。
+ 詳しい説明は <xref linkend="objectstate-transitive"/> を見てください。
+ 値が一つの関連(many-to-oneとone-to-one関連)は、
+ 単独での削除(orphan delete)をサポートしていないことに注意してください。
</para>
<para>
- �T�^�I�� <literal>many-to-one</literal>
�錾�͎��̂悤�ɃV���v���ł��B�F
+ 典型的な <literal>many-to-one</literal> 宣言は次のようにシンプルです。:
</para>
<programlisting><![CDATA[<many-to-one name="product"
class="Product" column="PRODUCT_ID"/>]]></programlisting>
<para>
- <literal>property-ref</literal>
�����́A�O���L�[���֘A�t����ꂽ�e�[�u���́A��L�[�łȂ�
- ���j�[�N�L�[��Q�Ƃ��Ă��郌�K�V�[�f�[�^��}�b�v���邽�߂ɂ����g���ׂ��ł��B
- ����͏X�������[�V���i�����f���ł��B
- �Ⴆ�� <literal>Product</literal> �N���X���A
- ��L�[�łȂ����j�[�N�ȃV���A���i���o�[�����Ă���Ɖ��肵�Ă݂Ă��������B
- �i <literal>unique</literal>
������SchemaExport�c�[����g����Hibernate��DDL�����𐧌䂵�܂��B�j
+ <literal>property-ref</literal> 属性は、外部キーが関連付けられたテーブルの、主キーでない
+ ユニークキーを参照しているレガシーデータをマップするためにだけ使うべきです。
+ これは醜いリレーショナルモデルです。
+ 例えば <literal>Product</literal> クラスが、
+ 主キーでないユニークなシリアルナンバーを持っていると仮定してみてください。
+ ( <literal>unique</literal>
属性はSchemaExportツールを使ったHibernateのDDL生成を制御します。)
</para>
<programlisting><![CDATA[<property name="serialNumber"
unique="true" type="string"
column="SERIAL_NUMBER"/>]]></programlisting>
<para>
- �ȉ��̂悤�� <literal>OrderItem</literal>
�ɑ��ă}�b�s���O��g���܂��F
+ 以下のように <literal>OrderItem</literal> に対してマッピングを使えます:
</para>
<programlisting><![CDATA[<many-to-one name="product"
property-ref="serialNumber"
column="PRODUCT_SERIAL_NUMBER"/>]]></programlisting>
<para>
- �������A����͌����Đ����ł��܂���B
+ しかし、これは決して推奨できません。
</para>
<para>
- �Q�Ƃ������j�[�N�L�[���A�֘A����G���e�B�e�B�̑����̃v���p�e�B����\�������ꍇ�A
- �w�肵�� <literal><properties></literal>
�v�f��ŁA�Q�Ƃ���v���p�e�B��}�b�s���O����ׂ��ł��B
+ 参照したユニークキーが、関連するエンティティの多数のプロパティから構成される場合、
+ 指定した <literal><properties></literal>
要素内で、参照するプロパティをマッピングするべきです。
</para>
<para>
-
����Q�Ƃ������j�[�N�L�[���R���|�[�l���g�̃v���p�e�B�ł���ꍇ�́A�v���p�e�B�̃p�X��w��ł��܂��B
+ もし参照したユニークキーがコンポーネントのプロパティである場合は、プロパティのパスを指定できます。
</para>
<programlisting><![CDATA[<many-to-one name="owner"
property-ref="identity.ssn"
column="OWNER_SSN"/>]]></programlisting>
@@ -1740,7 +1741,7 @@
<title>one-to-one</title>
<para>
- ���̉i���N���X�ւ̈�Έ�֘A�́A<literal>one-to-one</literal>
�v�f�Œ�`���܂��B
+ 他の永続クラスへの一対一関連は、<literal>one-to-one</literal> 要素で定義します。
</para>
<programlistingco>
@@ -1774,112 +1775,112 @@
<calloutlist>
<callout arearefs="onetoone1">
<para>
- <literal>name</literal>�F�v���p�e�B���B
+ <literal>name</literal>:プロパティ名。
</para>
</callout>
<callout arearefs="onetoone2">
<para>
- <literal>class</literal>�i�I�v�V���� -
- �f�t�H���g�̓��t���N�V�����ɂ�茈�肳���v���p�e�B�̌^�j�F
- �֘A�N���X�̖��O�B
+ <literal>class</literal>(オプション -
+ デフォルトはリフレクションにより決定されるプロパティの型):
+ 関連クラスの名前。
</para>
</callout>
<callout arearefs="onetoone3">
<para>
- <literal>cascade</literal>�i�I�v�V�����j�F
-
�e�I�u�W�F�N�g����֘A�I�u�W�F�N�g�ցA�ǂ̑����J�X�P�[�h���邩��w�肵�܂��B
+ <literal>cascade</literal>(オプション):
+ 親オブジェクトから関連オブジェクトへ、どの操作をカスケードするかを指定します。
</para>
</callout>
<callout arearefs="onetoone4">
<para>
- <literal>constrained</literal>�i�I�v�V�����j�F
- �}�b�s���O���ꂽ�e�[�u���̎�L�[�ɑ���O���L�[���A
- �֘A�N���X�̃e�[�u����Q�Ƃ��邱�Ƃ�w�肵�܂��B
- ���̃I�v�V������ <literal>save()</literal> ��
- <literal>delete()</literal>
���J�X�P�[�h����鏇���ɉe�����A
- �����Ċ֘A���v���L�V����邩�ǂ����ɂ�e�����܂�
- �i�����ăX�L�[�}�G�N�X�|�[�g�c�[���ɂ�g���܂��j�B
+ <literal>constrained</literal>(オプション):
+ マッピングされたテーブルの主キーに対する外部キー制約が、
+ 関連クラスのテーブルを参照することを指定します。
+ このオプションは <literal>save()</literal> と
+ <literal>delete()</literal> がカスケードされる順序に影響し、
+ そして関連がプロキシされるかどうかにも影響します
+ (そしてスキーマエクスポートツールにも使われます)。
</para>
</callout>
<callout arearefs="onetoone5">
<para>
- <literal>fetch</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>select</literal> �j�F
- �O�������t�F�b�`�Ə����I��t�F�b�`�isequential select
fetch�j�̂ǂ��炩��I���܂��B
+ <literal>fetch</literal>(オプション - デフォルトは
<literal>select</literal> ):
+ 外部結合フェッチと順次選択フェッチ(sequential select fetch)のどちらかを選択します。
</para>
</callout>
<callout arearefs="onetoone6">
<para>
- <literal>property-ref</literal>�i�I�v�V�����j�F
- ���̃N���X�̎�L�[�Ɍ������ꂽ�֘A�N���X�̃v���p�e�B���B
- �w�肳��Ȃ���A�֘A�N���X�̎�L�[���g���܂��B
+ <literal>property-ref</literal>(オプション):
+ このクラスの主キーに結合された関連クラスのプロパティ名。
+ 指定されなければ、関連クラスの主キーが使われます。
</para>
</callout>
<callout arearefs="onetoone7">
<para>
- <literal>access</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>property</literal> �j�F
- �v���p�e�B�̒l�ւ̃A�N�Z�X��Hibernate���g���헪�B
+ <literal>access</literal>(オプション - デフォルトは
<literal>property</literal> ):
+ プロパティの値へのアクセスにHibernateが使う戦略。
</para>
</callout>
<callout arearefs="onetoone8">
<para>
- <literal>formula</literal> (�I�v�V����):
-
�قƂ�ǂ��ׂĂ̈�Έ�֘A�̓I�[�i�[�̃G���e�B�e�B�̎�L�[�ւƃ}�b�s���O����܂��B
- ����ȊO�̋H�ȏꍇ�́A
-
���̃J������A�����̃J�����ASQL�\����g�����������邽�߂̎���w��ł��܂��B
- �i���
<literal>org.hibernate.test.onetooneformula</literal> ��Q�Ƃ��Ă��������B�j
+ <literal>formula</literal> (オプション):
+ ほとんどすべての一対一関連はオーナーのエンティティの主キーへとマッピングされます。
+ これ以外の稀な場合は、
+ 他のカラムや、複数のカラム、SQL構文を使った結合するための式を指定できます。
+ (例は
<literal>org.hibernate.test.onetooneformula</literal> を参照してください。)
</para>
</callout>
<callout arearefs="onetoone9">
<para>
- <literal>lazy</literal> (�I�v�V���� -
�f�t�H���g�� <literal>proxy</literal> ):
- �f�t�H���g�ł́A���d�x�P�̊֘A���v���L�V�ƂȂ�܂��B
- <literal>lazy="no-proxy"</literal>
�́A�C���X�^���X�ϐ��ɍŏ��ɃA�N�Z�X�����Ƃ��ɁA
- �v���p�e�B��x���t�F�b�`����悤�w�肵�܂�
- (�r���h���Ƀo�C�g�R�[�h�������K�v�ɂȂ�܂�)�B
- <literal>lazy="false"</literal>
�͊֘A���ɑ����Ƀt�F�b�`����悤�w�肵�܂��B
- <emphasis>���
<literal>constrained="false"</literal> �Ȃ�A
-
�v���L�V�͎g�p�s�\�ƂȂ�A�֘A���Ƀt�F�b�`���邱�Ƃɒ��ӂ��Ă��������I</emphasis>
+ <literal>lazy</literal> (オプション - デフォルトは
<literal>proxy</literal> ):
+ デフォルトでは、多重度1の関連がプロキシとなります。
+ <literal>lazy="no-proxy"</literal>
は、インスタンス変数に最初にアクセスしたときに、
+ プロパティを遅延フェッチするよう指定します
+ (ビルド時にバイトコード実装が必要になります)。
+ <literal>lazy="false"</literal>
は関連を常に即時にフェッチするよう指定します。
+ <emphasis>もし
<literal>constrained="false"</literal> ならば、
+ プロキシは使用不可能となり、関連を即時にフェッチすることに注意してください!</emphasis>
</para>
</callout>
<callout arearefs="onetoone10">
<para>
- <literal>entity-name</literal>
(�I�v�V����):�֘A�N���X�̃G���e�B�e�B��
+ <literal>entity-name</literal>
(オプション):関連クラスのエンティティ名
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- ��Έ�֘A�ɂ�2��ނ���܂��F
+ 一対一関連には2種類あります:
</para>
<itemizedlist>
<listitem><para>
- ��L�[�֘A
+ 主キー関連
</para></listitem>
<listitem><para>
- ���j�[�N�O���L�[�֘A
+ ユニーク外部キー関連
</para></listitem>
</itemizedlist>
<para>
- ��L�[�֘A�ɂ́A���ʂȃe�[�u���J�����͕K�v����܂���B
- ���2�̍s���֘A�ɂ��W���Ă���A2�̃e�[�u���͓�����L�[�̒l���L���܂��B
- ���̂���2�̃I�u�W�F�N�g���L�[�֘A�ɂ���Ċ֘A�t�������̂ł���A
- �m���ɓ������ʎq�̒l�������Ȃ���Ȃ�܂���B
+ 主キー関連には、特別なテーブルカラムは必要ありません。
+ もし2つの行が関連により関係していれば、2つのテーブルは同じ主キーの値を共有します。
+ そのため2つのオブジェクトを主キー関連によって関連付けたいのであれば、
+ 確実に同じ識別子の値を代入しなければなりません。
</para>
<para>
- ��L�[�֘A��s�����߂ɂ́A�ȉ��̃}�b�s���O��
<literal>Employee</literal> ��
- <literal>Person</literal> �̂��ꂼ��ɒlj����Ă��������B
+ 主キー関連を行うためには、以下のマッピングを <literal>Employee</literal> と
+ <literal>Person</literal> のそれぞれに追加してください。
</para>
<programlisting><![CDATA[<one-to-one name="person"
class="Person"/>]]></programlisting>
<programlisting><![CDATA[<one-to-one name="employee"
class="Employee" constrained="true"/>]]></programlisting>
<para>
-
�����ŁAPERSON��EMPLOYEE�e�[�u���̊W����s�̎�L�[�������ł��邱�Ƃ�m���ɂ��Ȃ�������܂���B
- �����ł́A<literal>foreign</literal>
�Ƃ��������Hibernate���ʎq�����헪��g���܂��F
+ ここで、PERSONとEMPLOYEEテーブルの関係する行の主キーが同じであることを確実にしなければいけません。
+ ここでは、<literal>foreign</literal> という特殊なHibernate識別子生成戦略を使います:
</para>
<programlisting><![CDATA[<class name="person"
table="PERSON">
@@ -1895,25 +1896,25 @@
</class>]]></programlisting>
<para>
- <literal>Employee</literal>
�C���X�^���X���A<literal>Person</literal> ��
- <literal>employee</literal> �v���p�e�B�ŎQ�Ƃ����悤�ɁA
- �V�����Z�[�u���ꂽ <literal>Person</literal>
�̃C���X�^���X�ɂ͓�����L�[�̒l���������܂��B
+ <literal>Employee</literal>
インスタンスが、<literal>Person</literal> の
+ <literal>employee</literal> プロパティで参照されるように、
+ 新しくセーブされた <literal>Person</literal> のインスタンスには同じ主キーの値が代入されます。
- �V�����Z�[�u���� <literal>Person</literal> �C���X�^���X�́A
- ���� <literal>Person</literal> ��
<literal>employee</literal> �v���p�e�B���Q�Ƃ���
- <literal>Employee</literal>
�C���X�^���X�Ƃ��ē�����L�[�����蓖�Ă��܂��B
+ 新しくセーブする <literal>Person</literal> インスタンスは、
+ その <literal>Person</literal> の
<literal>employee</literal> プロパティが参照する
+ <literal>Employee</literal> インスタンスとして同じ主キーが割り当てられます。
</para>
<para>
- ���1�̕��@�Ƃ��āA<literal>Employee</literal> ����
<literal>Person</literal> �ւ�
- ���j�[�N�����g�����O���L�[�֘A�͈ȉ��̂悤�ɕ\������܂��F
+ もう1つの方法として、<literal>Employee</literal> から
<literal>Person</literal> への
+ ユニーク制約を使った外部キー関連は以下のように表現されます:
</para>
<programlisting><![CDATA[<many-to-one name="person"
class="Person" column="PERSON_ID"
unique="true"/>]]></programlisting>
<para>
- �����Ă��̊֘A�́A
- �ȉ��̋L�q�� <literal>Person</literal>
�̃}�b�s���O�ɒlj����邱�Ƃőo�����ɂ��邱�Ƃ��ł��܂��F
+ そしてこの関連は、
+ 以下の記述を <literal>Person</literal>
のマッピングに追加することで双方向にすることができます:
</para>
<programlisting><![CDATA[<one-to-one name="employee"
class="Employee"
property-ref="person"/>]]></programlisting>
@@ -1930,29 +1931,29 @@
</natural-id>]]></programlisting>
<para>
- ��L�[�Ƃ��đ㗝�L�[�̎g�p�𐄏����܂����A
- ���ׂẴG���e�B�e�B�ɑ��Ď��R�L�[���ʂ���悤�ɂ��ׂ��ł��B
- ���R�L�[�̓��j�[�N����null�Ȉ�̃v���p�e�B�A�܂��̓v���p�e�B�̘A���ł��B
- �s�ςł������ɗǂ��ł��B
- <literal><natural-id></literal>
�v�f��Ŏ��R�L�[�̃v���p�e�B��}�b�s���O���܂��B
- Hibernate�͕K�R�I�Ƀ��j�[�N����null�l�����鐧������A
- �������ă}�b�s���O�͂�莩�ȋL�q�I�ɂȂ�܂��B
+ 主キーとして代理キーの使用を推奨しますが、
+ すべてのエンティティに対して自然キーを識別するようにすべきです。
+ 自然キーはユニークかつ非nullな一つのプロパティ、またはプロパティの連結です。
+ 不変であればさらに良いです。
+ <literal><natural-id></literal>
要素内で自然キーのプロパティをマッピングします。
+ Hibernateは必然的にユニークかつnull値を許可する制約を生成し、
+ こうしてマッピングはより自己記述的になります。
</para>
<para>
- �G���e�B�e�B�̎��R�L�[�v���p�e�B�̔�r�ɂ́A
- <literal>equals()</literal> ��
<literal>hashCode()</literal> �̎������������߂��܂��B
+ エンティティの自然キープロパティの比較には、
+ <literal>equals()</literal> と
<literal>hashCode()</literal> の実装を強くお勧めします。
</para>
<para>
- ���̃}�b�s���O�͎��R��L�[��g�����G���e�B�e�B�ł̎g�p��Ӑ}���Ă��܂���B
+ このマッピングは自然主キーを使ったエンティティでの使用を意図していません。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>mutable</literal> (�I�v�V����, �f�t�H���g��
<literal>false</literal> ):
- �f�t�H���g�ł́A���R���ʎq�v���p�e�B�͕s��(�萔)�Ƒz�肳��Ă��܂��B
+ <literal>mutable</literal> (オプション, デフォルトは
<literal>false</literal> ):
+ デフォルトでは、自然識別子プロパティは不変(定数)と想定されています。
</para>
</listitem>
</itemizedlist>
@@ -1963,10 +1964,10 @@
<title>component, dynamic-component</title>
<para>
- <literal><component></literal> �v�f�́A
- �q�I�u�W�F�N�g�̃v���p�e�B��e�N���X�̃e�[�u���̃J�����փ}�b�s���O���܂��B
-
�R���|�[�l���g�͎����̃v���p�e�B�A�R���|�[�l���g�A�R���N�V�����̏��ɒ�`�ł��܂��B
- �ȉ��́u�R���|�[�l���g�v���Ă��������B
+ <literal><component></literal> 要素は、
+ 子オブジェクトのプロパティを親クラスのテーブルのカラムへマッピングします。
+ コンポーネントは自分のプロパティ、コンポーネント、コレクションの順に定義できます。
+ 以下の「コンポーネント」を見てください。
</para>
<programlistingco>
@@ -1999,72 +2000,72 @@
<calloutlist>
<callout arearefs="component1">
<para>
- <literal>name</literal>�F�v���p�e�B���B
+ <literal>name</literal>:プロパティ名。
</para>
</callout>
<callout arearefs="component2">
<para>
<literal>class</literal>
- �i�I�v�V���� -
�f�t�H���g�̓��t���N�V�����ɂ�茈�肳���v���p�e�B�̌^�j�F
- �R���|�[�l���g�i�q�j�N���X�̖��O�B
+ (オプション - デフォルトはリフレクションにより決定されるプロパティの型):
+ コンポーネント(子)クラスの名前。
</para>
</callout>
<callout arearefs="component3">
<para>
- <literal>insert</literal>
�F�}�b�s���O���ꂽ�J������SQL��
- <literal>INSERT</literal>
�Ɍ����悤�ɂ���ǂ�����w�肵�܂��B
+ <literal>insert</literal> :マッピングされたカラムがSQLの
+ <literal>INSERT</literal> に現れるようにするどうかを指定します。
</para>
</callout>
<callout arearefs="component4">
<para>
- <literal>update</literal> :
�}�b�s���O���ꂽ�J������SQL ��
- <literal>UPDATE</literal>
�Ɍ����悤�ɂ��邩�ǂ�����w�肵�܂��B
+ <literal>update</literal> : マッピングされたカラムがSQL の
+ <literal>UPDATE</literal> に現れるようにするかどうかを指定します。
</para>
</callout>
<callout arearefs="component5">
<para>
- <literal>access</literal> �i�I�v�V���� -
�f�t�H���g�� <literal>property</literal> �j�F
- �v���p�e�B�̒l�ւ̃A�N�Z�X��Hibernate���g���헪�B
+ <literal>access</literal> (オプション - デフォルトは
<literal>property</literal> ):
+ プロパティの値へのアクセスにHibernateが使う戦略。
</para>
</callout>
<callout arearefs="component6">
<para>
- <literal>lazy</literal> (optional - �f�t�H���g��
<literal>false</literal> ):
- �C���X�^���X�ϐ��ɍŏ��ɃA�N�Z�X�����Ƃ��ɁA
- �R���|�[�l���g��x�����ăt�F�b�`����悤�w�肵�܂��B
- (�o�C�g�R�[�h������쐬���鎞�Ԃ��K�v�ɂȂ�܂�)
+ <literal>lazy</literal> (optional - デフォルトは
<literal>false</literal> ):
+ インスタンス変数に最初にアクセスしたときに、
+ コンポーネントを遅延してフェッチするよう指定します。
+ (バイトコード実装を作成する時間が必要になります)
</para>
</callout>
<callout arearefs="component7">
<para>
- <literal>optimistic-lock</literal>
(�I�v�V���� - �f�t�H���g�� <literal>true</literal> ):
- ���̃v���p�e�B�̍X�V�ɁA�y�σ��b�N�̎擾��v�����邩�ǂ�����w�肵�܂��B
-
����������A���̃v���p�e�B���_�[�e�B�ł���Ƃ��Ƀo�[�W�����𑝂₷�ׂ������肵�܂��B
+ <literal>optimistic-lock</literal> (オプション -
デフォルトは <literal>true</literal> ):
+ このプロパティの更新に、楽観ロックの取得を要求するかどうかを指定します。
+ 言い換えれば、このプロパティがダーティであるときにバージョンを増やすべきかを決定します。
</para>
</callout>
<callout arearefs="component8">
<para>
- <literal>unique</literal> (�I�v�V���� -
�f�t�H���g�� <literal>false</literal> ):
-
�R���|�[�l���g�̂��ׂẴ}�b�s���O����J�����ɁA���j�[�N�����݂��邩��w�肵�܂��B
+ <literal>unique</literal> (オプション - デフォルトは
<literal>false</literal> ):
+ コンポーネントのすべてのマッピングするカラムに、ユニーク制約が存在するかを指定します。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- �q�� <literal><property></literal> �^�O�ŁA
- �q�̃N���X�̃v���p�e�B��e�[�u���J�����Ƀ}�b�s���O���܂��B
+ 子の <literal><property></literal> タグで、
+ 子のクラスのプロパティをテーブルカラムにマッピングします。
</para>
<para>
- <literal><component></literal>
�v�f�́A�e�G���e�B�e�B�֖߂�Q�ƂƂ��āA
- �R���|�[�l���g�̃N���X�̃v���p�e�B��}�b�s���O����
<literal><parent></literal> �T�u�v�f�����܂��B
+ <literal><component></literal>
要素は、親エンティティへ戻る参照として、
+ コンポーネントのクラスのプロパティをマッピングする
<literal><parent></literal> サブ要素を許可します。
</para>
<para>
- <literal><dynamic-component></literal> �v�f�́A
- <literal>Map</literal>
���R���|�[�l���g�Ƃ��ă}�b�s���O����邱�Ƃ�\�ɂ��܂��B
- �v���p�e�B����map�̃L�[��Q�Ƃ��܂��B<xref
linkend="components-dynamic"/> ��Q�Ƃ��Ă��������B
+ <literal><dynamic-component></literal> 要素は、
+ <literal>Map</literal> がコンポーネントとしてマッピングされることを可能にします。
+ プロパティ名はmapのキーを参照します。<xref linkend="components-dynamic"/>
を参照してください。
</para>
@@ -2074,11 +2075,11 @@
<title>properties</title>
<para>
- <literal><properties></literal>
�v�f�̓N���X�̃v���p�e�B�̎w�肳�ꂽ�A
- �_���I�ȃO���[�s���O��\�ɂ��܂��B
- ���̍\���̍ł�d�v�Ȏg�p���@�́A
- <literal>property-ref</literal>
�̃^�[�Q�b�g�ɂȂ�v���p�e�B�̌��������邱�Ƃł��B
- ����͂܂��A�����J�����̃��j�[�N������`����ȒP�ȕ��@�ł����܂��B
+ <literal><properties></literal>
要素はクラスのプロパティの指定された、
+ 論理的なグルーピングを可能にします。
+ この構造の最も重要な使用方法は、
+ <literal>property-ref</literal> のターゲットになるプロパティの結合を許可することです。
+ それはまた、複数カラムのユニーク制約を定義する簡単な方法でもあります。
</para>
<programlistingco>
@@ -2104,40 +2105,40 @@
<calloutlist>
<callout arearefs="properties1">
<para>
- <literal>name</literal> : �O���[�s���O�̘_�����B
- ���ۂ̃v���p�e�B���ł� <emphasis>����܂���</emphasis>
�B
+ <literal>name</literal> : グルーピングの論理名。
+ 実際のプロパティ名では <emphasis>ありません</emphasis> 。
</para>
</callout>
<callout arearefs="properties2">
<para>
-
<literal>insert</literal>�F�}�b�s���O���ꂽ�J������SQL��
- <literal>INSERT</literal>
�Ɍ����悤�ɂ��邩�ǂ�����w�肵�܂��B
+ <literal>insert</literal>:マッピングされたカラムがSQLの
+ <literal>INSERT</literal> に現れるようにするかどうかを指定します。
</para>
</callout>
<callout arearefs="properties3">
<para>
-
<literal>update</literal>�F�}�b�s���O���ꂽ�J������SQL��
- <literal>UPDATE</literal>
�Ɍ����悤�ɂ��邩�ǂ�����w�肵�܂��B
+ <literal>update</literal>:マッピングされたカラムがSQLの
+ <literal>UPDATE</literal> に現れるようにするかどうかを指定します。
</para>
</callout>
<callout arearefs="properties4">
<para>
- <literal>optimistic-lock</literal>
(�I�v�V���� - �f�t�H���g�� <literal>true</literal> ):
- �����̃v���p�e�B�̍X�V�Ɋy�ϓI���b�N�̎擾��v�����邩�ǂ�����w�肵�܂��B
-
����������A���̃v���p�e�B���_�[�e�B�ł���Ƃ��Ƀo�[�W�����𑝂₷�ׂ������肵�܂��B
+ <literal>optimistic-lock</literal> (オプション -
デフォルトは <literal>true</literal> ):
+ これらのプロパティの更新に楽観的ロックの取得を要求するかどうかを指定します。
+ 言い換えれば、このプロパティがダーティであるときにバージョンを増やすべきかを決定します。
</para>
</callout>
<callout arearefs="properties5">
<para>
- <literal>unique</literal> (�I�v�V���� -
�f�t�H���g�� <literal>false</literal> ):
-
�R���|�[�l���g�̂��ׂẴ}�b�s���O����J�����ɁA���j�[�N�����݂��邩��w�肵�܂��B
+ <literal>unique</literal> (オプション - デフォルトは
<literal>false</literal> ):
+ コンポーネントのすべてのマッピングするカラムに、ユニーク制約が存在するかを指定します。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- �Ⴆ�A����ȉ��̂悤��
<literal><properties></literal> �}�b�s���O���������ꍇ�F
+ 例えば、もし以下のような <literal><properties></literal>
マッピングがあった場合:
</para>
<programlisting><![CDATA[<class name="Person">
@@ -2152,8 +2153,8 @@
</class>]]></programlisting>
<para>
- ��L�[�̑���� <literal>Person</literal>
�e�[�u���̃��j�[�N�L�[�ւ̎Q�Ƃ��A
- ���K�V�[�f�[�^�̊֘A���������܂���B�F
+ 主キーの代わりに <literal>Person</literal> テーブルのユニークキーへの参照を持つ、
+ レガシーデータの関連を持つかもしれません。:
</para>
<programlisting><![CDATA[<many-to-one name="person"
@@ -2164,7 +2165,7 @@
</many-to-one>]]></programlisting>
<para>
- �������A���̂悤�ȃ��K�V�[�f�[�^�}�b�s���O�̃R���e�L�X�g�O�ւ̎g�p�͐������܂���B
+ しかし、このようなレガシーデータマッピングのコンテキスト外への使用は推奨しません。
</para>
</sect2>
@@ -2173,9 +2174,9 @@
<title>subclass</title>
<para>
-
�Ō�Ƀ|�����[�t�B�b�N�ȉi�����ɂ́A���[�g�̉i���N���X�̊e�T�u�N���X�̒�`���K�v�ł��B
- table-per-class-hierarchy�}�b�s���O�헪�ł́A
- <literal><subclass></literal> ��`���g���܂��B
+ 最後にポリモーフィックな永続化には、ルートの永続クラスの各サブクラスの定義が必要です。
+ table-per-class-hierarchyマッピング戦略では、
+ <literal><subclass></literal> 定義が使われます。
</para>
<programlistingco>
@@ -2202,37 +2203,37 @@
<calloutlist>
<callout arearefs="subclass1">
<para>
-
<literal>name</literal>�F�T�u�N���X�̊��S�C�����ꂽ�N���X���B
+ <literal>name</literal>:サブクラスの完全修飾されたクラス名。
</para>
</callout>
<callout arearefs="subclass2">
<para>
-
<literal>discriminator-value</literal>�i�I�v�V���� - �f�t�H���g�̓N���X���j�F
- �X�̃T�u�N���X���ʂ��邽�߂̒l�B
+ <literal>discriminator-value</literal>(オプション -
デフォルトはクラス名):
+ 個々のサブクラスを区別するための値。
</para>
</callout>
<callout arearefs="subclass3">
<para>
- <literal>proxy</literal>�i�I�v�V�����j�F
- �x���������v���L�V�Ɏg���N���X��C���^�[�t�F�C�X��w�肵�܂��B
+ <literal>proxy</literal>(オプション):
+ 遅延初期化プロキシに使うクラスやインターフェイスを指定します。
</para>
</callout>
<callout arearefs="subclass4">
<para>
- <literal>lazy</literal>�i�I�v�V����, �f�t�H���g��
<literal>true</literal> �j�F
- <literal>lazy="false"</literal>
�Ɛݒ肷��ƁA�x���t�F�b�`���g�p�ł��܂���B
+ <literal>lazy</literal>(オプション, デフォルトは
<literal>true</literal> ):
+ <literal>lazy="false"</literal>
と設定すると、遅延フェッチが使用できません。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- �e�T�u�N���X�ł́A�i���v���p�e�B�ƃT�u�N���X���`���܂��B
- <literal><version></literal> ��
<literal><id></literal> �v���p�e�B�́A
- ���[�g�N���X����p�������Ɖ��肳��܂��B
- �K�w�\���ɂ�����T�u�N���X�́A
- ���j�[�N�� <literal>discriminator-value</literal>
���`���Ȃ���Ȃ�܂���B
- none���w�肳���ƁA���S�C�����ꂽJava�N���X�����g���܂��B
+ 各サブクラスでは、永続プロパティとサブクラスを定義します。
+ <literal><version></literal> と
<literal><id></literal> プロパティは、
+ ルートクラスから継承されると仮定されます。
+ 階層構造におけるサブクラスは、
+ ユニークな <literal>discriminator-value</literal> を定義しなければなりません。
+ noneが指定されると、完全修飾されたJavaクラス名が使われます。
</para>
<!--
@@ -2246,15 +2247,15 @@
extends keyword. The ordering inside a single mapping file still needs to be
defined as superclasses
before subclasses.
- <literal>subclass</literal>
�A<literal>union-subclass</literal> �A
- <literal>joined-subclass</literal> �}�b�s���O��
- <literal>hibernate-mapping</literal>
�����̕ʂ̃}�b�s���O�h�L�������g��Ő錾�ł��܂��B
- ����ɂ��A�V�����}�b�s���O�t�@�C����lj����邾���ŃN���X�K�w��g�����邱�Ƃ��ł��܂��B
- ���炩���߃}�b�s���O����X�[�p�[�N���X��w�肵���T�u�N���X�}�b�s���O��ŁA
- <literal>extends</literal> ������w�肵�Ȃ���Ȃ�܂���B
- ���ӁF���̓����̓}�b�s���O�h�L�������g�̏��ԕt�����d�v�ɂȂ�܂��B
-
Hibernate3�ł́A�g���L�[���[�h��g���Ƃ��ɂ́A�}�b�s���O�t�@�C���̏����t���͖��ɂȂ�܂���B
-
��̃}�b�s���O�t�@�C����ł̏����t���͖����ɁA�T�u�N���X�̑O�ɃX�[�p�[�N���X�Ƃ��Ē�`����K�v������܂��B
+ <literal>subclass</literal>
、<literal>union-subclass</literal> 、
+ <literal>joined-subclass</literal> マッピングを
+ <literal>hibernate-mapping</literal> 直下の別のマッピングドキュメント内で宣言できます。
+ これにより、新しいマッピングファイルを追加するだけでクラス階層を拡張することができます。
+ あらかじめマッピングするスーパークラスを指定したサブクラスマッピング内で、
+ <literal>extends</literal> 属性を指定しなければなりません。
+ 注意:この特性はマッピングドキュメントの順番付けが重要になります。
+ Hibernate3では、拡張キーワードを使うときには、マッピングファイルの順序付けは問題になりません。
+ 一つのマッピングファイル内での順序付けは未だに、サブクラスの前にスーパークラスとして定義する必要があります。
</para>
@@ -2267,7 +2268,7 @@
-->
<para>
- �p���̃}�b�s���O�Ɋւ������ <xref linkend="inheritance"/>
�����������B
+ 継承のマッピングに関する情報は <xref linkend="inheritance"/> を見てください。
</para>
</sect2>
@@ -2277,10 +2278,10 @@
<title>joined-subclass</title>
<para>
- ���1�̕��@�Ƃ��āA�e�T�u�N���X���g�̃e�[�u���փ}�b�s���O���邱�Ƃ��ł��܂�
- (table-per-subclass mapping strategy)�B
- �p��������Ԃ̓X�[�p�[�N���X�̃e�[�u����g���������Ō������܂��B
- <literal><joined-subclass></literal>
�v�f��g�p���܂��B
+ もう1つの方法として、各サブクラスを自身のテーブルへマッピングすることができます
+ (table-per-subclass mapping strategy)。
+ 継承した状態はスーパークラスのテーブルを使った結合で検索します。
+ <literal><joined-subclass></literal> 要素を使用します。
</para>
<programlistingco>
@@ -2313,34 +2314,34 @@
<calloutlist>
<callout arearefs="joinedsubclass1">
<para>
-
<literal>name</literal>�F�T�u�N���X�̊��S�C�����ꂽ�N���X���B
+ <literal>name</literal>:サブクラスの完全修飾されたクラス名。
</para>
</callout>
<callout arearefs="joinedsubclass2">
<para>
- <literal>table</literal>
:�T�u�N���X�e�[�u���̖��O�B
+ <literal>table</literal> :サブクラステーブルの名前。
</para>
</callout>
<callout arearefs="joinedsubclass3">
<para>
- <literal>proxy</literal> (�I�v�V����):
- �x���������v���L�V�Ɏg�p����N���X��C���^�[�t�F�C�X��w�肵�܂��B
+ <literal>proxy</literal> (オプション):
+ 遅延初期化プロキシに使用するクラスやインターフェイスを指定します。
</para>
</callout>
<callout arearefs="joinedsubclass4">
<para>
- <literal>lazy</literal> (�I�v�V����, �f�t�H���g��
<literal>true</literal> ):
- <literal>lazy="false"</literal>
�Ƃ���ƁA�x���t�F�b�`���g�p�ł��܂���B
+ <literal>lazy</literal> (オプション, デフォルトは
<literal>true</literal> ):
+ <literal>lazy="false"</literal>
とすると、遅延フェッチが使用できません。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- ���̃}�b�s���O�헪�ɂ́A���ʃJ�����͕K�v����܂���B
- �������e�T�u�N���X�� <literal><key></literal>
�v�f��g���A
- �I�u�W�F�N�g���ʎq��ێ�����e�[�u���J�������`���Ȃ���Ȃ�܂���B
- ���̏͂̏��߂̃}�b�s���O�͈ȉ��̂悤�ɏ��������܂��F
+ このマッピング戦略には、識別カラムは必要ありません。
+ しかし各サブクラスは <literal><key></literal> 要素を使い、
+ オブジェクト識別子を保持するテーブルカラムを定義しなければなりません。
+ この章の初めのマッピングは以下のように書き直せます:
</para>
<programlisting><![CDATA[<?xml version="1.0"?>
@@ -2370,13 +2371,13 @@
</class>
<class name="eg.Dog">
- <!-- ������Dog�̃}�b�s���O�����܂� -->
+ <!-- ここにDogのマッピングを書きます -->
</class>
</hibernate-mapping>]]></programlisting>
<para>
- �p���̃}�b�s���O�Ɋւ������ <xref linkend="inheritance"/>
�����������B
+ 継承のマッピングに関する情報は <xref linkend="inheritance"/> を見てください。
</para>
</sect2>
@@ -2385,14 +2386,14 @@
<title>union-subclass</title>
<para>
- 3�ڂ̑I���́A�p���K�w�̋�ۃN���X�݂̂�e�[�u���Ƀ}�b�s���O���邱�Ƃł�
- (the table-per-concrete-class�헪)�B
- ���ꂼ��̃e�[�u���͌p���̏�Ԃ�܂߂��ׂẴN���X�̉i����Ԃ��`���܂��B
- Hibernate�ł͂��̗l�Ȍp���K�w���K������K�v�ł͂���܂���B
- �P���ɂ��ꂼ��̃N���X��A
- �ʁX�� <literal><class></literal>
�錾��g���ă}�b�s���O���邱�Ƃ��ł��܂��B
- �������|�����[�t�B�b�N�Ȋ֘A(�Ⴆ�� �K�w�̃X�[�p�[�N���X�ւ̊֘A)��g�������Ȃ�A
- <literal><union-subclass></literal>
�}�b�s���O��g���K�v������܂��B
+ 3つ目の選択肢は、継承階層の具象クラスのみをテーブルにマッピングすることです
+ (the table-per-concrete-class戦略)。
+ それぞれのテーブルは継承の状態を含めすべてのクラスの永続状態を定義します。
+ Hibernateではその様な継承階層が必ずしも必要ではありません。
+ 単純にそれぞれのクラスを、
+ 別々の <literal><class></literal>
宣言を使ってマッピングすることができます。
+ しかしポリモーフィックな関連(例えば 階層のスーパークラスへの関連)を使いたいなら、
+ <literal><union-subclass></literal>
マッピングを使う必要があります。
</para>
@@ -2425,35 +2426,35 @@
<calloutlist>
<callout arearefs="unionsubclass1">
<para>
-
<literal>name</literal>�F�T�u�N���X�̊��S�C�����ꂽ�N���X���B
+ <literal>name</literal>:サブクラスの完全修飾されたクラス名。
</para>
</callout>
<callout arearefs="unionsubclass2">
<para>
- <literal>table</literal>
:�T�u�N���X�e�[�u���̖��O�B
+ <literal>table</literal> :サブクラステーブルの名前。
</para>
</callout>
<callout arearefs="unionsubclass3">
<para>
- <literal>proxy</literal> (�I�v�V����):
- �x���������v���L�V�Ɏg�p����N���X��C���^�[�t�F�C�X��w�肵�܂��B
+ <literal>proxy</literal> (オプション):
+ 遅延初期化プロキシに使用するクラスやインターフェイスを指定します。
</para>
</callout>
<callout arearefs="unionsubclass4">
<para>
- <literal>lazy</literal> (�I�v�V����, �f�t�H���g��
<literal>true</literal> ):
- <literal>lazy="false"</literal>
�Ƃ���ƁA�x���t�F�b�`���g�p�ł��܂���B
+ <literal>lazy</literal> (オプション, デフォルトは
<literal>true</literal> ):
+ <literal>lazy="false"</literal>
とすると、遅延フェッチが使用できません。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- ���̃}�b�s���O�헪�ł͎��ʃJ������L�[�J�����͕K�v����܂���B
+ このマッピング戦略では識別カラムやキーカラムは必要ありません。
</para>
<para>
- �p���̃}�b�s���O�Ɋւ������ <xref linkend="inheritance"/>
�����������B
+ 継承のマッピングに関する情報は <xref linkend="inheritance"/> を見てください。
</para>
</sect2>
@@ -2462,8 +2463,8 @@
<title>join</title>
<para>
- <literal><join></literal> �v�f��g�����ƂŁA
- �P�̃N���X�̃v���p�e�B������̃e�[�u���Ƀ}�b�s���O���邱�Ƃ��ł��܂��B
+ <literal><join></literal> 要素を使うことで、
+ 1つのクラスのプロパティをいくつものテーブルにマッピングすることができます。
</para>
<programlistingco>
@@ -2492,58 +2493,58 @@
<calloutlist>
<callout arearefs="join1">
<para>
- <literal>table</literal> :���������e�[�u���̖��O
+ <literal>table</literal> :結合したテーブルの名前
</para>
</callout>
<callout arearefs="join2">
<para>
- <literal>schema</literal> (�I�v�V����):
- ���[�g��
<literal><hibernate-mapping></literal> �v�f�Ŏw�肵���X�L�[�}����
- �I�[�o�[���C�h���܂��B
+ <literal>schema</literal> (オプション):
+ ルートの
<literal><hibernate-mapping></literal> 要素で指定したスキーマ名を
+ オーバーライドします。
</para>
</callout>
<callout arearefs="join3">
<para>
- <literal>catalog</literal> (�I�v�V����):
- ���[�g��
<literal><hibernate-mapping></literal> �v�f�Ŏw�肵���J�^���O����
- �I�[�o�[���C�h���܂��B
+ <literal>catalog</literal> (オプション):
+ ルートの
<literal><hibernate-mapping></literal> 要素で指定したカタログ名を
+ オーバーライドします。
</para>
</callout>
<callout arearefs="join4">
<para>
- <literal>fetch</literal> (�I�v�V���� -
�f�t�H���g�� <literal>join</literal> ):
- <literal>join</literal> ��ݒ肵���ꍇ�A
- Hibernate�̓f�t�H���g�ŁA�N���X��X�[�p�[�N���X�Œ�`���ꂽ
<literal><join></literal>
- ��������̂ɓ��������g���A�T�u�N���X�Œ�`���ꂽ
<literal><join></literal>
- ��������̂ɊO��������g���܂��B
- <literal>select</literal> ��ݒ肵���ꍇ�ɂ́A
- Hibernate�̓T�u�N���X�Œ�`���ꂽ
<literal><join></literal>
- �̑I��ɏ����I���g���܂��B���̏ꍇ�A
-
�s���T�u�N���X�̃C���X�^���X���\���邱�Ƃ��킩�����ꍇ�ɂ̂ݔ��s����܂��B
- ��������̓N���X�₻�̃X�[�p�[�N���X�Œ�`���ꂽ
<literal><join></literal> ����
- ���邽�߂Ɏg�p���܂��B
+ <literal>fetch</literal> (オプション - デフォルトは
<literal>join</literal> ):
+ <literal>join</literal> を設定した場合、
+ Hibernateはデフォルトで、クラスやスーパークラスで定義された
<literal><join></literal>
+ を検索するのに内部結合を使い、サブクラスで定義された
<literal><join></literal>
+ を検索するのに外部結合を使います。
+ <literal>select</literal> を設定した場合には、
+ Hibernateはサブクラスで定義された
<literal><join></literal>
+ の選択に順次選択を使います。この場合、
+ 行がサブクラスのインスタンスを代表することがわかった場合にのみ発行されます。
+ 内部結合はクラスやそのスーパークラスで定義された
<literal><join></literal> を検索
+ するために使用します。
</para>
</callout>
<callout arearefs="join5">
<para>
- <literal>inverse</literal> (�I�v�V���� -
�f�t�H���g�� <literal>false</literal> ):
- ����\�ł���AHibernate�͂��̌����Œ�`����Ă���v���p�e�B�ɑ�
- �}����X�V��s���܂���B
+ <literal>inverse</literal> (オプション - デフォルトは
<literal>false</literal> ):
+ もし可能であれば、Hibernateはこの結合で定義されているプロパティに対し
+ 挿入や更新を行いません。
</para>
</callout>
<callout arearefs="join6">
<para>
- <literal>optional</literal> (�I�v�V���� -
�f�t�H���g�� <literal>false</literal> ):
-
����\�ł���AHibernate�͂��̌����Œ�`���ꂽ�v���p�e�B��null�łȂ��ꍇ�ɂ̂�
- �s��}�����A���̃v���p�e�B�̌����ɂ͏�ɊO��������g�p���܂��B
+ <literal>optional</literal> (オプション - デフォルトは
<literal>false</literal> ):
+ もし可能であれば、Hibernateはこの結合で定義されたプロパティがnullでない場合にのみ
+ 行を挿入し、そのプロパティの検索には常に外部結合を使用します。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- �Ⴆ�ΐl�̃A�h���X�̏��������e�[�u���Ƀ}�b�s���O���邱�Ƃ��\�ł�
- (���ׂẴv���p�e�B�ɑ��Ēl�^�̃Z�}���e�B�N�X��ێ����܂�)�B
+ 例えば人のアドレスの情報を分離したテーブルにマッピングすることが可能です
+ (すべてのプロパティに対して値型のセマンティクスを保持します)。
</para>
<programlisting><![CDATA[<class name="Person"
@@ -2560,9 +2561,9 @@
...]]></programlisting>
<para>
- ���̓����͂������K�V�[�f�[�^���f���ɑ��Ă̂ݗL�p�ł����A
- �N���X������Ȃ��e�[�u���ƁA���߂ׂ̍����h���C�����f���𐄏����܂��B
- ��������Ő������悤�ɁA�P�̃N���X�K�w�Ōp���̃}�b�s���O�헪���ւ��鎞�ɂ͗L�p�ł��B
+ この特徴はしばしばレガシーデータモデルに対してのみ有用ですが、
+ クラスよりも少ないテーブルと、きめの細かいドメインモデルを推奨します。
+ しかし後で説明するように、1つのクラス階層で継承のマッピング戦略を切り替える時には有用です。
</para>
</sect2>
@@ -2571,10 +2572,10 @@
<title>key</title>
<para>
- ���܂ʼn��x�� <literal><key></literal>
�v�f���o�Ă��܂����B
- ���̗v�f�͐V�����e�[�u���ւ̌������`������A
- �����e�[�u���ŊO���L�[���`�����肷��e�v�f�̂ǂ��ɂł����A
- �I���W�i���e�[�u���̎�L�[��Q�Ƃ��܂��B
+ 今まで何度か <literal><key></literal> 要素が出てきました。
+ この要素は新しいテーブルへの結合を定義したり、
+ 結合テーブルで外部キーを定義したりする親要素のどこにでも現れ、
+ オリジナルテーブルの主キーを参照します。
</para>
<programlistingco>
@@ -2598,72 +2599,72 @@
<calloutlist>
<callout arearefs="key1">
<para>
- <literal>column</literal>
(�I�v�V����):�O���L�[�J�����̖��O�B
- �l�X�g����
<literal><column></literal> �J�����ɂ���Ă�w�肳��܂��B
+ <literal>column</literal> (オプション):外部キーカラムの名前。
+ ネストした <literal><column></literal>
カラムによっても指定されます。
</para>
</callout>
<callout arearefs="key2">
<para>
- <literal>on-delete</literal> (�I�v�V����,
�f�t�H���g�� <literal>noaction</literal>):
-
�O���L�[���f�[�^�x�[�X���x���ŃJ�X�P�[�h�폜���\���ǂ�����w�肵�܂��B
+ <literal>on-delete</literal> (オプション, デフォルトは
<literal>noaction</literal>):
+ 外部キー制約がデータベースレベルでカスケード削除が可能かどうかを指定します。
</para>
</callout>
<callout arearefs="key3">
<para>
- <literal>property-ref</literal> (�I�v�V����):
- �I���W�i���e�[�u���̎�L�[�ł͂Ȃ��J������Q�Ƃ���O���L�[��w�肵�܂�
- (���K�V�[�f�[�^�ɑ��Ē���܂�)�B
+ <literal>property-ref</literal> (オプション):
+ オリジナルテーブルの主キーではないカラムを参照する外部キーを指定します
+ (レガシーデータに対して提供されます)。
</para>
</callout>
<callout arearefs="key4">
<para>
- <literal>not-null</literal> (�I�v�V����):
- �O���L�[�J������null�l���e���Ȃ����Ƃ�w�肵�܂�
- (���̂��Ƃ͊O���L�[����L�[�̈ꕔ�ł��邱�Ƃ�ÖٓI�Ɏ����܂�)�B
+ <literal>not-null</literal> (オプション):
+ 外部キーカラムがnull値を許容しないことを指定します
+ (このことは外部キーが主キーの一部であることを暗黙的に示します)。
</para>
</callout>
<callout arearefs="key5">
<para>
- <literal>update</literal> (�I�v�V����):
- �O���L�[�����čX�V���Ă͂Ȃ�Ȃ����Ƃ�w�肵�܂�
- (���̂��Ƃ͊O���L�[����L�[�̈ꕔ�ł��邱�Ƃ�ÖٓI�Ɏ����܂�)�B
+ <literal>update</literal> (オプション):
+ 外部キーを決して更新してはならないことを指定します
+ (このことは外部キーが主キーの一部であることを暗黙的に示します)。
</para>
</callout>
<callout arearefs="key6">
<para>
- <literal>unique</literal> (�I�v�V����):
- �O���L�[�����j�[�N������ׂ��ł��邱�Ƃ�w�肵�܂�
- (���̂��Ƃ͊O���L�[����L�[�̈ꕔ�ł��邱�Ƃ�ÖٓI�Ɏ����܂�)�B
+ <literal>unique</literal> (オプション):
+ 外部キーがユニーク制約を持つべきであることを指定します
+ (このことは外部キーが主キーの一部であることを暗黙的に示します)。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- �폜�̃p�t�H�[�}���X���d�v�ł���V�X�e���ɂ́A
- ���ׂẴL�[�� <literal>on-delete="cascade"</literal>
�ƒ�`���邱�Ƃ𐄏����܂��B
- �������邱�Ƃ�Hibernate�́A<literal>DELETE</literal>
���s�������ɁA
- �f�[�^�x�[�X���x���� <literal>ON CASCADE DELETE</literal>
�����g�p���܂��B
- ���̓����̓o�[�W�����t����ꂽ�f�[�^�ɑ���Hibernate�̒ʏ�̊y�ϓI���b�N�헪��
- ��������Ƃ������Ƃɒ��ӂ��Ă��������B
+ 削除のパフォーマンスが重要であるシステムには、
+ すべてのキーを <literal>on-delete="cascade"</literal>
と定義することを推奨します。
+ そうすることでHibernateは、<literal>DELETE</literal> 文を毎回発行する代わりに、
+ データベースレベルの <literal>ON CASCADE DELETE</literal> 制約を使用します。
+ この特徴はバージョン付けられたデータに対するHibernateの通常の楽観的ロック戦略を
+ 無視するということに注意してください。
</para>
<para>
- <literal>not-null</literal> ��
<literal>update</literal> �����́A�P������Α��֘A�̎��ɂ͗L�p�ł��B
- �P������Α��֘A��null���e���Ȃ��O���L�[�Ƀ}�b�s���O����Ƃ��́A
- <literal><key
not-null="true"></literal> ��g���ăL�[�J������錾
- <emphasis> ���Ȃ��Ă͂Ȃ�܂���</emphasis> �B
+ <literal>not-null</literal> と
<literal>update</literal> 属性は、単方向一対多関連の時には有用です。
+ 単方向一対多関連をnullを許容しない外部キーにマッピングするときは、
+ <literal><key
not-null="true"></literal> を使ってキーカラムを宣言
+ <emphasis> しなくてはなりません</emphasis> 。
</para>
</sect2>
<sect2 id="mapping-column" revision="4">
- <title>column �� formula �v�f</title>
+ <title>column と formula 要素</title>
<para>
- <literal>column</literal>
������L�q�ł���C�ӂ̃}�b�s���O�v�f�͂܂��A
- <literal><column></literal>
�T�u�v�f��L�q�ł��܂��B
- ���l�� <literal><formula></literal> ��
<literal>formula</literal> �����̑�֎�i�ł��B
+ <literal>column</literal> 属性を記述できる任意のマッピング要素はまた、
+ <literal><column></literal> サブ要素も記述できます。
+ 同様に <literal><formula></literal> も
<literal>formula</literal> 属性の代替手段です。
</para>
<programlisting><![CDATA[<column
@@ -2682,9 +2683,9 @@
<programlisting><![CDATA[<formula>SQL
expression</formula>]]></programlisting>
<para>
- �����v���p�e�B��֘A�̃}�b�s���O�̒��ŁA
- <literal>column</literal> ��
<literal>formula</literal> ������g�ݍ��킹�邱�Ƃ��ł��܂��B
- �Ⴆ�A����Ȍ������Ȃǂł��B
+ 同じプロパティや関連のマッピングの中で、
+ <literal>column</literal> と
<literal>formula</literal> 属性を組み合わせることができます。
+ 例えば、特殊な結合条件などです。
</para>
<programlisting><![CDATA[<many-to-one
name="homeAddress" class="Address"
@@ -2699,11 +2700,11 @@
<title>import</title>
<para>
- �A�v���P�[�V�����ɓ������O��2�̉i���N���X������A
- Hibernate�N�G���Ŋ��S�C�����ꂽ�i�p�b�P�[�W�́j���O��w�肵�����Ȃ��Ɖ��肵�܂��B
- ���̂悤�ȏꍇ�� <literal>auto-import="true"</literal>
�ɗ��炸�A
- �N���X���u�C���|�[�g�v���ꂽ��̂ł���Ɩ����ł��܂��B
-
�����I�Ƀ}�b�s���O����Ă��Ȃ��N���X��C���^�[�t�F�C�X�ł�����C���|�[�g�ł��܂��B
+ アプリケーションに同じ名前の2つの永続クラスがあり、
+ Hibernateクエリで完全修飾された(パッケージの)名前を指定したくないと仮定します。
+ そのような場合は <literal>auto-import="true"</literal>
に頼らず、
+ クラスが「インポート」されたものであると明示できます。
+ 明示的にマッピングされていないクラスやインターフェイスでさえもインポートできます。
</para>
<programlisting><![CDATA[<import
class="java.lang.Object"
rename="Universe"/>]]></programlisting>
@@ -2720,13 +2721,13 @@
<calloutlist>
<callout arearefs="import1">
<para>
-
<literal>class</literal>�FJava�N���X�̊��S�C�����ꂽ�N���X���B
+ <literal>class</literal>:Javaクラスの完全修飾されたクラス名。
</para>
</callout>
<callout arearefs="import2">
<para>
- <literal>rename</literal>�i�I�v�V���� -
�f�t�H���g�͏C������Ă��Ȃ��N���X���j�F
- �N�G������Ŏg���閼�O�B
+ <literal>rename</literal>(オプション -
デフォルトは修飾されていないクラス名):
+ クエリ言語で使われる名前。
</para>
</callout>
</calloutlist>
@@ -2738,21 +2739,21 @@
<title>any</title>
<para>
- �v���p�e�B�}�b�s���O�ɂ͂���ɂ��1�̌^������܂��B
- <literal><any></literal> �}�b�s���O�v�f�́A
- �����̃e�[�u������N���X�ւ̃|�����[�t�B�b�N�Ȋ֘A���`���܂��B
-
���̌^�̃}�b�s���O�ɂ͕K�������̃J�������K�v�ł��B1�Ԗڂ̃J�����͊֘A�G���e�B�e�B�̌^��ێ����܂��B
- �c��̃J�����͎��ʎq��ێ����܂��B���̎�ނ̊֘A�ɂ͊O���L�[�����w�肷�邱�Ƃ͂ł��܂���B
- ���̂��߂���͍ł�g���邱�Ƃ̂Ȃ��i�|�����[�t�B�b�N�ȁj�֘A�̃}�b�s���O���@�ł��B
-
���ɓ��ʂȏꍇ�i�Ⴆ�A�������O��[�U�Z�b�V�����f�[�^�Ȃ�)�Ɍ����āA�����g���ׂ��ł��B
+ プロパティマッピングにはさらにもう1つの型があります。
+ <literal><any></literal> マッピング要素は、
+ 複数のテーブルからクラスへのポリモーフィックな関連を定義します。
+ この型のマッピングには必ず複数のカラムが必要です。1番目のカラムは関連エンティティの型を保持します。
+ 残りのカラムは識別子を保持します。この種類の関連には外部キー制約を指定することはできません。
+ そのためこれは最も使われることのない(ポリモーフィックな)関連のマッピング方法です。
+ 非常に特別な場合(例えば、検査ログやユーザセッションデータなど)に限って、これを使うべきです。
</para>
<para>
- <literal>meta-type</literal> �ɂ��A
- �A�v���P�[�V�����̓J�X�^���^��w��ł��܂��B���̃J�X�^���^��
- �f�[�^�x�[�X�J�����̒l��A<literal>id-type</literal>
�Ŏw�肵���^��
- ���ʎq�v���p�e�B�������i���N���X�փ}�b�s���O���܂��B
- meta-type�̒l����N���X���ւ̃}�b�s���O��w�肵�Ȃ���Ȃ�܂���B
+ <literal>meta-type</literal> により、
+ アプリケーションはカスタム型を指定できます。このカスタム型は
+ データベースカラムの値を、<literal>id-type</literal> で指定した型の
+ 識別子プロパティを持った永続クラスへマッピングします。
+ meta-typeの値からクラス名へのマッピングを指定しなければなりません。
</para>
<programlisting><![CDATA[<any name="being"
id-type="long" meta-type="string">
@@ -2790,37 +2791,37 @@
<calloutlist>
<callout arearefs="any1">
<para>
- <literal>name</literal>�F�v���p�e�B���B
+ <literal>name</literal>:プロパティ名。
</para>
</callout>
<callout arearefs="any2">
<para>
- <literal>id-type</literal>�F���ʎq�̌^�B
+ <literal>id-type</literal>:識別子の型。
</para>
</callout>
<callout arearefs="any3">
<para>
- <literal>meta-type</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>string</literal> �j�F
- �f�B�X�N���~�l�[�^�}�b�s���O�ŋ����ꂽ�^
+ <literal>meta-type</literal>(オプション - デフォルトは
<literal>string</literal> ):
+ ディスクリミネータマッピングで許された型
</para>
</callout>
<callout arearefs="any4">
<para>
- <literal>cascade</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>none</literal> �j�F
- �J�X�P�[�h�̃X�^�C���B
+ <literal>cascade</literal>(オプション - デフォルトは
<literal>none</literal> ):
+ カスケードのスタイル。
</para>
</callout>
<callout arearefs="any5">
<para>
- <literal>access</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>property</literal> �j�F
- �v���p�e�B�̒l�ւ̃A�N�Z�X��Hibernate���g���헪�B
+ <literal>access</literal>(オプション - デフォルトは
<literal>property</literal> ):
+ プロパティの値へのアクセスにHibernateが使う戦略。
</para>
</callout>
<callout arearefs="any6">
<para>
- <literal>optimistic-lock</literal> (�I�v�V���� -
�f�t�H���g�� <literal>true</literal> ):
- ���̃v���p�e�B�̍X�V�Ɋy�σ��b�N�̎擾��v�����邩�ǂ�����w�肵�܂��B
-
����������A���̃v���p�e�B���_�[�e�B�ł���Ƃ��Ƀo�[�W�����𑝂₷�ׂ������`���܂��B
+ <literal>optimistic-lock</literal> (オプション -
デフォルトは <literal>true</literal> ):
+ このプロパティの更新に楽観ロックの取得を要求するかどうかを指定します。
+ 言い換えれば、このプロパティがダーティであるときにバージョンを増やすべきかを定義します。
</para>
</callout>
</calloutlist>
@@ -2831,87 +2832,87 @@
</sect1>
<sect1 id="mapping-types">
- <title>Hibernate�̌^</title>
+ <title>Hibernateの型</title>
<sect2 id="mapping-types-entitiesvalues" revision="1">
- <title>�G���e�B�e�B�ƒl</title>
+ <title>エンティティと値</title>
<para>
- �i���T�[�r�X�Ɋւ��l�X��Java���ꃌ�x���̃I�u�W�F�N�g�̐U�镑���𗝉��邽�߂ɂ́A
- �I�u�W�F�N�g��2�̃O���[�v�ɕ�����K�v������܂��F
+ 永続サービスに関わる様々なJava言語レベルのオブジェクトの振る舞いを理解するためには、
+ オブジェクトを2つのグループに分ける必要があります:
</para>
<para>
- <emphasis> �G���e�B�e�B</emphasis>
�̓G���e�B�e�B�ւ̎Q�Ƃ�ێ�����A
- ���̂��ׂẴI�u�W�F�N�g����Ɨ����đ��݂��܂��B
- �Q�Ƃ���Ȃ��I�u�W�F�N�g���K�x�[�W�R���N�g����Ă��܂��������ʏ��Java���f���ƁA
- ������ׂĂ݂Ă��������B
- �i�e�G���e�B�e�B����q�ցA�Z�[�u�ƍ폜��
<emphasis>�J�X�P�[�h</emphasis> ���ꂤ�邱�Ƃ����āj
- �G���e�B�e�B�͖����I�ɃZ�[�u�܂��͍폜����Ȃ���Ȃ�܂���B
- ����͓��B�\���ɂ��I�u�W�F�N�g�i������ODMG���f���Ƃ͈قȂ��Ă��܂��B
-
��K�͂ȃV�X�e���ŃA�v���P�[�V�����I�u�W�F�N�g�����ʂǂ̂悤�Ɏg���邩�ɂ�薧�ڂɑΉ����܂��B
- �G���e�B�e�B�͏z�ƎQ�Ƃ̋��L��T�|�[�g���܂��B
- �܂������̓o�[�W�����t�����邱�Ƃ�ł��܂��B
+ <emphasis> エンティティ</emphasis> はエンティティへの参照を保持する、
+ 他のすべてのオブジェクトから独立して存在します。
+ 参照されないオブジェクトがガベージコレクトされてしまう性質を持つ通常のJavaモデルと、
+ これを比べてみてください。
+ (親エンティティから子へ、セーブと削除が <emphasis>カスケード</emphasis> されうることを除いて)
+ エンティティは明示的にセーブまたは削除されなければなりません。
+ これは到達可能性によるオブジェクト永続化のODMGモデルとは異なっています。
+ 大規模なシステムでアプリケーションオブジェクトが普通どのように使われるかにより密接に対応します。
+ エンティティは循環と参照の共有をサポートします。
+ またそれらはバージョン付けすることもできます。
</para>
<para>
- �G���e�B�e�B�̉i����Ԃ͑��̃G���e�B�e�B�� <emphasis>�l</emphasis>
�^��
- �C���X�^���X�ւ̎Q�Ƃ���\������܂��B
- �l�̓v���~�e�B�u�A�R���N�V����(�R���N�V�����̓���ł͂Ȃ�)�A
- �R���|�[�l���g�A�s�σI�u�W�F�N�g�ł��B
- �G���e�B�e�B�Ƃ͈Ⴂ�A�l�́i���ɃR���N�V�����ƃR���|�[�l���g�ɂ����āj�A
- ���B�\���ɂ��i������폜�� <emphasis>�s���܂�</emphasis> �B
-
�l�I�u�W�F�N�g�i�ƃv���~�e�B�u�j�́A��܂���G���e�B�e�B�ƈꏏ�ɉi������폜���s����̂ŁA
- ������Ɨ��Ƀo�[�W�����t�����邱�Ƃ͂ł��܂���B
- �l�ɂ͓Ɨ������A�C�f���e�B�e�B���Ȃ��̂ŁA
- �����̃G���e�B�e�B��R���N�V������������L���邱�Ƃ͂ł��܂���B
+ エンティティの永続状態は他のエンティティや <emphasis>値</emphasis> 型の
+ インスタンスへの参照から構成されます。
+ 値はプリミティブ、コレクション(コレクションの内部ではなく)、
+ コンポーネント、不変オブジェクトです。
+ エンティティとは違い、値は(特にコレクションとコンポーネントにおいて)、
+ 到達可能性による永続化や削除が <emphasis>行われます</emphasis> 。
+ 値オブジェクト(とプリミティブ)は、包含するエンティティと一緒に永続化や削除が行われるので、
+ それらを独立にバージョン付けすることはできません。
+ 値には独立したアイデンティティがないので、
+ 複数のエンティティやコレクションがこれを共有することはできません。
</para>
<para>
- ����܂Łu�i���N���X�v�Ƃ������t��G���e�B�e�B�̈Ӗ��Ŏg���Ă��܂����B
- ���ꂩ���������Ă����܂��B
- �����Ɍ����ƁA�i����Ԃ����[�U��`�̃N���X�̂��ׂĂ�
- �G���e�B�e�B�Ƃ����킯�ł͂���܂���B
- <emphasis>�R���|�[�l���g</emphasis>
�͒l�̃Z�}���e�B�N�X�����[�U��`�N���X�ł��B
- <literal>java.lang.String</literal>
�^�̃v���p�e�B��܂��l�̃Z�}���e�B�N�X�����܂��B
-
��`����Ȃ�AJDK�Œ���Ă��邷�ׂĂ�Java�̌^(�N���X)���l�̃Z�}���e�B�N�X���Ƃ����܂��B
- ������[�U��`�^�́A�G���e�B�e�B��l�^�̃Z�}���e�B�N�X�ƂƂ�Ƀ}�b�s���O�ł��܂��B
- ���̌���̓A�v���P�[�V�����J���Ҏ���ł��B
- ���̃N���X�̂P�̃C���X�^���X�ւ̋��L�Q�Ƃ́A
- �h���C�����f����̃G���e�B�e�B�N���X�ɑ���ǂ��q���g�ɂȂ�܂��B
- ��������W���W��́A�ʏ�l�^�֕ϊ�����܂��B
+ これまで「永続クラス」という言葉をエンティティの意味で使ってきました。
+ これからもそうしていきます。
+ 厳密に言うと、永続状態を持つユーザ定義のクラスのすべてが
+ エンティティというわけではありません。
+ <emphasis>コンポーネント</emphasis> は値のセマンティクスを持つユーザ定義クラスです。
+ <literal>java.lang.String</literal>
型のプロパティもまた値のセマンティクスを持ちます。
+ 定義するなら、JDKで提供されているすべてのJavaの型(クラス)が値のセマンティクスを持つといえます。
+ 一方ユーザ定義型は、エンティティや値型のセマンティクスとともにマッピングできます。
+ この決定はアプリケーション開発者次第です。
+ そのクラスの1つのインスタンスへの共有参照は、
+ ドメインモデル内のエンティティクラスに対する良いヒントになります。
+ 一方合成集約や集約は、通常値型へ変換されます。
</para>
<para>
- �{�h�L�������g��ʂ��āA���x����̊T�O����グ�܂��B
+ 本ドキュメントを通して、何度もこの概念を取り上げます。
</para>
<para>
- Java�^�̃V�X�e��(������͊J���҂���`�����G���e�B�e�B�ƒl�^)��
- SQL/�f�[�^�x�[�X�^�̃V�X�e���Ƀ}�b�s���O���邱�Ƃ͓���ł��B
- Hibernate�͂Q�̃V�X�e���̉˂�������܂��B
- �G���e�B�e�B�ɑ��Ă�
- <literal><class></literal> ��
<literal><subclass></literal> �Ȃǂ�g�p���܂��B
- �l�^�ɑ��Ă� <literal><property></literal> ��
- <literal><component></literal> �Ȃǂ�A�ʏ�
<literal>type</literal> �ƂƂ�Ɏg���܂��B
- ���̑����̒l��Hibernate�� <emphasis>�}�b�s���O�^</emphasis>
�̖��O�ł��B
- Hibernate��(�W��JDK�̒l�^�ɑ���)�����̎��R�ȃ}�b�s���O����܂��B
-
��Ō���悤�ɁA���g�̃}�b�s���O�^��L�q���A���l�ɃJ�X�^���̕ϊ��헪��������邱�Ƃ��ł��܂��B
+ Java型のシステム(もしくは開発者が定義したエンティティと値型)を
+ SQL/データベース型のシステムにマッピングすることは難しいです。
+ Hibernateは2つのシステムの架け橋を提供します。
+ エンティティに対しては
+ <literal><class></literal> や
<literal><subclass></literal> などを使用します。
+ 値型に対しては <literal><property></literal> や
+ <literal><component></literal> などを、通常
<literal>type</literal> とともに使います。
+ この属性の値はHibernateの <emphasis>マッピング型</emphasis> の名前です。
+ Hibernateは(標準JDKの値型に対して)多くの自由なマッピングを提供します。
+ 後で見るように、自身のマッピング型を記述し、同様にカスタムの変換戦略を実装することができます。
</para>
<para>
-
�R���N�V���������g�ݍ��݂�Hibernate�̌^�͂��ׂāAnull�Z�}���e�B�N�X��T�|�[�g���܂��B
+ コレクションを除く組み込みのHibernateの型はすべて、nullセマンティクスをサポートします。
</para>
</sect2>
<sect2 id="mapping-types-basictypes" revision="3">
- <title>��{�I�Ȍ^</title>
+ <title>基本的な型</title>
<para>
- �g�ݍ��݂� <emphasis>��{�I�ȃ}�b�s���O�^</emphasis>
�͑�܂��Ɉȉ��̂悤�ɕ������܂��B
+ 組み込みの <emphasis>基本的なマッピング型</emphasis> は大まかに以下のように分けられます。
<variablelist>
<varlistentry>
@@ -2919,11 +2920,11 @@
boolean, yes_no, true_false</literal></term>
<listitem>
<para>
- Java�̃v���~�e�B�u��b�p�[�N���X����K�ȁi�x���_�[�ŗL�́j
- SQL�J�����^�ւ̌^�}�b�s���O�B
- <literal>boolean, yes_no</literal> ��
<literal>true_false</literal> �́A
- ���ׂ�Java�� <literal>boolean</literal>
- �܂��� <literal>java.lang.Boolean</literal>
�̑�փG���R�[�h�ł��B
+ Javaのプリミティブやラッパークラスから適切な(ベンダー固有の)
+ SQLカラム型への型マッピング。
+ <literal>boolean, yes_no</literal> と
<literal>true_false</literal> は、
+ すべてJavaの <literal>boolean</literal>
+ または <literal>java.lang.Boolean</literal>
の代替エンコードです。
</para>
</listitem>
@@ -2932,8 +2933,8 @@
<term><literal>string</literal></term>
<listitem>
<para>
- <literal>java.lang.String</literal> ����
<literal>VARCHAR</literal>
- �i�܂���Oracle�� <literal>VARCHAR2</literal>
�j�ւ̌^�}�b�s���O�B
+ <literal>java.lang.String</literal> から
<literal>VARCHAR</literal>
+ (またはOracleの <literal>VARCHAR2</literal>
)への型マッピング。
</para>
</listitem>
</varlistentry>
@@ -2941,9 +2942,9 @@
<term><literal>date, time,
timestamp</literal></term>
<listitem>
<para>
- <literal>java.util.Date</literal>
�Ƃ��̃T�u�N���X����SQL�^�� <literal>DATE</literal>,
- <literal>TIME</literal> ,
<literal>TIMESTAMP</literal> �i�܂��͂����Ɠ����Ȃ�́j
- �ւ̌^�}�b�s���O�B
+ <literal>java.util.Date</literal>
とそのサブクラスからSQL型の <literal>DATE</literal>,
+ <literal>TIME</literal> ,
<literal>TIMESTAMP</literal> (またはそれらと等価なもの)
+ への型マッピング。
</para>
</listitem>
</varlistentry>
@@ -2951,8 +2952,8 @@
<term><literal>calendar,
calendar_date</literal></term>
<listitem>
<para>
- <literal>java.util.Calendar</literal>
����SQL�^ �́u <literal>TIMESTAMP</literal> ,
- <literal>DATE</literal>
(�܂��͂����Ɠ����Ȃ�́j�ւ̌^�}�b�s���O�B
+ <literal>java.util.Calendar</literal> からSQL型
の「 <literal>TIMESTAMP</literal> ,
+ <literal>DATE</literal>
(またはそれらと等価なもの)への型マッピング。
</para>
</listitem>
</varlistentry>
@@ -2960,8 +2961,8 @@
<term><literal>big_decimal,
big_integer</literal></term>
<listitem>
<para>
- <literal>java.math.BigDecimal</literal> ��
<literal>java.math.BigInteger</literal>
- ����
<literal>NUMERIC</literal>�i�܂���Oracle��
<literal>NUMBER</literal> �j�ւ̌^�}�b�s���O�B
+ <literal>java.math.BigDecimal</literal> と
<literal>java.math.BigInteger</literal>
+ から <literal>NUMERIC</literal>(またはOracleの
<literal>NUMBER</literal> )への型マッピング。
</para>
</listitem>
</varlistentry>
@@ -2970,12 +2971,12 @@
<listitem>
<para>
<literal>java.util.Locale</literal> ,
<literal>java.util.TimeZone</literal> ,
- <literal>java.util.Currency</literal> ����
<literal>VARCHAR</literal>
- �i�܂���Oracle�� <literal>VARCHAR2</literal>
�j�ւ̌^�}�b�s���O�B
- <literal>Locale</literal> ��
<literal>Currency</literal> �̃C���X�^���X�́A
- ������ISO�R�[�h�Ƀ}�b�s���O����܂��B
- <literal>TimeZone</literal> �̃C���X�^���X�́A
- ������ <literal>ID</literal>
�Ƀ}�b�s���O����܂��B
+ <literal>java.util.Currency</literal> から
<literal>VARCHAR</literal>
+ (またはOracleの <literal>VARCHAR2</literal>
)への型マッピング。
+ <literal>Locale</literal> と
<literal>Currency</literal> のインスタンスは、
+ それらのISOコードにマッピングされます。
+ <literal>TimeZone</literal> のインスタンスは、
+ それらの <literal>ID</literal> にマッピングされます。
</para>
</listitem>
</varlistentry>
@@ -2983,9 +2984,9 @@
<term><literal>class</literal></term>
<listitem>
<para>
- <literal>java.lang.Class</literal> ����
<literal>VARCHAR</literal>
- �i�܂���Oracle�� <literal>VARCHAR2</literal>
�j�ւ̌^�}�b�s���O�B
- <literal>Class</literal>
�͂��̊��S�C�����ꂽ���O�Ƀ}�b�s���O����܂��B
+ <literal>java.lang.Class</literal> から
<literal>VARCHAR</literal>
+ (またはOracleの <literal>VARCHAR2</literal>
)への型マッピング。
+ <literal>Class</literal>
はその完全修飾された名前にマッピングされます。
</para>
</listitem>
</varlistentry>
@@ -2993,7 +2994,7 @@
<term><literal>binary</literal></term>
<listitem>
<para>
- �o�C�g�z��́A�K��SQL�̃o�C�i���^�Ƀ}�b�s���O����܂��B
+ バイト配列は、適切なSQLのバイナリ型にマッピングされます。
</para>
</listitem>
</varlistentry>
@@ -3001,8 +3002,8 @@
<term><literal>text</literal></term>
<listitem>
<para>
- ����Java������́ASQL�� <literal>CLOB</literal>
�܂���
- <literal>TEXT</literal>
�^�Ƀ}�b�s���O����܂��B
+ 長いJava文字列は、SQLの <literal>CLOB</literal> または
+ <literal>TEXT</literal> 型にマッピングされます。
</para>
</listitem>
</varlistentry>
@@ -3010,10 +3011,10 @@
<term><literal>serializable</literal></term>
<listitem>
<para>
-
�V���A���C�Y�\��Java�^�́A�K��SQL�̃o�C�i���^�Ƀ}�b�s���O����܂��B
- �f�t�H���g�Ŋ�{�^�ł͂Ȃ��V���A���C�Y�\��Java�N���X��
- �C���^�[�t�F�C�X�̖��O��w�肷�邱�ƂŁA
- Hibernate�̌^��
<literal>serializable</literal> �Ƃ��邱�Ƃ�ł��܂��B
+ シリアライズ可能なJava型は、適切なSQLのバイナリ型にマッピングされます。
+ デフォルトで基本型ではないシリアライズ可能なJavaクラスや
+ インターフェイスの名前を指定することで、
+ Hibernateの型を <literal>serializable</literal>
とすることもできます。
</para>
</listitem>
</varlistentry>
@@ -3021,11 +3022,11 @@
<term><literal>clob,
blob</literal></term>
<listitem>
<para>
- JDBC�N���X <literal>java.sql.Clob</literal>
�� <literal>java.sql.Blob</literal>
- �ɑ���^�}�b�s���O�B
-
blob��clob�I�u�W�F�N�g�̓g�����U�N�V�����̊O�ł͍ė��p�ł��Ȃ����߁A
- �A�v���P�[�V�����ɂ���Ă͕s�ւ������܂���B
- �i����ɂ̓h���C�o�T�|�[�g����т��Ă��܂���B�j
+ JDBCクラス <literal>java.sql.Clob</literal> と
<literal>java.sql.Blob</literal>
+ に対する型マッピング。
+ blobやclobオブジェクトはトランザクションの外では再利用できないため、
+ アプリケーションによっては不便かもしれません。
+ (さらにはドライバサポートが一貫していません。)
</para>
</listitem>
</varlistentry>
@@ -3037,13 +3038,13 @@
</term>
<listitem>
<para>
- �قƂ�ǂ̏ꍇ�ɉςł���Java�̌^�ɑ���^�}�b�s���O�B
- Hibernate�͕s�ς�Java�̌^�ɑ��Ă͍œK����s���A
- �A�v���P�[�V�����͂����s�σI�u�W�F�N�g�Ƃ��Ĉ����܂��B
- �Ⴆ�� <literal>imm_timestamp</literal>
�Ƃ��ă}�b�v�����C���X�^���X�ɑ��āA
- <literal>Date.setTime()</literal>
��Ăяo���Ă͂Ȃ�܂���B
- �v���p�e�B�̒l��ύX�����̕ύX��i�������邽�߂ɂ́A
-
�A�v���P�[�V�����̓v���p�e�B�ɑ��ĐV����(����łȂ�)�I�u�W�F�N�g���蓖�ĂȂ���Ȃ�܂���B
+ ほとんどの場合に可変であるJavaの型に対する型マッピング。
+ Hibernateは不変なJavaの型に対しては最適化を行い、
+ アプリケーションはそれを不変オブジェクトとして扱います。
+ 例えば <literal>imm_timestamp</literal>
としてマップしたインスタンスに対して、
+ <literal>Date.setTime()</literal>
を呼び出してはなりません。
+ プロパティの値を変更しその変更を永続化するためには、
+ アプリケーションはプロパティに対して新しい(同一でない)オブジェクトを割り当てなければなりません。
</para>
</listitem>
</varlistentry>
@@ -3052,41 +3053,41 @@
</para>
<para>
-
�G���e�B�e�B�ƃR���N�V�����̃��j�[�N�Ȏ��ʎq�́A<literal>binary</literal> ,
<literal>blob</literal> ,
- <literal>clob</literal> �����A�ǂ�Ȋ�{�^�ł�\���܂���B
- �i�������ʎq�ł�\���܂���B�ȉ����Ă��������B�j
+ エンティティとコレクションのユニークな識別子は、<literal>binary</literal> ,
<literal>blob</literal> ,
+ <literal>clob</literal> を除く、どんな基本型でも構いません。
+ (複合識別子でも構いません。以下を見てください。)
</para>
<para>
- ��{�I�Ȓl�^�ɂ́A<literal>org.hibernate.Hibernate</literal>
�Œ�`���ꂽ
- <literal>Type</literal> �萔�����ꂼ�ꂠ��܂��B
- �Ⴆ�A<literal>Hibernate.STRING</literal> ��
<literal>string</literal> �^��\�����Ă��܂��B
+ 基本的な値型には、<literal>org.hibernate.Hibernate</literal> で定義された
+ <literal>Type</literal> 定数がそれぞれあります。
+ 例えば、<literal>Hibernate.STRING</literal> は
<literal>string</literal> 型を表現しています。
</para>
</sect2>
<sect2 id="mapping-types-custom" revision="2">
- <title>�J�X�^���^</title>
+ <title>カスタム型</title>
<para>
- �J���҂��Ǝ��̒l�^��쐬���邱�Ƃ́A��r�I�ȒP�ł��B
- �Ⴆ�A<literal>java.lang.BigInteger</literal> �^�̃v���p�e�B��
- <literal>VARCHAR</literal> �J�����ɉi�����������������܂���B
- Hibernate�͂��̂��߂̑g�ݍ��^��p�ӂ��Ă��܂���B
-
�������J�X�^���^�́A�v���p�e�B�i�܂��̓R���N�V�����̗v�f�j��1�̃e�[�u���J������
- �}�b�s���O����̂ɐ����͂���܂���B
- ���̂��ߗႦ�A<literal>java.lang.String</literal> �^��
+ 開発者が独自の値型を作成することは、比較的簡単です。
+ 例えば、<literal>java.lang.BigInteger</literal> 型のプロパティを
+ <literal>VARCHAR</literal> カラムに永続化したいかもしれません。
+ Hibernateはこのための組み込み型を用意していません。
+ しかしカスタム型は、プロパティ(またはコレクションの要素)を1つのテーブルカラムに
+ マッピングするのに制限はありません。
+ そのため例えば、<literal>java.lang.String</literal> 型の
<literal>getName()</literal> /
<literal>setName()</literal>
- Java�v���p�e�B�� <literal>FIRST_NAME</literal> ,
<literal>INITIAL</literal>, <literal>SURNAME</literal>
- �J�����ɉi�����ł��܂��B
+ Javaプロパティを <literal>FIRST_NAME</literal> ,
<literal>INITIAL</literal>, <literal>SURNAME</literal>
+ カラムに永続化できます。
</para>
<para>
-
�J�X�^���^���������ɂ́A<literal>org.hibernate.UserType</literal> �܂���
- <literal>org.hibernate.CompositeUserType</literal> ��������A
- �^�̊��S�C�����ꂽ���O��g���ăv���p�e�B���`���܂��B
- �ǂ̂悤�Ȏ�ނ̂�̂��\���ׂ�ɂ́A
- <literal>org.hibernate.test.DoubleStringType</literal>
��m�F�����������B
+ カスタム型を実装するには、<literal>org.hibernate.UserType</literal> または
+ <literal>org.hibernate.CompositeUserType</literal> を実装し、
+ 型の完全修飾された名前を使ってプロパティを定義します。
+ どのような種類のものが可能かを調べるには、
+ <literal>org.hibernate.test.DoubleStringType</literal>
を確認してください。
</para>
<programlisting><![CDATA[<property name="twoStrings"
type="org.hibernate.test.DoubleStringType">
@@ -3095,22 +3096,22 @@
</property>]]></programlisting>
<para>
- <literal><column></literal> �^�O�ŁA
- �v���p�e�B���̃J�����փ}�b�s���O�ł��邱�Ƃɒ��ڂ��Ă��������B
+ <literal><column></literal> タグで、
+ プロパティを複数のカラムへマッピングできることに注目してください。
</para>
<para>
<literal>CompositeUserType</literal> ,
<literal>EnhancedUserType</literal> ,
<literal>UserCollectionType</literal> ,
<literal>UserVersionType</literal>
- �C���^�[�t�F�C�X�́A������Ȏg�p�@�ɑ��ẴT�|�[�g����܂��B
+ インターフェイスは、より特殊な使用法に対してのサポートを提供します。
</para>
<para>
- �}�b�s���O�t�@�C����� <literal>UserType</literal>
�փp�����[�^��ł��܂��B
- ���̂��߂ɂ́A<literal>UserType</literal> ��
- <literal>org.hibernate.usertype.ParameterizedType</literal>
��������Ȃ��Ă͂Ȃ�܂���B
- �J�X�^���^�p�����[�^����邽�߂ɁA
- �}�b�s���O�t�@�C����� <literal><type></literal>
�v�f��g�p�ł��܂��B
+ マッピングファイル内で <literal>UserType</literal> へパラメータを提供できます。
+ このためには、<literal>UserType</literal> は
+ <literal>org.hibernate.usertype.ParameterizedType</literal>
を実装しなくてはなりません。
+ カスタム型パラメータを提供するために、
+ マッピングファイル内で <literal><type></literal>
要素を使用できます。
</para>
<programlisting><![CDATA[<property name="priority">
@@ -3120,17 +3121,17 @@
</property>]]></programlisting>
<para>
- <literal>UserType</literal> �́A
- �����Ƃ��ēn���ꂽ <literal>Properties</literal>
�I�u�W�F�N�g����A
- <literal>default</literal>
�Ŏw�肵���p�����[�^�ɑ���l�������邱�Ƃ��ł��܂��B
+ <literal>UserType</literal> は、
+ 引数として渡された <literal>Properties</literal> オブジェクトから、
+ <literal>default</literal> で指定したパラメータに対する値を検索することができます。
</para>
<para>
- ����� <literal>UserType</literal>
��p�ɂɎg�p����Ȃ�A�Z�����O���`����ƕ֗��ɂȂ�ł��傤�B
- <literal><typedef></literal>
�v�f��g���Ă��̂悤�Ȃ��Ƃ��s���܂��B
- Typedefs�̓J�X�^���^�ɖ��O���蓖�Ă܂��B
- ���̌^���p�����[�^���Ȃ�A
- �p�����[�^�̃f�t�H���g�l�̃��X�g��܂ނ��Ƃ�ł��܂��B
+ 特定の <literal>UserType</literal>
を頻繁に使用するならば、短い名前を定義すると便利になるでしょう。
+ <literal><typedef></literal>
要素を使ってこのようなことが行えます。
+ Typedefsはカスタム型に名前を割り当てます。
+ その型がパラメータを持つならば、
+ パラメータのデフォルト値のリストを含むこともできます。
</para>
<programlisting><![CDATA[<typedef
class="com.mycompany.usertypes.DefaultValueIntegerType"
name="default_zero">
@@ -3140,21 +3141,21 @@
<programlisting><![CDATA[<property name="priority"
type="default_zero"/>]]></programlisting>
<para>
- �v���p�e�B�̃}�b�s���O�Ō^�p�����[�^��g�����ƂŁA
- typedef�Œ��ꂽ�p�����[�^���̓s�x�I�[�o�[���C�h���邱�Ƃ��\�ł��B
+ プロパティのマッピングで型パラメータを使うことで、
+ typedefで提供されたパラメータをその都度オーバーライドすることが可能です。
</para>
<para>
- Hibernate�̕��L���g�ݍ��^�ƃR���|�[�l���g�ɑ���T�|�[�g�́A
- �J�X�^���^��߂����� <emphasis>�g��Ȃ�</emphasis>
�Ƃ������Ƃ�Ӗ����܂��B
-
����ł�Ȃ��A�A�v���P�[�V�����ŕp�o����(�G���e�B�e�B�ł͂Ȃ�)�N���X�ɑ���J�X�^���^�̎g�p�́A
- �悢�����ł���Ƃ݂Ȃ���܂��B
- �Ⴆ�� <literal>MonetaryAmount</literal>
�N���X�̓R���|�[�l���g�Ƃ��ĊȒP�Ƀ}�b�s���O�ł��܂����A
- <literal>CompositeUserType</literal> �̗ǂ����ł��B
- �J�X�^���^��g�p���铮�@��1�͒��ۉ��ł��B
- �J�X�^���^��g�����ƂŁA�ʉ݂�ǂ̂悤�ɕ\�����悤�Ƃ�
- �}�b�s���O�h�L�������g�͋N���肤��ω��ɑΉ��ł��܂��B
+ Hibernateの幅広い組み込み型とコンポーネントに対するサポートは、
+ カスタム型をめったに <emphasis>使わない</emphasis> ということを意味します。
+ それでもなお、アプリケーションで頻出する(エンティティではない)クラスに対するカスタム型の使用は、
+ よいやり方であるとみなされます。
+ 例えば <literal>MonetaryAmount</literal>
クラスはコンポーネントとして簡単にマッピングできますが、
+ <literal>CompositeUserType</literal> の良い候補です。
+ カスタム型を使用する動機の1つは抽象化です。
+ カスタム型を使うことで、通貨をどのように表現しようとも
+ マッピングドキュメントは起こりうる変化に対応できます。
</para>
</sect2>
@@ -3163,15 +3164,15 @@
<sect1 id="mapping-entityname">
- <title>�P�̃N���X�ɂP�ȏ�̃}�b�s���O</title>
+ <title>1つのクラスに1つ以上のマッピング</title>
<para>
- ����i���N���X�ɁA��ȏ�̃}�b�s���O����邱�Ƃ��o���܂��B
- ���̏ꍇ�A�}�b�s���O����Q�̃G���e�B�e�B�̃C���X�^���X�m�ɂ��邽�߂ɁA
- <emphasis>�G���e�B�e�B��</emphasis> ��w�肵�Ȃ���Ȃ�܂���
- (�f�t�H���g�ł̓G���e�B�e�B���̓N���X���Ɠ����ł��B)�B
- �i���I�u�W�F�N�g�����Ƃ��A�N�G���������ނƂ��A
- �w�肳�ꂽ�G���e�B�e�B�ւ̊֘A��}�b�s���O����Ƃ��ɂ́A
- Hibernate�ł̓G���e�B�e�B����w�肵�Ȃ���Ȃ�܂���B
+ ある永続クラスに、一つ以上のマッピングを提供することが出来ます。
+ この場合、マッピングする2つのエンティティのインスタンスを明確にするために、
+ <emphasis>エンティティ名</emphasis> を指定しなければなりません
+ (デフォルトではエンティティ名はクラス名と同じです。)。
+ 永続オブジェクトを扱うとき、クエリを書き込むとき、
+ 指定されたエンティティへの関連をマッピングするときには、
+ Hibernateではエンティティ名を指定しなければなりません。
</para>
<programlisting><![CDATA[<class name="Contract"
table="Contracts"
@@ -3193,19 +3194,19 @@
</class>]]></programlisting>
<para>
- �֘A��<literal>class</literal> �̑����
<literal>entity-name</literal> ��g���āA
- �ǂ̂悤�Ɏw�肳���̂��ɒ��ڂ��Ă��������B
+ 関連が<literal>class</literal> の代わりに
<literal>entity-name</literal> を使って、
+ どのように指定されるのかに注目してください。
</para>
</sect1>
<sect1 id="mapping-quotedidentifiers">
- <title>�o�b�N�N�H�[�g�ň͂� SQL ���ʎq</title>
+ <title>バッククォートで囲んだ SQL 識別子</title>
<para>
- �}�b�s���O�h�L�������g�Ńe�[�u����J�����̖��O��o�b�N�N�H�[�g�ň͂ނ��ƂŁA
- Hibernate�Ő������ꂽSQL���̎��ʎq����p�����邱�Ƃ��ł��܂��B
- Hibernate��SQL�� <literal>Dialect</literal>
�ɑΉ�����A���������p�X�^�C����g���܂�
- �i���ʂ̓_�u���N�H�[�g�ł����ASQL
Server�ł͂������ʁAMySQL�ł̓o�b�N�N�H�[�g�ł��j�B
+ マッピングドキュメントでテーブルやカラムの名前をバッククォートで囲むことで、
+ Hibernateで生成されたSQL中の識別子を引用させることができます。
+ HibernateはSQLの <literal>Dialect</literal>
に対応する、正しい引用スタイルを使います
+ (普通はダブルクォートですが、SQL Serverではかぎ括弧、MySQLではバッククォートです)。
</para>
<programlisting><![CDATA[<class name="LineItem"
table="`Line Item`">
@@ -3218,21 +3219,21 @@
<sect1 id="mapping-alternatives">
- <title>���^�f�[�^�̑�֎�i</title>
+ <title>メタデータの代替手段</title>
<para>
- XML�̋L�q�ȊO�ɁA
- Hibernate�ł�O/R�}�b�s���O�̃��^�f�[�^���`�����֕��@������܂��B
+ XMLの記述以外に、
+ HibernateではO/Rマッピングのメタデータを定義する代替方法があります。
</para>
<sect2 id="mapping-xdoclet">
- <title>XDoclet �}�[�N�A�b�v�̎g�p</title>
+ <title>XDoclet マークアップの使用</title>
<para>
- ������Hibernate���[�U��XDoclet��
<literal>(a)hibernate.tags</literal> ��g���āA
- �\�[�X�R�[�h��ɒ��ڃ}�b�s���O���ߍ��ނ��Ƃ�D�݂܂��B
- ����͌����Ɍ�����XDoclet�̕���Ȃ̂ŁA�{�h�L�������g�ł͂��̕��@��ΏۂƂ͂��܂���B
- ������XDoclet��g�����ȉ��� <literal>Cat</literal>
�}�b�s���O�̗�����܂��B
+ 多くのHibernateユーザはXDocletの <literal>(a)hibernate.tags</literal>
を使って、
+ ソースコード内に直接マッピング情報を埋め込むことを好みます。
+ これは厳密に言えばXDocletの分野なので、本ドキュメントではこの方法を対象とはしません。
+ しかしXDocletを使った以下の <literal>Cat</literal> マッピングの例を示します。
</para>
<programlisting><![CDATA[package eg;
@@ -3341,30 +3342,30 @@
}]]></programlisting>
<para>
- Hibernate�̃E�F�u�T�C�g�ɂ́AXDoclet��Hibernate�Ɋւ���T���v������������܂��B
+ Hibernateのウェブサイトには、XDocletとHibernateに関するサンプルが多数あります。
</para>
</sect2>
<sect2 id="mapping-annotations" revision="2">
- <title>JDK 5.0 �A�m�e�[�V�����̎g�p</title>
+ <title>JDK 5.0 アノテーションの使用</title>
<para>
- JDK5.0�ł̓^�C�v�Z�[�t���R���p�C�����Ƀ`�F�b�N�ł���A
- ���ꃌ�x����XDoclet�X�^�C���̃A�m�e�[�V���������܂����B
-
���̃��J�j�Y����XDoclet�̃A�m�e�[�V����������͂ŁA�c�[����IDE��������T�|�[�g���Ă��܂��B
- �Ⴆ��IntelliJ
IDEA�́AJDK5.0�ɃA�m�e�[�V�����̎����⊮�ƍ\���̋����\����T�|�[�g���Ă��܂��B
- EJB�d�l
(JSR-220)�̐V�����o�[�W�����ł́A�G���e�B�e�B�r�[���ɑ����v�ȃ��^�f�[�^���J�j�Y���Ƃ���
- JDK5.0�̃A�m�e�[�V������g�p���Ă��܂��B
- Hibernate3�ł�JSR-220 (�i����API)��
<literal>EntityManager</literal> ��������A
- ���^�f�[�^�}�b�s���O�ɑ���T�|�[�g�́A
- �ʃ_�E�����[�h�� <emphasis>Hibernate Annotations</emphasis>
�p�b�P�[�W�ɂ�藘�p�\�ł��B
- �����EJB3(JSR-220)��Hibernate3�̃��^�f�[�^��ǂ����T�|�[�g���Ă��܂��B
+ JDK5.0ではタイプセーフかつコンパイル時にチェックできる、
+ 言語レベルのXDocletスタイルのアノテーションを導入しました。
+ このメカニズムはXDocletのアノテーションよりも強力で、ツールやIDEも多くがサポートしています。
+ 例えばIntelliJ IDEAは、JDK5.0にアノテーションの自動補完と構文の強調表示をサポートしています。
+ EJB仕様 (JSR-220)の新しいバージョンでは、エンティティビーンに対する主要なメタデータメカニズムとして
+ JDK5.0のアノテーションを使用しています。
+ Hibernate3ではJSR-220 (永続化API)の <literal>EntityManager</literal>
を実装し、
+ メタデータマッピングに対するサポートは、
+ 別ダウンロードの <emphasis>Hibernate Annotations</emphasis>
パッケージにより利用可能です。
+ これはEJB3(JSR-220)とHibernate3のメタデータをどちらもサポートしています。
</para>
<para>
- �ȉ���EJB�̃G���e�B�e�B�r�[���Ƃ��Ē��߂��ꂽPOJO�N���X�̗�ł��B
+ 以下はEJBのエンティティビーンとして注釈されたPOJOクラスの例です。
</para>
<programlisting><![CDATA[@Entity(access = AccessType.FIELD)
@@ -3391,8 +3392,8 @@
}]]></programlisting>
<para>
-
JDK5.0�̃A�m�e�[�V����(��JSR-220)�̃T�|�[�g�͐i�s���̍�Ƃł���A���S�ł͂Ȃ����Ƃɒ��ӂ��Ă��������B
- ����ɏڂ�������Hibernate�̃A�m�e�[�V�����E���W���[����Q�Ƃ��Ă��������B
+ JDK5.0のアノテーション(とJSR-220)のサポートは進行中の作業であり、完全ではないことに注意してください。
+ さらに詳しい情報はHibernateのアノテーション・モジュールを参照してください。
</para>
</sect2>
@@ -3401,54 +3402,54 @@
<sect1 id="mapping-generated" revision="1">
- <title>�����v���p�e�B</title>
+ <title>生成プロパティ</title>
<para>
- �����v���p�e�B�Ƃ́A�f�[�^�x�[�X�ɂ���Đ������ꂽ�l���v���p�e�B�ł��B
-
�ʏ�AHibernate�A�v���P�[�V�����́A�f�[�^�x�[�X���l�������v���p�e�B��܂ރI�u�W�F�N�g��
- <literal>���t���b�V��</literal> ����K�v������܂����B
- �������A�v���p�e�B���������ꂽ�Ƃ������Ƃ�}�[�N���邱�ƂŁA
- �A�v���P�[�V�����̓��t���b�V���̐ӔC��Hibernate�ɈϏ����܂��B
+ 生成プロパティとは、データベースによって生成された値を持つプロパティです。
+ 通常、Hibernateアプリケーションは、データベースが値を生成したプロパティを含むオブジェクトを
+ <literal>リフレッシュ</literal> する必要がありました。
+ しかし、プロパティが生成されたということをマークすることで、
+ アプリケーションはリフレッシュの責任をHibernateに委譲します。
- ��{�I�ɁA�����v���p�e�B���ƒ�`�����G���e�B�e�B�ɑ���
- Hibernate��INSERT��UPDATE��SQL�s�����シ���ɁA
- �������ꂽ�l��ǂݍ��ނ��߂� SELECT SQL �����s����܂��B
+ 基本的に、生成プロパティを持つと定義したエンティティに対して
+ HibernateがINSERTやUPDATEのSQLを発行した後すぐに、
+ 生成された値を読み込むための SELECT SQL が発行されます。
</para>
<para>
- �����v���p�e�B�́A�}���s�\���X�V�s�\�łȂ���Ȃ�܂���B
- <xref
linkend="mapping-declaration-version">versions</xref> �A
- <xref
linkend="mapping-declaration-timestamp">timestamps</xref> �A
- <xref linkend="mapping-declaration-property">simple
properties</xref> �������������ꂽ�ƃ}�[�N�ł��܂��B
+ 生成プロパティは、挿入不可能かつ更新不可能でなければなりません。
+ <xref
linkend="mapping-declaration-version">versions</xref> 、
+ <xref
linkend="mapping-declaration-timestamp">timestamps</xref> 、
+ <xref linkend="mapping-declaration-property">simple
properties</xref> だけが生成されたとマークできます。
</para>
<para>
- <literal>never</literal> (�f�t�H���g) - �^����ꂽ�v���p�e�B�̒l�́A
- �f�[�^�x�[�X���琶������Ȃ����Ƃ�Ӗ����܂��B
+ <literal>never</literal> (デフォルト) - 与えられたプロパティの値は、
+ データベースから生成されないことを意味します。
</para>
<para>
- <literal>insert</literal> -
�^����ꂽ�v���p�e�B�̒l�͑}�����ɐ�������邪�A
- �����ċN����X�V���ɂ͐�������Ȃ����Ǝ����܂��B
- �쐬���ꂽ���t�Ȃǂ́A���̃J�e�S���ɕ��ނ���܂��B
- <xref
linkend="mapping-declaration-version">version</xref> ��
- <xref
linkend="mapping-declaration-timestamp">timestamp</xref> ��
-
�v���p�e�B�͐������ꂽ�ƃ}�[�N�ł��܂����A���̃I�v�V�����͗��p�ł��Ȃ����Ƃɒ��ӂ��Ă��������B
+ <literal>insert</literal> - 与えられたプロパティの値は挿入時に生成されるが、
+ 続いて起こる更新時には生成されないこと示します。
+ 作成された日付などは、このカテゴリに分類されます。
+ <xref
linkend="mapping-declaration-version">version</xref> や
+ <xref
linkend="mapping-declaration-timestamp">timestamp</xref> の
+ プロパティは生成されたとマークできますが、このオプションは利用できないことに注意してください。
</para>
<para>
- <literal>always</literal> -
�}������X�V����v���p�e�B�̒l����������邱�Ƃ����܂��B
+ <literal>always</literal> - 挿入時も更新時もプロパティの値が生成されることを示します。
</para>
</sect1>
<sect1 id="mapping-database-object" revision="0">
- <title>�⏕�I�ȃf�[�^�x�[�X�E�I�u�W�F�N�g</title>
+ <title>補助的なデータベース・オブジェクト</title>
<para>
- Hibernate�̃X�L�[�}�E�G�{�����[�V�����c�[���ƘA�����邱�ƂŁA
-
�C�ӂ̃f�[�^�x�[�X�E�I�u�W�F�N�g�i�g���K�[��X�g�A�h�v���V�[�W���Ȃǁj��CREATE��DROP�ɂ��A
- Hibernate�̃}�b�s���O�t�@�C����̃��[�U�E�X�L�[�}���ׂĒ�`���邱�Ƃ��o���܂��B
-
��Ƀg���K��X�g�A�h�v���V�[�W���̂悤�ȃf�[�^�x�[�X�E�I�u�W�F�N�g����폜���邱�Ƃ�Ӑ}���Ă��܂����A
- ���ۂɂ� <literal>java.sql.Statement.execute()</literal>
���\�b�h�ɂ���Ď��s�ł���
- �C�ӂ�SQL�R�}���h�iALTER�AINSERT�Ȃǁj�����s�ł��܂��B
- �⏕�I�ȃf�[�^�x�[�X�E�I�u�W�F�N�g���`���邽�߂́A2�̊�{�I�ȕ��@������܂��B
+ Hibernateのスキーマ・エボリューションツールと連動することで、
+ 任意のデータベース・オブジェクト(トリガーやストアドプロシージャなど)のCREATEとDROPにより、
+ Hibernateのマッピングファイル内のユーザ・スキーマをすべて定義することが出来ます。
+ 主にトリガやストアドプロシージャのようなデータベース・オブジェクトを生成や削除することを意図していますが、
+ 実際には <literal>java.sql.Statement.execute()</literal>
メソッドによって実行できる
+ 任意のSQLコマンド(ALTER、INSERTなど)が実行できます。
+ 補助的なデータベース・オブジェクトを定義するための、2つの基本的な方法があります。
</para>
<para>
- 1�ڂ̕��@�́ACREATE��DROP�R�}���h��}�b�s���O�t�@�C���̊O�ɁA�����I�ɋL�ڂ��邱�Ƃł��B
+ 1つ目の方法は、CREATEとDROPコマンドをマッピングファイルの外に、明示的に記載することです。
</para>
<programlisting><![CDATA[<hibernate-mapping>
...
@@ -3458,9 +3459,9 @@
</database-object>
</hibernate-mapping>]]></programlisting>
<para>
- 2�ڂ̕��@�́ACREATE��DROP�R�}���h�̑g�ݗ��ĕ���m���Ă���J�X�^���N���X����邱�Ƃł��B
- ���̃J�X�^���N���X��
<literal>org.hibernate.mapping.AuxiliaryDatabaseObject</literal>
�C���^�t�F�[�X��
- �������Ȃ���Ȃ�܂���B
+ 2つ目の方法は、CREATEとDROPコマンドの組み立て方を知っているカスタムクラスを提供することです。
+ このカスタムクラスは
<literal>org.hibernate.mapping.AuxiliaryDatabaseObject</literal> インタフェースを
+ 実装しなければなりません。
</para>
<programlisting><![CDATA[<hibernate-mapping>
...
@@ -3469,8 +3470,8 @@
</database-object>
</hibernate-mapping>]]></programlisting>
<para>
- ����ɁA����f�[�^�x�[�X�������g�p����鎞�ɂ����K�p����Ƃ������悤�ɁA
- �f�[�^�x�[�X�E�I�u�W�F�N�g���g����P�[�X�����ł��܂��B
+ さらに、あるデータベース方言が使用される時にだけ適用するといったように、
+ データベース・オブジェクトが使われるケースを限定できます。
</para>
<programlisting><![CDATA[<hibernate-mapping>
...
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/batch.xml
===================================================================
--- core/trunk/documentation/manual/ja-JP/src/main/docbook/content/batch.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++ core/trunk/documentation/manual/ja-JP/src/main/docbook/content/batch.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,9 +1,11 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="batch">
- <title>�o�b�`����</title>
+ <title>バッチ処理</title>
<para>
- Hibernate��g���ăf�[�^�x�[�X��100,000�s��}������ȕ��@�́A���̂悤�Ȃ�̂ł��F
+ Hibernateを使ってデータベースに100,000行を挿入する愚直な方法は、このようなものです:
</para>
<programlisting><![CDATA[Session session = sessionFactory.openSession();
@@ -16,42 +18,42 @@
session.close();]]></programlisting>
<para>
- �����50,000�Ԗڂ̍s�̂������ <literal>OutOfMemoryException</literal>
�Ŏ��s����ł��傤�B
- Hibernate���Z�b�V�������x���L���b�V���ŁA
- �V�����}�����ꂽ���ׂĂ� <literal>Customer</literal>
- �C���X�^���X��L���b�V�����邩��ł��B
+ これは50,000番目の行のあたりで <literal>OutOfMemoryException</literal>
で失敗するでしょう。
+ Hibernateがセッションレベルキャッシュで、
+ 新しく挿入されたすべての <literal>Customer</literal>
+ インスタンスをキャッシュするからです。
</para>
<para>
- ���̏͂ł́A���̖���������@��Љ�܂��B
- �������o�b�`��������Ȃ�AJDBC�o�b�`���g�p�\�ł��邱�Ƃ����ɏd�v�ł��B
- �����łȂ���Ύ荠�ȃp�t�H�[�}���X�������܂���B
- JDBC�o�b�`�T�C�Y��荠�Ȑ��l�i�Ⴆ�A10����50�j�ɐݒ肵�Ă��������F
+ この章では、この問題を回避する方法を紹介します。
+ しかしバッチ処理をするなら、JDBCバッチが使用可能であることが非常に重要です。
+ そうでなければ手頃なパフォーマンスが得られません。
+ JDBCバッチサイズを手頃な数値(例えば、10から50)に設定してください:
</para>
<programlisting><![CDATA[hibernate.jdbc.batch_size
20]]></programlisting>
<para>
- �܂��L���b�V�����S�������Ȃ��v���Z�X�ŁA
- ���̂悤�ȍ�Ƃ������Ǝv���������܂���F
+ また二次キャッシュが全く効かないプロセスで、
+ このような作業をしたいと思うかもしれません:
</para>
<programlisting><![CDATA[hibernate.cache.use_second_level_cache
false]]></programlisting>
<para>
- �������A����͐�ɕK�v�Ƃ����킯�ł͂���܂���B
- �Ȃ��Ȃ疾���I�� <literal>CacheMode</literal> ��ݒ肵�āA
- �L���b�V���Ƃ̑��ݍ�p���ɂ��邱�Ƃ��ł��邩��ł��B
+ しかし、これは絶対に必要というわけではありません。
+ なぜなら明示的に <literal>CacheMode</literal> を設定して、
+ 二次キャッシュとの相互作用を無効にすることができるからです。
</para>
<sect1 id="batch-inserts">
- <title>�o�b�`�}��</title>
+ <title>バッチ挿入</title>
<para>
- �V�����I�u�W�F�N�g��i��������Ƃ��A�ꎟ�L���b�V���̃T�C�Y�𐧌����邽�߁A
- �Z�b�V������ <literal>flush()</literal> ����
<literal>clear()</literal>
- ���Ȃ���Ȃ�܂���B
+ 新しいオブジェクトを永続化するとき、一次キャッシュのサイズを制限するため、
+ セッションを <literal>flush()</literal> して
<literal>clear()</literal>
+ しなければなりません。
</para>
<programlisting><![CDATA[Session session = sessionFactory.openSession();
@@ -73,13 +75,13 @@
</sect1>
<sect1 id="batch-update" >
- <title>�o�b�`�X�V</title>
+ <title>バッチ更新</title>
<para>
- �f�[�^��������X�V�����肷��ɂ͓����A�C�f�B�A��K�p���܂��B
- ����ɉ����āA�f�[�^�̍s�𑽂��Ԃ��N�G���ɑ��ėL����
- �T�[�o�[�T�C�h�̃J�[�\���̗��_�����������
- <literal>scroll()</literal> ��g���K�v������܂��B
+ データを復元したり更新したりするには同じアイディアを適用します。
+ それに加えて、データの行を多く返すクエリに対して有効な
+ サーバーサイドのカーソルの利点を生かしたければ
+ <literal>scroll()</literal> を使う必要があります。
</para>
<programlisting><![CDATA[Session session = sessionFactory.openSession();
@@ -106,26 +108,26 @@
<sect1 id="batch-statelesssession">
<title>
- StatelessSession�C���^�[�t�F�C�X
+ StatelessSessionインターフェイス
</title>
<para>
- �܂��ʂ̕��@�Ƃ��āAHibernate�̓R�}���h�w����API��p�ӂ��Ă��܂��B
- ����͕����I�u�W�F�N�g�̌`�ŁA
- �f�[�^�x�[�X�Ƃ̃f�[�^�X�g���[���̂����Ɏg�����Ƃ��ł��܂��B
- <literal>StatelessSession</literal>
�͊֘A����i���R���e�L�X�g�������A
- �����x���̃��C�t�T�C�N���Z�}���e�B�N�X�̑�������܂���B
- ���ɃX�e�[�g���X�Z�b�V�����́A�ꎞ�L���b�V������������A
- �܂��ǂ̂悤�ȓL���b�V����N�G���L���b�V���Ƃ���ݍ�p���܂���B
- �g�����U�N�V���i����write-behind�⎩���_�[�e�B�`�F�b�N��������܂���B
- �X�e�[�g���X�Z�b�V������g���čs���鑀�삪�A
- �֘A����C���X�^���X�փJ�X�P�[�h����邱�Ƃ͌����Ă���܂���B
- �R���N�V�����́A�X�e�[�g���X�Z�b�V��������͖�������܂��B
- �X�e�[�g���X�Z�b�V������ʂ��čs���鑀��́A
- Hibernate�̃C�x���g���f����C���^�[�Z�v�^�̉e����܂���B
- �ꎞ�L���b�V�������Ȃ����߁A
- �X�e�[�g���X�Z�b�V�����͕ʖ����f�[�^�ɏ�肭�Ώ��ł��܂���B
- �X�e�[�g���X�Z�b�V�����͒�x���̒��ۉ��ł���AJDBC�ɔ��ɂ悭���Ă��܂��B
+ また別の方法として、Hibernateはコマンド指向のAPIを用意しています。
+ これは分離オブジェクトの形で、
+ データベースとのデータストリームのやり取りに使うことができます。
+ <literal>StatelessSession</literal> は関連する永続コンテキストを持たず、
+ 高レベルのライフサイクルセマンティクスの多くを提供しません。
+ 特にステートレスセッションは、一時キャッシュを実装せず、
+ またどのような二次キャッシュやクエリキャッシュとも相互作用しません。
+ トランザクショナルなwrite-behindや自動ダーティチェックも実装しません。
+ ステートレスセッションを使って行われる操作が、
+ 関連するインスタンスへカスケードされることは決してありません。
+ コレクションは、ステートレスセッションからは無視されます。
+ ステートレスセッションを通して行われる操作は、
+ Hibernateのイベントモデルやインターセプタの影響を受けません。
+ 一時キャッシュを持たないため、
+ ステートレスセッションは別名を持つデータに上手く対処できません。
+ ステートレスセッションは低レベルの抽象化であり、JDBCに非常によく似ています。
</para>
@@ -144,20 +146,20 @@
session.close();]]></programlisting>
<para>
- ���̃R�[�h��ł́A�N�G�����Ԃ� <literal>Customer</literal>
- �C���X�^���X�͑����Ɂi�Z�b�V��������j��������邱�Ƃɒ��ӂ��Ă��������B
- ����́A�ǂ̂悤�ȉi���R���e�L�X�g�Ƃ�����Ċ֘A���܂���B
+ このコード例では、クエリが返す <literal>Customer</literal>
+ インスタンスは即座に(セッションから)分離されることに注意してください。
+ これは、どのような永続コンテキストとも決して関連しません。
</para>
<para>
- <literal>StatelessSession</literal> �C���^�[�t�F�C�X�Œ�`����Ă���
- <literal>insert(), update(), delete()</literal> �́A
- ��x���̒��ړI�ȃf�[�^�x�[�X����ƍl�����܂��B
- ���ʂƂ��āASQL�� <literal>INSERT, UPDATE, DELETE</literal>
�����ꂼ�ꑦ���Ɏ��s����܂��B
- ���̂悤�ɁA������ <literal>Session</literal>
�C���^�[�t�F�C�X�Œ�`����Ă���
+ <literal>StatelessSession</literal> インターフェイスで定義されている
+ <literal>insert(), update(), delete()</literal> は、
+ 低レベルの直接的なデータベース操作と考えられます。
+ 結果として、SQLの <literal>INSERT, UPDATE, DELETE</literal>
がそれぞれ即座に実行されます。
+ このように、これらは <literal>Session</literal> インターフェイスで定義されている
<literal>save(), saveOrUpdate(), delete()</literal>
- �Ƃ͔��ɈقȂ�Ӗ������܂��B
+ とは非常に異なる意味を持ちます。
</para>
@@ -165,68 +167,68 @@
<sect1 id="batch-direct" revision="3">
<title>
- DML�X�^�C���̑���
+ DMLスタイルの操作
</title>
<para>
- ���łɋc�_�����悤�ɁA�����I�����ߓI�ȃI�u�W�F�N�g/�����[�V���i���}�b�s���O�́A
- �I�u�W�F�N�g�̏�Ԃ̊Ǘ��ł���ƍl�����܂��B
- ����̓�������̃I�u�W�F�N�g�̏�Ԃ𗘗p�ł���Ƃ������Ƃł��B
- ���̂��߁iSQL�� <literal>�f�[�^���쌾��</literal> (DML) ���F
+ すでに議論したように、自動的かつ透過的なオブジェクト/リレーショナルマッピングは、
+ オブジェクトの状態の管理であると考えられます。
+ これはメモリ内のオブジェクトの状態を利用できるということです。
+ そのため(SQLの <literal>データ操作言語</literal> (DML) 文:
<literal>INSERT</literal>, <literal>UPDATE</literal>,
<literal>DELETE</literal>
- ��g���āj�f�[�^�x�[�X��̃f�[�^�ڑ��삵�Ă�A
- ��������̏�Ԃɂ͉e����^���܂���B
- ������Hibernate�́A�o���NSQL�X�^�C����DML�����s�ɑΉ����郁�\�b�h��p�ӂ��Ă��܂��B
- �����Hibernate�N�G������i<xref
linkend="queryhql">HQL</xref>�j
- ��ʂ��Ď��s����܂��B
+ を使って)データベース内のデータを直接操作しても、
+ メモリ内の状態には影響を与えません。
+ しかしHibernateは、バルクSQLスタイルのDML文実行に対応するメソッドを用意しています。
+ これはHibernateクエリ言語(<xref linkend="queryhql">HQL</xref>)
+ を通して実行されます。
</para>
<para>
- <literal>UPDATE</literal> ��
<literal>DELETE</literal> ���̋^���\���́F
- <literal>( UPDATE | DELETE ) FROM? �G���e�B�e�B�� (WHERE
����)?</literal> �ł��B
- ���ӂ��ׂ��_������������܂��F
+ <literal>UPDATE</literal> と <literal>DELETE</literal>
文の疑似構文は:
+ <literal>( UPDATE | DELETE ) FROM? エンティティ名 (WHERE 条件節)?</literal>
です。
+ 注意すべき点がいくつかあります:
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- from�߂ɂ����āAFROM�L�[���[�h�̓I�v�V�����ł��B
+ from節において、FROMキーワードはオプションです。
</para>
</listitem>
<listitem>
<para>
- from�߂ł͒P��̃G���e�B�e�B���������\�ŁA
- �C�ӂŕʖ���t���邱�Ƃ��ł��܂��B
- �G���e�B�e�B���ɕʖ����^������ƁA�ǂ̂悤�ȃv���p�e�B�Q�Ƃ�A
- ���̕ʖ���g���ďC�����Ȃ���Ȃ�܂���B
- ����G���e�B�e�B���ɕʖ����^�����Ȃ���A
- �ǂ̂悤�ȃv���p�e�B�Q�Ƃ�C�����Ă͂Ȃ�܂���B
+ from節では単一のエンティティ名だけが可能で、
+ 任意で別名を付けることができます。
+ エンティティ名に別名が与えられると、どのようなプロパティ参照も、
+ その別名を使って修飾しなければなりません。
+ もしエンティティ名に別名が与えられなければ、
+ どのようなプロパティ参照も修飾してはなりません。
</para>
</listitem>
<listitem>
<para>
- �i�ÖٓI�ł��ꖾ���I�ł���j<xref
linkend="queryhql-joins-forms">����</xref>
- ��o���NHQL�N�G����Ŏw�肷�邱�Ƃ͂ł��܂���B
- �T�u�N�G����where�߂Ŏg�����Ƃ��ł��܂�
- �T�u�N�G�����̂�̂́A������܂߂��܂��B
+ (暗黙的であれ明示的であれ)<xref
linkend="queryhql-joins-forms">結合</xref>
+ をバルクHQLクエリ内で指定することはできません。
+ サブクエリはwhere節で使うことができます
+ サブクエリそのものは、結合を含められます。
</para>
</listitem>
<listitem>
<para>
- where�߂̓I�v�V�����ł��B
+ where節はオプションです。
</para>
</listitem>
</itemizedlist>
<para>
- ��Ƃ��āAHQL�� <literal>UPDATE</literal> ����s����ɂ́A
- <literal>Query.executeUpdate()</literal>
���\�b�h��g�����������B
- �i���̃��\�b�h�͂��Ȃ��݂�JDBC
<literal>PreparedStatement.executeUpdate()</literal>
- ���疼�t�����܂����j�F
+ 例として、HQLの <literal>UPDATE</literal> を実行するには、
+ <literal>Query.executeUpdate()</literal> メソッドを使ってください。
+ (このメソッドはおなじみのJDBC
<literal>PreparedStatement.executeUpdate()</literal>
+ から名付けられました):
d
</para>
@@ -243,16 +245,16 @@
session.close();]]></programlisting>
<para>
- HQL�� <literal>UPDATE</literal>
���́A�f�t�H���g�ł́A��p����G���e�B�e�B��
- <xref
linkend="mapping-declaration-version">version</xref> ��
+ HQLの <literal>UPDATE</literal> 文は、デフォルトでは、作用するエンティティの
+ <xref
linkend="mapping-declaration-version">version</xref> や
<xref
linkend="mapping-declaration-timestamp">timestamp</xref>
- �v���p�e�B�̒l�ɂ͉e�����܂���B
- �����EJB3�̎d�l�ɂ�p����Ă��܂��B
- ������ <literal>versioned update</literal> ��g���āA
- <literal>version</literal> ��
<literal>timestamp</literal>
- �v���p�e�B�̒l�����I�Ƀ��Z�b�g�����邱�Ƃ��ł��܂��B
- ����� <literal>UPDATE</literal> �L�[���[�h�̌��
<literal>VERSIONED</literal>
- �L�[���[�h��lj����邱�Ƃōs���܂��B
+ プロパティの値には影響しません。
+ これはEJB3の仕様にも受け継がれています。
+ しかし <literal>versioned update</literal> を使って、
+ <literal>version</literal> や
<literal>timestamp</literal>
+ プロパティの値を強制的にリセットさせることができます。
+ これは <literal>UPDATE</literal> キーワードの後に
<literal>VERSIONED</literal>
+ キーワードを追加することで行えます。
</para>
<programlisting><![CDATA[Session session = sessionFactory.openSession();
@@ -266,13 +268,13 @@
session.close();]]></programlisting>
<para>
-
�J�X�^���o�[�W�����^�i<literal>org.hibernate.usertype.UserVersionType</literal>�j
- �� <literal>update versioned</literal>
���ƈꏏ�Ɏg���Ȃ����Ƃɒ��ӂ��Ă��������B
+
カスタムバージョン型(<literal>org.hibernate.usertype.UserVersionType</literal>)
+ は <literal>update versioned</literal> 文と一緒に使えないことに注意してください。
</para>
<para>
- HQL�� <literal>DELETE</literal> ����s����ɂ́A
- ���� <literal>Query.executeUpdate()</literal>
���\�b�h��g�����������F
+ HQLの <literal>DELETE</literal> を実行するには、
+ 同じ <literal>Query.executeUpdate()</literal> メソッドを使ってください:
</para>
@@ -288,87 +290,87 @@
session.close();]]></programlisting>
<para>
- <literal>Query.executeUpdate()</literal> ���\�b�h���Ԃ�
<literal>int</literal>
- �̒l�́A���̑��삪�e����y�ڂ����G���e�B�e�B�̐��ł��B
- ���ꂪ�e������f�[�^�x�[�X��̍s���ƁA���݂ɊW���邩�ǂ�����l���Ă݂Ă��������B
- HQL�o���N����́A���ʂƂ��āA���ۂ�SQL�����������s����邱�ƂɂȂ�܂��B
- �Ⴆ��joined-subclass�ł��B
- �Ԃ���鐔�́A���̕��ɂ���ĉe�����ꂽ���ۂ̃G���e�B�e�B�̐������܂��B
- joined-subclass�̗�ɖ߂�ƁA�T�u�N���X�̈�ɑ���폜�́A
- ���̃T�u�N���X���}�b�s���O���ꂽ�e�[�u�������ł͂Ȃ��A
- �u���[�g�v�e�[�u���ƌp���K�w����ɉ�����joined-subclass�̃e�[�u���̍폜�ɂȂ�܂��B
+ <literal>Query.executeUpdate()</literal> メソッドが返す
<literal>int</literal>
+ の値は、この操作が影響を及ぼしたエンティティの数です。
+ これが影響するデータベース内の行数と、相互に関係するかどうかを考えてみてください。
+ HQLバルク操作は、結果として、実際のSQL文が複数実行されることになります。
+ 例えばjoined-subclassです。
+ 返される数は、その文によって影響された実際のエンティティの数を示します。
+ joined-subclassの例に戻ると、サブクラスの一つに対する削除は、
+ そのサブクラスがマッピングされたテーブルだけではなく、
+ 「ルート」テーブルと継承階層をさらに下ったjoined-subclassのテーブルの削除になります。
</para>
<para>
- <literal>INSERT</literal> ���̋^���\���́F
- <literal>INSERT INTO �G���e�B�e�B�� �v���p�e�B���X�g
select��</literal> �ł��B
- ���ӂ��ׂ��_������������܂��F
+ <literal>INSERT</literal> 文の疑似構文は:
+ <literal>INSERT INTO エンティティ名 プロパティリスト select文</literal> です。
+ 注意すべき点がいくつかあります:
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- INSERT INTO ... SELECT ... �̌`���������T�|�[�g����Ă��܂��B
- INSERT INTO ... VALUES ... �̌`���̓T�|�[�g����Ă��܂���B
+ INSERT INTO ... SELECT ... の形式だけがサポートされています。
+ INSERT INTO ... VALUES ... の形式はサポートされていません。
</para>
<para>
- �v���p�e�B���X�g�́ASQL�� <literal>INSERT</literal>
���ɂ����� <literal>�J�����̎d�l</literal>
- �ɗގ����Ă��܂��B
- �p���̃}�b�s���O�Ɋ܂܂��G���e�B�e�B�ɑ��āA
- �N���X���x���Œ��ڒ�`���ꂽ�v���p�e�B�������A�v���p�e�B���X�g�Ɏg���܂��B
-
�X�[�p�[�N���X�̃v���p�e�B�͔F�߂�ꂸ�A�T�u�N���X�̃v���p�e�B�͌��ʂ�����܂���B
- ����������� <literal>INSERT</literal>
���́A�{���I�Ƀ|�����[�t�B�b�N�ł͂���܂���B
+ プロパティリストは、SQLの <literal>INSERT</literal> 文における
<literal>カラムの仕様</literal>
+ に類似しています。
+ 継承のマッピングに含まれるエンティティに対して、
+ クラスレベルで直接定義されたプロパティだけが、プロパティリストに使えます。
+ スーパークラスのプロパティは認められず、サブクラスのプロパティは効果がありません。
+ 言い換えると <literal>INSERT</literal> 文は、本質的にポリモーフィックではありません。
</para>
</listitem>
<listitem>
<para>
- select���̕Ԃ�l�̌^��insert�������҂���^�ƃ}�b�`���Ă���A
- ����select���͑Ó���HQL select�N�G���ƂȂ肦�܂��B
-
���݂��̃`�F�b�N��f�[�^�x�[�X�֔C����̂ł͂Ȃ��A�N�G���̃R���p�C�����Ƀ`�F�b�N���܂��B
- ���̂��Ƃ́A<emphasis>equal</emphasis>�Ƃ͈Ⴂ�A
- Hibernate�� <literal>Type</literal> �Ԃ�
<emphasis>equivalent</emphasis> �Ɋւ���
- ��������N�������Ƃɒ��ӂ��Ă��������B
- ����� <literal>org.hibernate.type.DataType</literal>
�Ƃ��Ē�`���ꂽ�v���p�e�B�ƁA
+ select文の返り値の型がinsert文が期待する型とマッチしていれば、
+ そのselect文は妥当なHQL selectクエリとなりえます。
+ 現在このチェックをデータベースへ任せるのではなく、クエリのコンパイル時にチェックします。
+ このことは、<emphasis>equal</emphasis>とは違い、
+ Hibernateの <literal>Type</literal> 間の
<emphasis>equivalent</emphasis> に関する
+ 問題を引き起こすことに注意してください。
+ これは <literal>org.hibernate.type.DataType</literal>
として定義されたプロパティと、
<literal>org.hibernate.type.TimestampType</literal>
- �Ƃ��Ē�`���ꂽ�v���p�e�B�̊Ԃ̃~�X�}�b�`�̖�������N�����܂��B
- �f�[�^�x�[�X���������ʂł��Ȃ��Ă�A�ϊ����邱�Ƃ��ł��Ă�A���̖��͔������܂��B
+ として定義されたプロパティの間のミスマッチの問題を引き起こします。
+ データベースがそれらを区別できなくても、変換することができても、この問題は発生します。
</para>
</listitem>
<listitem>
<para>
- id�v���p�e�B�ɑ��āAinsert���ɂ͓�̑I��������܂��B
- �v���p�e�B���X�g�Ŗ����I��id�v���p�e�B��w�肷�邩
- �i���̏ꍇ�A�Ή�����select������l������܂��j�A
- �v���p�e�B���X�g���珜�O���邩
- �i���̏ꍇ�A���������l���g���܂��j�̂����ꂩ�ł��B
- ��҂̑I���́A�f�[�^�x�[�X��𑀍삷��id�W�F�l���[�^��g���Ƃ��̂݁A���p�\�ł��B
-
���̑I����̂�ꍇ�A�u�C���������v�^�̃W�F�l���[�^��g���ƁA�\����͎��ɗ�O���������܂��B
- ���̋c�_�ł́A�C���f�[�^�x�[�X�^�W�F�l���[�^��
<literal>org.hibernate.id.SequenceGenerator</literal>
-
�i�Ƃ��̃T�u�N���X�j�ƁA<literal>org.hibernate.id.PostInsertIdentifierGenerator</literal>
- �̎����ł���ƍl���Ă��܂��B
-
�����ōł���ӂ��ׂ���O�́A<literal>org.hibernate.id.TableHiLoGenerator</literal>
�ł��B
- �l��擾����I��\�ȕ��@���Ȃ����߁A���̃W�F�l���[�^��g�����Ƃ͂ł��܂���B
+ idプロパティに対して、insert文には二つの選択肢があります。
+ プロパティリストで明示的にidプロパティを指定するか
+ (この場合、対応するselect式から値が取られます)、
+ プロパティリストから除外するか
+ (この場合、生成される値が使われます)のいずれかです。
+ 後者の選択肢は、データベース内を操作するidジェネレータを使うときのみ、利用可能です。
+ この選択肢を採る場合、「インメモリ」型のジェネレータを使うと、構文解析時に例外が発生します。
+ この議論では、インデータベース型ジェネレータは
<literal>org.hibernate.id.SequenceGenerator</literal>
+
(とそのサブクラス)と、<literal>org.hibernate.id.PostInsertIdentifierGenerator</literal>
+ の実装であると考えています。
+
ここで最も注意すべき例外は、<literal>org.hibernate.id.TableHiLoGenerator</literal> です。
+ 値を取得する選択可能な方法がないため、このジェネレータを使うことはできません。
</para>
</listitem>
<listitem>
<para>
- <literal>version</literal> ��
<literal>timestamp</literal> �Ƃ��ă}�b�s���O�����v���p�e�B�ɑ��āA
- insert���ɂ͓�̑I��������܂��B
- �v���p�e�B���X�g�Ŗ����I�Ƀv���p�e�B��w�肷�邩
- �i���̏ꍇ�A�Ή�����select������l������܂��j�A
- �v���p�e�B���X�g���珜�O���邩
-
�i���̏ꍇ�A<literal>org.hibernate.type.VersionType</literal> �Œ�`���ꂽ
- <literal>�V�[�h�l</literal> ���g���܂��j�̂����ꂩ�ł��B
+ <literal>version</literal> や
<literal>timestamp</literal> としてマッピングされるプロパティに対して、
+ insert文には二つの選択肢があります。
+ プロパティリストで明示的にプロパティを指定するか
+ (この場合、対応するselect式から値が取られます)、
+ プロパティリストから除外するか
+ (この場合、<literal>org.hibernate.type.VersionType</literal>
で定義された
+ <literal>シード値</literal> が使われます)のいずれかです。
</para>
</listitem>
</itemizedlist>
<para>
- HQL�� <literal>INSERT</literal> ���̎��s��ł��F
+ HQLの <literal>INSERT</literal> 文の実行例です:
</para>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/best_practices.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/best_practices.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/best_practices.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,246 +1,248 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="best-practices" revision="3">
- <title>�x�X�g�v���N�e�B�X</title>
+ <title>ベストプラクティス</title>
<variablelist spacing="compact">
<varlistentry>
<term>
- �N���X�ׂ͍������x�ŏ���
<literal><component></literal>
�Ń}�b�s���O���܂��傤�B</term>
+ クラスは細かい粒度で書き <literal><component></literal>
でマッピングしましょう。</term>
<listitem>
<para>
- <literal>street</literal>�i�ʂ�j,
<literal>suburb</literal>
- �i�s�s�j, <literal>state</literal>�i�B�j,
<literal>postcode</literal>
- �i�X�֔ԍ��j��J�v�Z��������
<literal>Address</literal>�i�Z���j�N���X��g���܂��傤�B
- ��������R�[�h���ė��p���₷���Ȃ�A���t�@�N�^�����O��ȒP�ɂȂ�܂��B
+ <literal>street</literal>(通り),
<literal>suburb</literal>
+ (都市), <literal>state</literal>(州),
<literal>postcode</literal>
+ (郵便番号)をカプセル化する <literal>Address</literal>(住所)クラスを使いましょう。
+ そうすればコードが再利用しやすくなり、リファクタリングも簡単になります。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
- �i���N���X�ɂ͎��ʎq�v���p�e�B���`���܂��傤�B</term>
+ 永続クラスには識別子プロパティを定義しましょう。</term>
<listitem>
<para>
- Hibernate�ł͎��ʎq�v���p�e�B�̓I�v�V�����ł����A
- �g�p���ׂ����R����������܂��B
- ���ʎq�́u�l�H�I�v�i�������ꂽ�A�Ɩ��I�ȈӖ������Ȃ��j
- �Ȃ�̂ɂ��邱�Ƃ������߂��܂��B
+ Hibernateでは識別子プロパティはオプションですが、
+ 使用すべき理由がたくさんあります。
+ 識別子は「人工的」(生成された、業務的な意味を持たない)
+ なものにすることをおすすめします。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>���R�L�[�����܂��傤�B</term>
+ <term>自然キーを見つけましょう。</term>
<listitem>
<para>
- ���ׂẴG���e�B�e�B�ɑ��Ď��R�L�[�����āA
- <literal><natural-id></literal>
�Ń}�b�s���O���܂��傤�B
- ���R�L�[��\������v���p�e�B���r���邽�߂ɁA
- <literal>equals()</literal> ��
<literal>hashCode()</literal> ��������܂��傤�B
+ すべてのエンティティに対して自然キーを見つけて、
+ <literal><natural-id></literal>
でマッピングしましょう。
+ 自然キーを構成するプロパティを比較するために、
+ <literal>equals()</literal> と
<literal>hashCode()</literal> を実装しましょう。
</para>
</listitem>
</varlistentry>
<varlistentry>
-
<term>�N���X�̃}�b�s���O�͂��ꂼ��̃N���X��p�̃t�@�C���ɏ����܂��傤�B</term>
+ <term>クラスのマッピングはそれぞれのクラス専用のファイルに書きましょう。</term>
<listitem>
<para>
- �P��̋���ȃ}�b�s���O�h�L�������g��g�p���Ȃ��ł��������B
- <literal>com.eg.Foo</literal> �N���X�Ȃ�
- <literal>com/eg/Foo.hbm.xml</literal>
�t�@�C���Ƀ}�b�s���O���܂��傤�B
- ���̂��Ƃ́A���Ƀ`�[���ł̊J���ɈӖ�������܂��B
+ 単一の巨大なマッピングドキュメントを使用しないでください。
+ <literal>com.eg.Foo</literal> クラスなら
+ <literal>com/eg/Foo.hbm.xml</literal> ファイルにマッピングしましょう。
+ このことは、特にチームでの開発に意味があります。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>���\�[�X�Ƃ��ă}�b�s���O���[�h���܂��傤�B</term>
+ <term>リソースとしてマッピングをロードしましょう。</term>
<listitem>
<para>
- �}�b�s���O��A����炪�}�b�s���O���邷��N���X�ƈꏏ�ɔz�u���܂��傤�B
+ マッピングを、それらがマッピングするするクラスと一緒に配置しましょう。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>�N�G���������O���ɒu�����Ƃ�l���܂��傤</term>
+ <term>クエリ文字列を外部に置くことを考えましょう</term>
<listitem>
<para>
- �N�G����ANSI�W���łȂ�SQL����Ă�ł���Ȃ�A����͂悢�v���N�e�B�X�ł��B
-
�N�G���������}�b�s���O�t�@�C���֊O�o������A�v���P�[�V�������|�[�^�u���ɂȂ�܂��B
+ クエリがANSI標準でないSQL関数を呼んでいるなら、これはよいプラクティスです。
+ クエリ文字列をマッピングファイルへ外出しすればアプリケーションがポータブルになります。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>�o�C���h�ϐ���g���܂��傤�B</term>
+ <term>バインド変数を使いましょう。</term>
<listitem>
<para>
- JDBC�̏ꍇ�Ɠ����悤�ɁA�萔�łȂ��l�͕K��"?"�Œu�������܂��傤�B
- �萔�łȂ��l��o�C���h���邽�߂ɁA�N�G���ŕ������g���Ă͂����܂���B
- ���O�t���̃p�����[�^��g���悤�ɂ���Ƃ���ɗǂ��ł��B
+ JDBCの場合と同じように、定数でない値は必ず"?"で置き換えましょう。
+ 定数でない値をバインドするために、クエリで文字列操作を使ってはいけません。
+ 名前付きのパラメータを使うようにするとさらに良いです。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>JDBC�R�l�N�V������Ǘ����Ă͂����܂���B</term>
+ <term>JDBCコネクションを管理してはいけません。</term>
<listitem>
<para>
-
Hibernate�ł̓A�v���P�[�V������JDBC�R�l�N�V������Ǘ����邱�Ƃ�������Ă��܂��B
- ����������͍ŏI��i���Ǝv���Ă��������B
- �g�ݍ��݂̃R�l�N�V�����v���o�C�_��g�����Ƃ��ł��Ȃ���A
-
<literal>org.hibernate.connection.ConnectionProvider</literal>
��������邱�Ƃ�l���Ă��������B
+ HibernateではアプリケーションがJDBCコネクションを管理することが許されています。
+ しかしこれは最終手段だと思ってください。
+ 組み込みのコネクションプロバイダを使うことができなければ、
+
<literal>org.hibernate.connection.ConnectionProvider</literal>
を実装することを考えてください。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>�J�X�^���^�̎g�p��l���܂��傤�B</term>
+ <term>カスタム型の使用を考えましょう。</term>
<listitem>
<para>
- ���郉�C�u�������玝���Ă���Java�^��i��������K�v������Ƃ��܂��傤�B
-
���������̌^�ɂ́A�R���|�[�l���g�Ƃ��ă}�b�s���O���邽�߂ɕK�v�ȃA�N�Z�T���Ȃ��Ƃ��܂��B
- ���̂悤�ȏꍇ�� <literal>org.hibernate.UserType</literal>
�̎�����l����ׂ��ł��B
-
���������Hibernate�^�Ƃ̎����ϊ���S�z�����ɃA�v���P�[�V�����̃R�[�h�����܂��B
+ あるライブラリから持ってきたJava型を永続化する必要があるとしましょう。
+ しかしその型には、コンポーネントとしてマッピングするために必要なアクセサがないとします。
+ このような場合は <literal>org.hibernate.UserType</literal>
の実装を考えるべきです。
+ そうすればHibernate型との実装変換を心配せずにアプリケーションのコードを扱えます。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>�{�g���l�b�N��������ɂ�JDBC��n���h�R�[�h���܂��傤�B</term>
+ <term>ボトルネックを解消するにはJDBCをハンドコードしましょう。</term>
<listitem>
<para>
- �V�X�e���̃p�t�H�[�}���X�N���e�B�J���ȗ̈�ł́A
- �����̑����JDBC�ڎg���Ɨǂ��������܂���B
- �����������{�g���l�b�N�ɂȂ��Ă��邩
<emphasis>�͂����肷��</emphasis> �܂ł͑҂��Ă��������B
- �܂�JDBC�ڎg������Ƃ����āA�K����������Ȃ�Ƃ͌���Ȃ����Ƃ�����Ă��������B
- JDBC�ڎg���K�v������AHibernate��
<literal>Session</literal> ��I�[�v�����āA
- JDBC�R�l�N�V������g���Ɨǂ��������܂���B
- �ˑR�Ƃ��ē����g�����U�N�V�����헪�ƃR�l�N�V�����v���o�C�_���g���邩��ł��B
+ システムのパフォーマンスクリティカルな領域では、
+ ある種の操作にJDBCを直接使うと良いかもしれません。
+ しかし何がボトルネックになっているか <emphasis>はっきりする</emphasis>
までは待ってください。
+ またJDBCを直接使うからといって、必ずしも速くなるとは限らないことも理解してください。
+ JDBCを直接使う必要があれば、Hibernateの <literal>Session</literal>
をオープンして、
+ JDBCコネクションを使うと良いかもしれません。
+ 依然として同じトランザクション戦略とコネクションプロバイダが使えるからです。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term><literal>Session</literal>
�̃t���b�V���𗝉��܂��傤�B</term>
+ <term><literal>Session</literal>
のフラッシュを理解しましょう。</term>
<listitem>
<para>
- Session���i����Ԃ�f�[�^�x�[�X�Ɠ��������邱�Ƃ��Ƃ��ǂ�����܂��B
- ���������ꂪ���܂�ɕp�ɂɋN����悤���ƁA�p�t�H�[�}���X�ɉe�����o�Ă��܂��B
-
�����t���b�V�����ɂ�����A����̃g�����U�N�V�����̃N�G���⑀��̏��Ԃ�ύX���邱�ƂŁA
- �s�K�v�ȃt���b�V����ŏ����ɂł��܂��B
+ Sessionが永続状態をデータベースと同期させることがときどきあります。
+ しかしこれがあまりに頻繁に起こるようだと、パフォーマンスに影響が出てきます。
+ 自動フラッシュを無効にしたり、特定のトランザクションのクエリや操作の順番を変更することで、
+ 不必要なフラッシュを最小限にできます。
</para>
</listitem>
</varlistentry>
<varlistentry>
-
<term>3�w�A�[�L�e�N�`���ł͕����I�u�W�F�N�g�̎g�p��l���܂��傤�B</term>
+ <term>3層アーキテクチャでは分離オブジェクトの使用を考えましょう。</term>
<listitem>
<para>
- �T�[�u���b�g / �Z�b�V�����r�[���A�[�L�e�N�`����g���Ƃ��A
- �T�[�u���b�g�w /
JSP�w�ԂŃZ�b�V�����r�[���Ń��[�h�����i���I�u�W�F�N�g������ł��܂��B
- ���̍ۃ��N�G�X�g���ƂɐV����Session��g���Ă��������B
- �܂� <literal>Session.merge()</literal> ��
<literal>Session.saveOrUpdate()</literal>
- ��g���āA�I�u�W�F�N�g�ƃf�[�^�x�[�X�������Ă��������B
+ サーブレット / セッションビーンアーキテクチャを使うとき、
+ サーブレット層 / JSP層間でセッションビーンでロードした永続オブジェクトをやり取りできます。
+ その際リクエストごとに新しいSessionを使ってください。
+ また <literal>Session.merge()</literal> や
<literal>Session.saveOrUpdate()</literal>
+ を使って、オブジェクトとデータベースを同期させてください。
</para>
</listitem>
</varlistentry>
<varlistentry>
-
<term>2�w�A�[�L�e�N�`���ł͒����i���R���e�L�X�g�̎g�p��l���܂��傤�B</term>
+ <term>2層アーキテクチャでは長い永続コンテキストの使用を考えましょう。</term>
<listitem>
<para>
- �ō��̃X�P�[���r���e�B��ɂ́A
- �f�[�^�x�[�X�g�����U�N�V������ł��邾���Z�����Ȃ���Ȃ�܂���B
- �����������Ԏ��s����
<emphasis>�A�v���P�[�V�����g�����U�N�V����</emphasis>
- �̎������K�v�Ȃ��Ƃ͂����ł��B
- ����̓��[�U�̎��_�����1�̍�ƒP�ʁiunit of work�j�ɂȂ�܂��B
-
�A�v���P�[�V�����g�����U�N�V�����͂������̃N���C�A���g�̃��N�G�X�g/���X�|���X�T�C�N���ɂ܂�����܂��B
-
�A�v���P�[�V�����g�����U�N�V�����̎����ɕ����I�u�W�F�N�g��g���͈̂�ʓI�ł��B
+ 最高のスケーラビリティを得るには、
+ データベーストランザクションをできるだけ短くしなければなりません。
+ しかし長い間実行する <emphasis>アプリケーショントランザクション</emphasis>
+ の実装が必要なことはしばしばです。
+ これはユーザの視点からは1個の作業単位(unit of work)になります。
+ アプリケーショントランザクションはいくつかのクライアントのリクエスト/レスポンスサイクルにまたがります。
+ アプリケーショントランザクションの実装に分離オブジェクトを使うのは一般的です。
- �����łȂ���A2�w�A�[�L�e�N�`���̏ꍇ�͓��ɓK�Ȃ��Ƃł����A
- �A�v���P�[�V�����g�����U�N�V�����̃��C�t�T�C�N���S�̂ɑ���
- �P��̃I�[�v���ȉi�����R���e�L�X�g�i�Z�b�V�����j��ێ����Ă��������B
- �����ĒP���Ƀ��N�G�X�g�̍Ō��JDBC�R�l�N�V��������ؒf���A
- ���̃��N�G�X�g�̍ŏ��ɍĐڑ����܂��B
+ そうでなければ、2層アーキテクチャの場合は特に適切なことですが、
+ アプリケーショントランザクションのライフサイクル全体に対して
+ 単一のオープンな永続化コンテキスト(セッション)を維持してください。
+ そして単純にリクエストの最後にJDBCコネクションから切断し、
+ 次のリクエストの最初に再接続します。
- �����ĕ����̃A�v���P�[�V�����g�����U�N�V�������[�X�P�[�X�ɓn����
- 1��Session��g���Ȃ��ł��������B
- �����łȂ���A�Â��f�[�^�ō�Ƃ��邱�ƂɂȂ�܂��B
+ 決して複数のアプリケーショントランザクションユースケースに渡って
+ 1個のSessionを使い回さないでください。
+ そうでなければ、古いデータで作業することになります。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>��O�A�\�Ȃ�̂Ƃ��Ĉ����Ă͂����܂���B</term>
+ <term>例外を復帰可能なものとして扱ってはいけません。</term>
<listitem>
<para>
- ����́u�x�X�g�v�v���N�e�B�X�ȏ�́A�K�{�̃v���N�e�B�X�ł��B
- ��O�����������Ƃ��� <literal>Transaction</literal>
���[���o�b�N���āA
- <literal>Session</literal> ��N���[�Y�����������B
- �������Ȃ���Hibernate�̓������̏�Ԃ��i����Ԃ𐳊m�ɕ\�����Ă��邱�Ƃ�ۏł��܂���B
-
���̓��ʂȏꍇ�Ƃ��āA�^����ꂽ���ʎq���C���X�^���X���f�[�^�x�[�X�ɑ��݂��邩�ǂ����肷�邽�߂ɁA
- <literal>Session.load()</literal> ��g�����Ƃ͂�߂Ă��������B
- ���̑���� <literal>Session.get()</literal>
���N�G����g�����������B
+ これは「ベスト」プラクティス以上の、必須のプラクティスです。
+ 例外が発生したときは <literal>Transaction</literal> をロールバックして、
+ <literal>Session</literal> をクローズしてください。
+ そうしないとHibernateはメモリの状態が永続状態を正確に表現していることを保証できません。
+ この特別な場合として、与えられた識別子を持つインスタンスがデータベースに存在するかどうかを判定するために、
+ <literal>Session.load()</literal> を使うことはやめてください。
+ その代わりに <literal>Session.get()</literal> かクエリを使ってください。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>�֘A�ɂ͂Ȃ�ׂ��x���t�F�b�`��g���܂��傤�B</term>
+ <term>関連にはなるべく遅延フェッチを使いましょう。</term>
<listitem>
<para>
- �����t�F�b�`�͍T���߂ɂ��܂��傤�B
- �L���b�V���ɂ͊��S�ɕێ�����Ȃ��悤�ȃN���X�̊֘A�ɂ́A
- �v���L�V�ƒx���R���N�V������g���Ă��������B
-
�L���b�V�������N���X�̊֘A�A�܂�L���b�V�����q�b�g����\�������ɍ����֘A�́A
- <literal>lazy="false"</literal>
�ŐϋɓI�ȃt�F�b�`���I�ɖ����ɂ��Ă��������B
- �����t�F�b�`���K�ȓ���̃��[�X�P�[�X�ɂ́A
- �N�G���� <literal>left join fetch</literal>
��g�����������B
+ 即時フェッチは控えめにしましょう。
+ 二次キャッシュには完全に保持されないようなクラスの関連には、
+ プロキシと遅延コレクションを使ってください。
+ キャッシュされるクラスの関連、つまりキャッシュがヒットする可能性が非常に高い関連は、
+ <literal>lazy="false"</literal>
で積極的なフェッチを明示的に無効にしてください。
+ 結合フェッチが適切な特定のユースケースには、
+ クエリで <literal>left join fetch</literal> を使ってください。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
- �t�F�b�`����Ă��Ȃ��f�[�^�Ɋւ�������邽�߂ɁA
- <emphasis>�r���[�̒��ŃI�[�v���Z�b�V������g��(open session in
view)</emphasis>
- �p�^�[�����A�������ꂽ <emphasis>�g�ݗ��ăt�F�[�Y(assembly
phase)</emphasis> ��g���܂��傤�B
+ フェッチされていないデータに関わる問題を避けるために、
+ <emphasis>ビューの中でオープンセッションを使う(open session in view)</emphasis>
+ パターンか、統制された <emphasis>組み立てフェーズ(assembly phase)</emphasis>
を使いましょう。
</term>
<listitem>
<para>
- Hibernate�� <emphasis>Data Transfer Objects</emphasis>
(DTO)�����ދ��ȍ�Ƃ���J���҂������܂��B
- �`���I��EJB�A�[�L�e�N�`���ł�DTO�͓�ړI������܂��F
- 1�ڂ́A�G���e�B�e�B�r�[�����V���A���C�Y����Ȃ����ւ̑�ł��B
- 2�ڂ́A�v���[���e�[�V�����w�ɐ��䂪�߂�O�ɁA
-
�r���[�Ɏg���邷�ׂẴf�[�^���t�F�b�`����āADTO�ɕ��������悤�ȑg�ݗ��ăt�F�[�Y��ÖٓI�ɒ�`���܂��B
- Hibernate�ł�1�ڂ̖ړI���s�v�ɂȂ�܂��B
-
�������r���[�̃����_�����O�����̊ԁA�i���R���e�L�X�g�i�Z�b�V�����j��I�[�v���ɂ����܂܂ɂ��Ȃ���A
-
�g�ݗ��ăt�F�[�Y�͂܂��K�v�ł��i�����I�u�W�F�N�g�̒��̂ǂ̃f�[�^�����p�\���ɂ��āA
-
�v���[���e�[�V�����w�ƌ����Ȏ�茈�߂��Ă���r�W�l�X���\�b�h��l���Ă݂Ă��������j�B
- �����Hibernate���̖��ł͂���܂���B
- �g�����U�N�V������ň��S�Ƀf�[�^�A�N�Z�X���邽�߂̊�{�I�ȗv���ł��B
+ Hibernateは <emphasis>Data Transfer Objects</emphasis>
(DTO)を書く退屈な作業から開発者を解放します。
+ 伝統的なEJBアーキテクチャではDTOは二つ目的があります:
+ 1つ目は、エンティティビーンがシリアライズされない問題への対策です。
+ 2つ目は、プレゼンテーション層に制御が戻る前に、
+ ビューに使われるすべてのデータがフェッチされて、DTOに復元されるような組み立てフェーズを暗黙的に定義します。
+ Hibernateでは1つ目の目的が不要になります。
+ しかしビューのレンダリング処理の間、永続コンテキスト(セッション)をオープンにしたままにしなければ、
+ 組み立てフェーズはまだ必要です(分離オブジェクトの中のどのデータが利用可能かについて、
+ プレゼンテーション層と厳密な取り決めをしているビジネスメソッドを考えてみてください)。
+ これはHibernate側の問題ではありません。
+ トランザクション内で安全にデータアクセスするための基本的な要件です。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>Hibernate����r�W�l�X���W�b�N�𒊏ۉ����邱�Ƃ�l���܂��傤�B</term>
+ <term>Hibernateからビジネスロジックを抽象化することを考えましょう。</term>
<listitem>
<para>
- �C���^�[�t�F�C�X�ŁiHibernate�́j�f�[�^�A�N�Z�X�R�[�h��B�����܂��傤�B
- <emphasis>DAO</emphasis> �� <emphasis>Thread Local
Session</emphasis> �p�^�[����g�ݍ��킹�܂��傤�B
- <literal>UserType</literal> ��Hibernate�Ɋ֘A�t����ƁA
- �n���h�R�[�h����JDBC�ʼni��������N���X�����Ƃ�ł��܂��B
- �i���̃A�h�o�C�X�́u�\���傫�ȁv�A�v���P�[�V�����ɑ��Ă̂�̂ł��B
- �e�[�u����5�����Ȃ��悤�ȃA�v���P�[�V�����ɂ͓��Ă͂܂�܂���B�j
+ インターフェイスで(Hibernateの)データアクセスコードを隠蔽しましょう。
+ <emphasis>DAO</emphasis> と <emphasis>Thread Local
Session</emphasis> パターンを組み合わせましょう。
+ <literal>UserType</literal> でHibernateに関連付けると、
+ ハンドコードしたJDBCで永続化するクラスを持つこともできます。
+ (このアドバイスは「十分大きな」アプリケーションに対してのものです。
+ テーブルが5個しかないようなアプリケーションには当てはまりません。)
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>�������֘A�}�b�s���O�͎g��Ȃ��悤�ɂ��܂��傤�B</term>
+ <term>珍しい関連マッピングは使わないようにしましょう。</term>
<listitem>
<para>
- �悢���[�X�P�[�X�ɖ{���̑��Α��֘A�����邱�Ƃ͋H�i�܂�j�ł��B
- �قƂ�ǂ̏ꍇ�u�����N�e�[�u���v�̕t���I�ȏ�K�v�ɂȂ�܂��B
- ���̏ꍇ�A�����N�N���X��2��1�Α��֘A��g�����������Ɨǂ��ł��B
- ���ۂقƂ�ǂ̏ꍇ�֘A��1�Α��Ƒ���1�Ȃ̂ŁA
- ���̃X�^�C���̊֘A��g���Ƃ��͖{���ɕK�v���ǂ�����l���Ă݂Ă��������B
+ よいユースケースに本当の多対多関連があることは稀(まれ)です。
+ ほとんどの場合「リンクテーブル」の付加的な情報が必要になります。
+ この場合、リンククラスに2つの1対多関連を使う方がずっと良いです。
+ 実際ほとんどの場合関連は1対多と多対1なので、
+ 他のスタイルの関連を使うときは本当に必要かどうかを考えてみてください。
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>�Ȃ�ׂ��o�����֘A�ɂ��܂��傤�B</term>
+ <term>なるべく双方向関連にしましょう。</term>
<listitem>
<para>
- �P�����֘A�͑o�����ɔ�ׂČ���������Ȃ�܂��B
- �傫�ȃA�v���P�[�V�����ł́A
- �قƂ�ǂ��ׂĂ̊֘A���o�����Ƀi�r�Q�[�V�����ł��Ȃ���Ȃ�܂���B
+ 単方向関連は双方向に比べて検索が難しくなります。
+ 大きなアプリケーションでは、
+ ほとんどすべての関連が双方向にナビゲーションできなければなりません。
</para>
</listitem>
</varlistentry>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/collection_mapping.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/collection_mapping.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/collection_mapping.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,14 +1,16 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="collections">
- <title>�R���N�V�����̃}�b�s���O</title>
+ <title>コレクションのマッピング</title>
<sect1 id="collections-persistent" revision="3">
- <title>�R���N�V�����̉i����</title>
+ <title>コレクションの永続化</title>
<para>
- �R���N�V�����^�̃t�B�[���h��i��������ɂ́A
- ���̃R���N�V�����^���C���^�[�t�F�C�X�^�ł���K�v������܂��B
- �Ⴆ�A
+ コレクション型のフィールドを永続化するには、
+ そのコレクション型がインターフェイス型である必要があります。
+ 例えば、
</para>
<programlisting><![CDATA[public class Product {
@@ -22,25 +24,25 @@
}]]></programlisting>
<para>
- ���݂���C���^�[�t�F�C�X�ɂ� <literal>java.util.Set</literal>�A
-
<literal>java.util.Collection</literal>�A<literal>java.util.List</literal>�A
-
<literal>java.util.Map</literal>�A<literal>java.util.SortedSet</literal>�A
- <literal>java.util.SortedMap</literal> �Ȃǂ�����܂��B
- �܂��́A�C�ӂ̃C���^�[�t�F�C�X���g���܂��I
- �i�������A�C�ӂ̃C���^�[�t�F�C�X��g�p����ꍇ�́A
+ 実在するインターフェイスには <literal>java.util.Set</literal>、
+
<literal>java.util.Collection</literal>、<literal>java.util.List</literal>、
+
<literal>java.util.Map</literal>、<literal>java.util.SortedSet</literal>、
+ <literal>java.util.SortedMap</literal> などがあります。
+ または、任意のインターフェイスが使えます!
+ (ただし、任意のインターフェイスを使用する場合は、
<literal>org.hibernate.usertype.UserCollectionType</literal>
- �̎����N���X��쐬����K�v������܂��B�j
+ の実装クラスを作成する必要があります。)
</para>
<para>
- <literal>HashSet</literal> �̃C���X�^���X���C���X�^���X�ϐ���
- �ǂ̂悤�ɏ���������邩�ɒ��ڂ��Ă݂܂��傤�B
- ����͐V���ɐ������ꂽ�i�i��������Ă��Ȃ��j�R���N�V�����^�̃v���p�e�B��
- ����������œK�ȕ��@�ł��B
- �i�Ⴆ�� <literal>persist()</literal>
�ɂ��j�C���X�^���X��i�������悤�Ƃ����Ƃ��A
- Hibernate�� <literal>HashSet</literal> ��Hibernate�Ǝ���
<literal>Set</literal>
- �̎����N���X�ɒu�������܂��B
- ���̂��߁A���̂悤�ȃG���[�ɂ͒��ӂ��K�v�ł��B
+ <literal>HashSet</literal> のインスタンスを持つインスタンス変数が
+ どのように初期化されるかに注目してみましょう。
+ これは新たに生成された(永続化されていない)コレクション型のプロパティを
+ 初期化する最適な方法です。
+ (例えば <literal>persist()</literal> により)インスタンスを永続化しようとしたとき、
+ Hibernateは <literal>HashSet</literal> をHibernate独自の
<literal>Set</literal>
+ の実装クラスに置き換えます。
+ このため、次のようなエラーには注意が必要です。
</para>
<programlisting><![CDATA[Cat cat = new DomesticCat();
@@ -54,39 +56,39 @@
(HashSet) cat.getKittens(); // Error!]]></programlisting>
<para>
- Hibernate�ɂ�蒍�����ꂽ�i�����R���N�V�����́A�C���^�[�t�F�C�X�^�ɉ����āA
- <literal>HashMap</literal> ��
<literal>HashSet</literal>�A
- <literal>TreeMap</literal>�A
<literal>TreeSet</literal>�A
- <literal>ArrayList</literal> �̂悤�ɐU�����܂��B
+ Hibernateにより注入された永続性コレクションは、インターフェイス型に応じて、
+ <literal>HashMap</literal> や
<literal>HashSet</literal>、
+ <literal>TreeMap</literal>、
<literal>TreeSet</literal>、
+ <literal>ArrayList</literal> のように振舞います。
</para>
<para>
- �R���N�V�����C���X�^���X�́A�l�^�Ƃ��ĕ��ʂɐU�����܂��B
- �i�����I�u�W�F�N�g�ɎQ�Ƃ��ꂽ�Ƃ��Ɏ����I�ɉi��������A
- �Q�Ƃ��Ȃ��Ȃ����Ƃ��Ɏ����I�ɍ폜����܂��B
- �������i�����I�u�W�F�N�g����ʂ̉i�����I�u�W�F�N�g�ɓn���ꂽ��A
- ���̗v�f�͌��݂̃e�[�u������ʂ̃e�[�u���Ɉړ����邩�����܂���B
- �Q�̃G���e�B�e�B�������R���N�V�����C���X�^���X���L���Ă͂����܂���B
- �����[�V���i�����f����x�[�X�ɂ��Ă��邽�߁A�R���N�V�����^�̃v���p�e�B��
- null�l�������Ă�Ӗ�������܂���B
- �܂�Hibernate�͎Q�Ɛ�̂Ȃ��R���N�V�����Ƌ�̃R���N�V�������ʂ��܂���B
+ コレクションインスタンスは、値型として普通に振舞います。
+ 永続化オブジェクトに参照されたときに自動的に永続化され、
+ 参照がなくなったときに自動的に削除されます。
+ もしある永続化オブジェクトから別の永続化オブジェクトに渡されたら、
+ その要素は現在のテーブルから別のテーブルに移動するかもしれません。
+ 2つのエンティティが同じコレクションインスタンスを共有してはいけません。
+ リレーショナルモデルをベースにしているため、コレクション型のプロパティに
+ null値を代入しても意味がありません。
+ つまりHibernateは参照先のないコレクションと空のコレクションを区別しません。
</para>
<para>
- ����������قǐS�z���Ȃ��Ă�\���܂���B
- ���i�g���Ă���Java�̃R���N�V�����Ɠ����悤�ɁA�i�����R���N�V������g���Ă��������B
- �o�����֘A�̈Ӗ��𗝉���悢�̂ł��i����͌�قǐ�����܂��j�B
+ しかしそれほど心配しなくても構いません。
+ 普段使っているJavaのコレクションと同じように、永続化コレクションを使ってください。
+ 双方向関連の意味を理解すればよいのです(これは後ほど説明します)。
</para>
</sect1>
<sect1 id="collections-mapping" revision="4">
- <title>�R���N�V�����̃}�b�s���O</title>
+ <title>コレクションのマッピング</title>
<para>
- �R���N�V������}�b�s���O���邽�߂̃}�b�s���O�v�f�́A�C���^�[�t�F�C�X�̌^�Ɉˑ����܂��B
- �Ⴆ�A<literal><set></literal> �v�f��
<literal>Set</literal> �^��
- �}�b�s���O���邽�߂Ɏg���܂��B
+ コレクションをマッピングするためのマッピング要素は、インターフェイスの型に依存します。
+ 例えば、<literal><set></literal> 要素は
<literal>Set</literal> 型を
+ マッピングするために使います。
</para>
<programlisting><![CDATA[<class name="Product">
@@ -98,10 +100,10 @@
</class>]]></programlisting>
<para>
- �}�b�s���O�v�f�ɂ� <literal><set></literal> �̑���
<literal><list></literal>�A
-
<literal><map></literal>�A<literal><bag></literal>�A
-
<literal><array></literal>�A<literal><primitive-array></literal>
������܂��B
- ��\�Ƃ��āA<literal><map></literal>
�v�f���L�Ɏ����܂��B
+ マッピング要素には <literal><set></literal> の他に
<literal><list></literal>、
+
<literal><map></literal>、<literal><bag></literal>、
+
<literal><array></literal>、<literal><primitive-array></literal>
があります。
+ 代表として、<literal><map></literal> 要素を下記に示します。
</para>
<programlistingco>
@@ -147,171 +149,171 @@
<calloutlist>
<callout arearefs="mappingcollection1">
<para>
- <literal>name</literal>
�R���N�V�����^�ł���v���p�e�B�̖��O
+ <literal>name</literal> コレクション型であるプロパティの名前
</para>
</callout>
<callout arearefs="mappingcollection2">
<para>
- <literal>table</literal> �i�I�v�V���� -
�f�t�H���g�̓v���p�e�B���j�R���N�V�����e�[�u���̖��O
- �i��Α��֘A�ł͎g�p���܂���j�B
+ <literal>table</literal> (オプション -
デフォルトはプロパティ名)コレクションテーブルの名前
+ (一対多関連では使用しません)。
</para>
</callout>
<callout arearefs="mappingcollection3">
<para>
- <literal>schema</literal>
�i�I�v�V�����j�e�[�u���X�L�[�}�̖��O�B
- ���[�g�v�f�Ő錾����Ă���X�L�[�}���D�悳��܂��B
+ <literal>schema</literal> (オプション)テーブルスキーマの名前。
+ ルート要素で宣言されているスキーマより優先されます。
</para>
</callout>
<callout arearefs="mappingcollection4">
<para>
- <literal>lazy</literal> �i�I�v�V���� - �f�t�H���g��
<literal>true</literal>�j
- �x���t�F�b�`���ɂ��A�֘A���ɑ����Ƀt�F�b�`�ɂ��邽�߂Ɏg�p���܂��B
- �܂��́A�uextra-lazy�v�t�F�b�`��L���ɂ��邽�߂Ɏg�p���܂��B
- �uextra-lazy�v�t�F�b�`�́A�قƂ�ǂ̑���ł̓R���N�V�������������܂���
- �i���ɑ傫�ȃR���N�V�����ɓK���Ă��܂��j�B
+ <literal>lazy</literal> (オプション - デフォルトは
<literal>true</literal>)
+ 遅延フェッチを無効にし、関連を常に即時にフェッチにするために使用します。
+ または、「extra-lazy」フェッチを有効にするために使用します。
+ 「extra-lazy」フェッチは、ほとんどの操作ではコレクションを初期化しません
+ (非常に大きなコレクションに適しています)。
</para>
</callout>
<callout arearefs="mappingcollection5">
<para>
- <literal>inverse</literal> �i�I�v�V���� -
�f�t�H���g�� <literal>false</literal>�j
- ���̃R���N�V�������o�����֘A�́u�t�v���ł���ƃ}�[�N���܂��B
+ <literal>inverse</literal> (オプション - デフォルトは
<literal>false</literal>)
+ このコレクションが双方向関連の「逆」側であるとマークします。
</para>
</callout>
<callout arearefs="mappingcollection6">
<para>
- <literal>cascade</literal> �i�I�v�V���� -
�f�t�H���g�� <literal>none</literal>�j
- �q�G���e�B�e�B�ւ̃J�X�P�[�h�����L���ɂ��܂��B
+ <literal>cascade</literal> (オプション - デフォルトは
<literal>none</literal>)
+ 子エンティティへのカスケード操作を有効にします。
</para>
</callout>
<callout arearefs="mappingcollection7">
<para>
- <literal>sort</literal>
�i�I�v�V�����j�R���N�V�������R�ȏ����Ń\�[�g����ꍇ��
- <literal>natural</literal> ��w�肵�܂��B
- ���邢��Comparator�N���X��w�肵�܂��B
+ <literal>sort</literal> (オプション)コレクションを自然な順序でソートする場合は
+ <literal>natural</literal> を指定します。
+ あるいはComparatorクラスを指定します。
</para>
</callout>
<callout arearefs="mappingcollection8">
<para>
- <literal>order-by</literal> �i�I�v�V�����AJDK1.4�̂݁j
-
<literal>Map</literal>�A<literal>Set</literal>�Abag�̃C�e���[�V�����������`����
- �e�[�u���J������w�肷��Ƌ��ɁA
- �I�v�V�����Ƃ���
<literal>asc</literal>�A<literal>desc</literal> ��w�肵�܂��B
+ <literal>order-by</literal> (オプション、JDK1.4のみ)
+
<literal>Map</literal>、<literal>Set</literal>、bagのイテレーション順序を定義する
+ テーブルカラムを指定すると共に、
+ オプションとして
<literal>asc</literal>、<literal>desc</literal> を指定します。
</para>
</callout>
<callout arearefs="mappingcollection9">
<para>
- <literal>where</literal>
�i�I�v�V�����j�R���N�V�����̌�����폜�̍ۂɎg��
- �C�ӂ�SQL��<literal>WHERE</literal> ����w�肵�܂�
-
�i���p�\�ȃf�[�^�̈ꕔ��������R���N�V�������܂ނׂ��Ƃ��ɁA����͗L�p�ł��j�B
+ <literal>where</literal> (オプション)コレクションの検索や削除の際に使う
+ 任意のSQLの<literal>WHERE</literal> 条件を指定します
+ (利用可能なデータの一部分だけをコレクションが含むべきときに、これは有用です)。
</para>
</callout>
<callout arearefs="mappingcollection10">
<para>
- <literal>fetch</literal>�i�I�v�V���� - �f�t�H���g��
<literal>select</literal>�j
- �O�������ɂ��t�F�b�`�A�����I��t�F�b�`�isequential select
fetch�j�A
- �����T�u�Z���N�g�t�F�b�`�isequential subselect
fetch�j�̂ǂꂩ��I���Ă��������B
+ <literal>fetch</literal>(オプション - デフォルトは
<literal>select</literal>)
+ 外部結合によるフェッチ、順次選択フェッチ(sequential select fetch)、
+ 順次サブセレクトフェッチ(sequential subselect fetch)のどれかを選択してください。
</para>
</callout>
<callout arearefs="mappingcollection11">
<para>
- <literal>batch-size</literal> �i�I�v�V���� -
�f�t�H���g�� <literal>1</literal>�j
-
�R���N�V�����̃C���X�^���X�̒x���t�F�b�`�̂��߂́u�o�b�`�T�C�Y�v��w�肵�܂��B
+ <literal>batch-size</literal> (オプション - デフォルトは
<literal>1</literal>)
+ コレクションのインスタンスの遅延フェッチのための「バッチサイズ」を指定します。
</para>
</callout>
<callout arearefs="mappingcollection12">
<para>
- <literal>access</literal> �i�I�v�V���� - �f�t�H���g��
<literal>property</literal>�j
- �R���N�V�����^�v���p�e�B�̒l�ɃA�N�Z�X���邽�߂Ɏg�p����헪�ł��B
+ <literal>access</literal> (オプション - デフォルトは
<literal>property</literal>)
+ コレクション型プロパティの値にアクセスするために使用する戦略です。
</para>
</callout>
<callout arearefs="mappingcollection13">
<para>
- <literal>optimistic-lock</literal>�i�I�v�V���� -
�f�t�H���g�� <literal>true</literal>�j
- �R���N�V�����̏�Ԃ�ς��邱�Ƃɂ���āA
-
���̃I�[�i�[�ł���G���e�B�e�B�̃o�[�W�������C���N�������g����邩��w�肵�܂��B
- �i��Α��֘A�ł́A�قƂ�ǂ̏ꍇ�ɂ����Ė����ɐݒ肷��̂��Ó��ł��B�j
+ <literal>optimistic-lock</literal>(オプション - デフォルトは
<literal>true</literal>)
+ コレクションの状態を変えることによって、
+ そのオーナーであるエンティティのバージョンがインクリメントされるかを指定します。
+ (一対多関連では、ほとんどの場合において無効に設定するのが妥当です。)
</para>
</callout>
<callout arearefs="mappingcollection14">
<para>
- <literal>mutable</literal>�i�I�v�V���� - �f�t�H���g��
<literal>true</literal>�j
- <literal>false</literal>
�l�́A�R���N�V�����̗v�f���ύX����Ȃ����Ƃ�\���܂�
- �i����ꍇ�ɂ́A�����p�t�H�[�}���X���߂܂��j�B
+ <literal>mutable</literal>(オプション - デフォルトは
<literal>true</literal>)
+ <literal>false</literal> 値は、コレクションの要素が変更されないことを表します
+ (ある場合には、少しパフォーマンスを高めます)。
</para>
</callout>
</calloutlist>
</programlistingco>
<sect2 id="collections-foreignkeys" >
- <title>�R���N�V�����̊O���L�[</title>
+ <title>コレクションの外部キー</title>
<para>
- �R���N�V�����̃C���X�^���X�́A�f�[�^�x�[�X��ł́A
- ���̃R���N�V�������L����G���e�B�e�B�̊O���L�[�ɂ���Ď��ʂ���܂��B
- ���̊O���L�[�̓R���N�V�����e�[�u����
<emphasis>�R���N�V�����L�[�J����</emphasis> �ƌĂ�܂��B
- �R���N�V�����L�[�J������
<literal><key></literal> �v�f�ɂ��}�b�s���O���܂��B
+ コレクションのインスタンスは、データベース内では、
+ そのコレクションを所有するエンティティの外部キーによって識別されます。
+ この外部キーはコレクションテーブルの <emphasis>コレクションキーカラム</emphasis> と呼ばれます。
+ コレクションキーカラムは <literal><key></literal>
要素によりマッピングします。
</para>
<para>
- �O���L�[�J�����ɂ�null�ݒ萧���邩�����܂���B
- �قƂ�ǂ̃R���N�V�����ɓ��Ă͂܂�ł��傤�B
- �P�����̈�Α��֘A�ɂ����āA�O���L�[�J�����̓f�t�H���g��null�����ݒ�ɂȂ��Ă��܂��B
- ����āA<literal>not-null="true"</literal>
��w�肷��K�v�����邩�����܂���B
+ 外部キーカラムにはnull設定制約があるかもしれません。
+ ほとんどのコレクションに当てはまるでしょう。
+ 単方向の一対多関連において、外部キーカラムはデフォルトでnullを許す設定になっています。
+ よって、<literal>not-null="true"</literal>
を指定する必要があるかもしれません。
</para>
<programlisting><![CDATA[<key
column="productSerialNumber"
not-null="true"/>]]></programlisting>
<para>
- �O���L�[�̐��� <literal>ON DELETE CASCADE</literal>
��g���������܂���B
+ 外部キーの制約が <literal>ON DELETE CASCADE</literal> を使うかもしれません。
</para>
<programlisting><![CDATA[<key
column="productSerialNumber"
on-delete="cascade"/>]]></programlisting>
<para>
- <literal><key></literal>
�v�f�̂��ׂĂ̒�`�ɂ��Ă͑O�̏͂�Q�Ƃ��Ă��������B
+ <literal><key></literal>
要素のすべての定義については前の章を参照してください。
</para>
</sect2>
<sect2 id="collections-elements" >
- <title>�R���N�V�����̗v�f</title>
+ <title>コレクションの要素</title>
<para>
-
�R���N�V�����͑���Hibernate�̌^�̂قƂ�ǁi���ׂĂ̊�{�^�A�J�X�^���^�A�R���|�[�l���g�A
- ���̃G���e�B�e�B�ւ̎Q�Ɓj��i�[���邱�Ƃ��ł��܂��B
- ���̓_�͏d�v�ȈႢ�ɂȂ�܂��B
- �R���N�V�����Ɋi�[���ꂽ�I�u�W�F�N�g���u�l�v�Z�}���e�B�N�X�Ƃ��Ĉ�����̂�
- �i���C�t�T�C�N���̓R���N�V�����̃I�[�i�[�Ɋ��S�Ɉˑ����܂��j�A
- ������͂��ꎩ�g�̃��C�t�T�C�N���������ʂ̃G���e�B�e�B�ւ̎Q�Ƃł��邩�̂��Ƃ����Ⴂ�ł��B
-
��҂́A2�̃I�u�W�F�N�g�Ԃ́u�����N�v��R���N�V�����ɕێ����Ă���ƌ��Ȃ��Ă��邾���ł��B
+ コレクションは他のHibernateの型のほとんど(すべての基本型、カスタム型、コンポーネント、
+ 他のエンティティへの参照)を格納することができます。
+ 次の点は重要な違いになります。
+ コレクションに格納されたオブジェクトが「値」セマンティクスとして扱われるのか
+ (ライフサイクルはコレクションのオーナーに完全に依存します)、
+ もしくはそれ自身のライフサイクルを持った別のエンティティへの参照であるかのかという違いです。
+ 後者は、2つのオブジェクト間の「リンク」をコレクションに保持していると見なしているだけです。
</para>
<para>
- �i�[�����^�� <emphasis>�R���N�V�����v�f�^</emphasis>
�ƌĂ�܂��B
- �R���N�V�����v�f�́A<literal><element></literal>
�܂��� <literal><composite-element></literal>
- �ɂ��}�b�s���O����A�G���e�B�e�B�ւ̎Q�Ƃ̏ꍇ�ɂ�
- <literal><one-to-many></literal> �܂���
<literal><many-to-many></literal>
- �ɂ��}�b�s���O����܂��B
-
�ŏ��̓�͒l�Ƃ��ėv�f��}�b�s���O���A���̓�̓G���e�B�e�B�̊֘A��}�b�s���O����̂Ɏg���܂��B
+ 格納される型は <emphasis>コレクション要素型</emphasis> と呼ばれます。
+ コレクション要素は、<literal><element></literal> または
<literal><composite-element></literal>
+ によりマッピングされ、エンティティへの参照の場合には
+ <literal><one-to-many></literal> または
<literal><many-to-many></literal>
+ によりマッピングされます。
+ 最初の二つは値として要素をマッピングし、次の二つはエンティティの関連をマッピングするのに使われます。
</para>
</sect2>
<sect2 id="collections-indexed">
- <title>�C���f�b�N�X�t���̃R���N�V����</title>
+ <title>インデックス付きのコレクション</title>
<para>
- set��bag�����S�ẴR���N�V�����}�b�s���O�ɂ́A
- �R���N�V�����e�[�u���̒���
<emphasis>�C���f�b�N�X�p�̃J����</emphasis> ���K�v�ł��B
- ���̃J�����ɁA�z��� <literal>List</literal> �̃C���f�b�N�X�A
- ������� <literal>Map</literal> �̃L�[��}�b�s���O���܂��B
- <literal>Map</literal> �̃C���f�b�N�X�́A
- <literal><map-key></literal>
�ɂ��}�b�s���O���ꂽ��{�^���A
- <literal><map-key-many-to-many></literal>
�ɂ��}�b�s���O���ꂽ�G���e�B�e�B�̊֘A���A
- ���邢�� <literal><composite-map-key></literal>
�ɂ��}�b�s���O���ꂽ�R���|�W�b�g�^�ɂȂ�܂��B
- �z���X�g�̃C���f�b�N�X�́A��� <literal>integer</literal>
�^�ŁA
- <literal><list-index></literal>
�v�f�ɂ��}�b�s���O���܂��B
-
�}�b�s���O���ꂽ�J�����ɂ̓V�[�P���V�����Ȑ�����i�[���܂��i�f�t�H���g�ł�0����ԍ����t�����܂��j�B
+ setとbagを除く全てのコレクションマッピングには、
+ コレクションテーブルの中に <emphasis>インデックス用のカラム</emphasis> が必要です。
+ そのカラムに、配列や <literal>List</literal> のインデックス、
+ もしくは <literal>Map</literal> のキーをマッピングします。
+ <literal>Map</literal> のインデックスは、
+ <literal><map-key></literal> によりマッピングされた基本型か、
+ <literal><map-key-many-to-many></literal>
によりマッピングされたエンティティの関連か、
+ あるいは <literal><composite-map-key></literal>
によりマッピングされたコンポジット型になります。
+ 配列かリストのインデックスは、常に <literal>integer</literal> 型で、
+ <literal><list-index></literal> 要素によりマッピングします。
+ マッピングされたカラムにはシーケンシャルな整数を格納します(デフォルトでは0から番号が付けられます)。
</para>
<programlistingco>
@@ -325,13 +327,13 @@
<calloutlist>
<callout arearefs="index1">
<para>
-
<literal>column_name</literal>�i�K�{�j:�R���N�V�����C���f�b�N�X�̒l��ێ�����J�����̖��O�B
+
<literal>column_name</literal>(必須):コレクションインデックスの値を保持するカラムの名前。
</para>
</callout>
<callout arearefs="index2">
<para>
- <literal>base</literal>�i�I�v�V�����A�f�t�H���g��
<literal>0</literal>�j:
- ���X�g������͔z��̍ŏ��̗v�f�ɊY������C���f�b�N�X�J�����̒l�B
+ <literal>base</literal>(オプション、デフォルトは
<literal>0</literal>):
+ リストもしくは配列の最初の要素に該当するインデックスカラムの値。
</para>
</callout>
</calloutlist>
@@ -352,17 +354,17 @@
<calloutlist>
<callout arearefs="mapkey1">
<para>
- <literal>column</literal>�i�I�v�V�����j:
�R���N�V�����C���f�b�N�X�̒l��ێ�����J�����̖��O�B
+ <literal>column</literal>(オプション):
コレクションインデックスの値を保持するカラムの名前。
</para>
</callout>
<callout arearefs="mapkey2">
<para>
- <literal>formula</literal>�i�I�v�V�����j:
Map�̃L�[��]������̂Ɏg����SQL���B
+ <literal>formula</literal>(オプション):
Mapのキーを評価するのに使われるSQL式。
</para>
</callout>
<callout arearefs="mapkey3">
<para>
- <literal>type</literal>�i�K�{�j: Map�̃L�[�̌^�B
+ <literal>type</literal>(必須): Mapのキーの型。
</para>
</callout>
</calloutlist>
@@ -382,20 +384,20 @@
<calloutlist>
<callout arearefs="indexmanytomany1">
<para>
- <literal>column</literal> �i�I�v�V�����j:
- �R���N�V�����C���f�b�N�X�̒l�̂��߂̊O���L�[�J�����̖��O�B
+ <literal>column</literal> (オプション):
+ コレクションインデックスの値のための外部キーカラムの名前。
</para>
</callout>
<callout arearefs="indexmanytomany2">
<para>
- <literal>formula</literal> �i�I�v�V�����j:
- Map�̃L�[�̂��߂̊O���L�[��]�����邽�߂Ɏg��SQL���B
+ <literal>formula</literal> (オプション):
+ Mapのキーのための外部キーを評価するために使うSQL式。
</para>
</callout>
<callout arearefs="indexmanytomany3">
<para>
- <literal>class</literal> �i�K�{�j:
- Map�̃L�[�Ƃ��Ďg����G���e�B�e�B�N���X�B
+ <literal>class</literal> (必須):
+ Mapのキーとして使われるエンティティクラス。
</para>
</callout>
</calloutlist>
@@ -403,33 +405,33 @@
<para>
- ����e�[�u���ɃC���f�b�N�X�J�������Ȃ��Ă�A�v���p�e�B�^�Ƃ���
<literal>List</literal> ��g��������A
- Hibernate�� <emphasis><bag></emphasis>
�Ƃ��ăv���p�e�B��}�b�s���O���܂��B
- bag�̓f�[�^�x�[�X���畜������鎞�A������ێ����܂���B
- �������A�i��������Łj�\�[�g������A�iSQL�Łj�����t��������iorder
by�j���邱�Ƃ�ł��܂��B
+ もしテーブルにインデックスカラムがなくても、プロパティ型として <literal>List</literal>
を使いたければ、
+ Hibernateの <emphasis><bag></emphasis>
としてプロパティをマッピングします。
+ bagはデータベースから復元される時、順序を保持しません。
+ しかし、(メモリ上で)ソートしたり、(SQLで)順序付けしたり(order by)することもできます。
</para>
</sect2>
<para>
- �����̈�ʓI�ȃ����[�V���i�����f����J�o�[�������߂ɁA
- �R���N�V�����̂��߂ɗ��p�ł���}�b�s���O�ɂ͂��Ȃ�̕�������܂��B
- �l�X�ȃ}�b�s���O�錾���ǂ̂悤�Ƀf�[�^�x�[�X�e�[�u���ɕϊ�����邩��m�邽�߂ɁA
- �X�L�[�}�����c�[����g���Ă݂�Ɨǂ��ł��傤�B
+ 多くの一般的なリレーショナルモデルをカバーしたために、
+ コレクションのために利用できるマッピングにはかなりの幅があります。
+ 様々なマッピング宣言がどのようにデータベーステーブルに変換されるかを知るために、
+ スキーマ生成ツールを使ってみると良いでしょう。
</para>
<sect2 id="collections-ofvalues" revision="2">
- <title>�l�̃R���N�V�����Ƒ��Α��֘A</title>
+ <title>値のコレクションと多対多関連</title>
<para>
- �l�̃R���N�V�����⑽�Α��֘A�́A��p��
<emphasis>�R���N�V�����e�[�u��</emphasis> ���K�v�ł��B
- ���̃e�[�u���́A�O���L�[�J�����ƁA
- <emphasis>�R���N�V�����v�f�̃J����</emphasis> �ƁA
- �ꍇ�ɂ���Ă̓C���f�b�N�X�J���������܂��B
+ 値のコレクションや多対多関連は、専用の <emphasis>コレクションテーブル</emphasis> が必要です。
+ このテーブルは、外部キーカラムと、
+ <emphasis>コレクション要素のカラム</emphasis> と、
+ 場合によってはインデックスカラムを持ちます。
</para>
<para>
-
�l�̃R���N�V�����̂��߂ɁA<literal><element></literal>�^�O��g�p���܂��B
+ 値のコレクションのために、<literal><element></literal>タグを使用します。
</para>
<programlistingco>
@@ -452,24 +454,24 @@
<calloutlist>
<callout arearefs="element1b">
<para>
- <literal>column</literal> �i�I�v�V�����j:
�R���N�V�����̗v�f�̒l��ێ�����J�����̖��O�B
+ <literal>column</literal> (オプション):
コレクションの要素の値を保持するカラムの名前。
</para>
</callout>
<callout arearefs="element2b">
<para>
- <literal>formula</literal> �i�I�v�V�����j:
�v�f��]�����邽�߂Ɏg��SQL���B
+ <literal>formula</literal> (オプション):
要素を評価するために使うSQL式。
</para>
</callout>
<callout arearefs="element3b">
<para>
- <literal>type</literal>
�i�K�{�j�R���N�V�����̗v�f�̌^�B
+ <literal>type</literal> (必須)コレクションの要素の型。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- <emphasis>���Α��֘A</emphasis> ��
<literal><many-to-many></literal> �v�f�Ŏw�肵�܂��B
+ <emphasis>多対多関連</emphasis> は
<literal><many-to-many></literal> 要素で指定します。
</para>
<programlistingco>
@@ -498,64 +500,64 @@
<calloutlist>
<callout arearefs="manytomany1">
<para>
- <literal>column</literal> �i�I�v�V�����j:
�O���L�[�J�����̗v�f�̖��O�B
+ <literal>column</literal> (オプション): 外部キーカラムの要素の名前。
</para>
</callout>
<callout arearefs="manytomany2">
<para>
- <literal>formula</literal> �i�I�v�V�����j:
�O���L�[�l�̗v�f��]�����邽�߂Ɏg��SQL���B
+ <literal>formula</literal> (オプション):
外部キー値の要素を評価するために使うSQL式。
</para>
</callout>
<callout arearefs="manytomany3">
<para>
- <literal>class</literal> �i�K�{�j: �֘A�N���X�̖��O�B
+ <literal>class</literal> (必須): 関連クラスの名前。
</para>
</callout>
<callout arearefs="manytomany4">
<para>
- <literal>fetch</literal> (�I�v�V���� - �f�t�H���g��
<literal>join</literal>):
- �֘A�̂��߂ɁA�O�������������I��t�F�b�`��L���ɂ��܂��B
- ����͓���ȃP�[�X�ł����A�G���e�B�e�B�Ƒ��̃G���e�B�e�B�Ƃ̑��Α��W��
- �i�P�� <literal>SELECT</literal>
�ɂ��j���S�ɑ����Ƀt�F�b�`���邽�߂ɂ́A
- ���̃R���N�V�������̂����łȂ��A
- �l�X�g�����v�f�ł���
<literal><many-to-many></literal> �̂��̑����ɂ��Ă�
- <literal>join</literal>
�t�F�b�`��L������K�v������܂��B
+ <literal>fetch</literal> (オプション - デフォルトは
<literal>join</literal>):
+ 関連のために、外部結合か順次選択フェッチを有効にします。
+ これは特殊なケースですが、エンティティと他のエンティティとの多対多関係を
+ (1つの <literal>SELECT</literal> により)完全に即時にフェッチするためには、
+ そのコレクション自体だけでなく、
+ ネストした要素である
<literal><many-to-many></literal> のこの属性についても
+ <literal>join</literal> フェッチを有効する必要があります。
</para>
</callout>
<callout arearefs="manytomany5">
<para>
- <literal>unique</literal> �i�I�v�V�����j:
- �O���L�[�J�����̃��j�[�N�����DDL������L���ɂ��܂��B
- ����́A�֘A�̑��d�x�������Α��ɂ��܂��B
+ <literal>unique</literal> (オプション):
+ 外部キーカラムのユニーク制約のDDL生成を有効にします。
+ これは、関連の多重度を事実上一対多にします。
</para>
</callout>
<callout arearefs="manytomany6">
<para>
- <literal>not-found</literal> �i�I�v�V���� -
�f�t�H���g�� <literal>exception</literal>�j
- �Q�Ɛ�̍s���Ȃ��O���L�[��ǂ̂悤�Ɉ�������w�肵�܂��B
- <literal>ignore</literal>
�ɂ���ƁA�s���Ȃ����Ƃ�֘A��������̂Ƃ��Ĉ����܂��B
+ <literal>not-found</literal> (オプション - デフォルトは
<literal>exception</literal>)
+ 参照先の行がない外部キーをどのように扱うかを指定します。
+ <literal>ignore</literal>
にすると、行がないことを関連が無いものとして扱います。
</para>
</callout>
<callout arearefs="manytomany7">
<para>
- <literal>entity-name</literal> �i�I�v�V�����j:
- <literal>class</literal>
�̑�ւł���֘A�N���X�̃G���e�B�e�B���B
- <literal>class</literal>
�̑���Ɏw�肷��A�֘A�N���X�̃G���e�B�e�B���B
+ <literal>entity-name</literal> (オプション):
+ <literal>class</literal> の代替である関連クラスのエンティティ名。
+ <literal>class</literal> の代わりに指定する、関連クラスのエンティティ名。
</para>
</callout>
<callout arearefs="manytomany8">
<para>
- <literal>property-ref</literal>: �i�I�v�V�����j
- ���̊O���L�[�Ɍ�������֘A�N���X�̃v���p�e�B���B
- �w�肵�Ȃ������ꍇ�́A�֘A�N���X�̎�L�[��g���܂��B
+ <literal>property-ref</literal>: (オプション)
+ この外部キーに結合する関連クラスのプロパティ名。
+ 指定しなかった場合は、関連クラスの主キーを使います。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- �ȉ��ɂ�����������܂��B
- �܂���String��set�Ɋւ��Ă̗�ł��B
+ 以下にいくつか例を示します。
+ まずはStringのsetに関しての例です。
</para>
<programlisting><![CDATA[<set name="names"
table="person_names">
@@ -564,7 +566,7 @@
</set>]]></programlisting>
<para>
- �����l��܂�bag�ibag�� <literal>order-by</literal>
�����ɂ���Ĕ�����������`����Ă��܂��j
+ 整数値を含むbag(bagは <literal>order-by</literal> 属性によって反復順序が定義されています)
</para>
<programlisting><![CDATA[<bag name="sizes"
@@ -575,7 +577,7 @@
</bag>]]></programlisting>
<para>
- �G���e�B�e�B�̔z�� - ���̏ꍇ�A���Α��̊֘A�ł��B
+ エンティティの配列 - この場合、多対多の関連です。
</para>
<programlisting><![CDATA[<array name="addresses"
@@ -587,7 +589,7 @@
</array>]]></programlisting>
<para>
- ������Ɠ��t��map
+ 文字列と日付のmap
</para>
<programlisting><![CDATA[<map name="holidays"
@@ -600,7 +602,7 @@
</map>]]></programlisting>
<para>
- �R���|�[�l���g��list�i���̏͂ŏڂ���������܂��j
+ コンポーネントのlist(次の章で詳しく説明します)
</para>
<programlisting><![CDATA[<list name="carComponents"
@@ -617,33 +619,33 @@
</sect2>
<sect2 id="collections-onetomany">
- <title>��Α��֘A</title>
+ <title>一対多関連</title>
<para>
- <emphasis>��Α��֘A</emphasis> �́A�R���N�V������e�[�u�������A
- �O���L�[�ɂ��2�̃N���X�̃e�[�u����֘A�t���܂��B
- ���̃}�b�s���O�͕W���I��Java�̃R���N�V�����̃Z�}���e�B�N�X�����������܂��B
+ <emphasis>一対多関連</emphasis> は、コレクション・テーブルを介さず、
+ 外部キーにより2つのクラスのテーブルを関連付けます。
+ このマッピングは標準的なJavaのコレクションのセマンティクスをいくつか失います。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- �G���e�B�e�B�N���X�̃C���X�^���X�́A
- 2�ȏ�̃R���N�V�����̃C���X�^���X�ɑ����Ă͂����܂���B
+ エンティティクラスのインスタンスは、
+ 2つ以上のコレクションのインスタンスに属してはいけません。
</para>
</listitem>
<listitem>
<para>
- �R���N�V�����Ɋ܂܂��G���e�B�e�B�N���X�̃C���X�^���X�́A
- �R���N�V�����C���f�b�N�X�̒l�Ƃ���2�x�ȏ㌻��Ă͂����܂���B
+ コレクションに含まれるエンティティクラスのインスタンスは、
+ コレクションインデックスの値として2度以上現れてはいけません。
</para>
</listitem>
</itemizedlist>
<para>
- <literal>Product</literal> ����
<literal>Part</literal> �ւ̊֘A�́A
- <literal>Part</literal>
�e�[�u���ւ̊O���L�[�J�����ƁA�ꍇ�ɂ���Ă̓C���f�b�N�X�J�������K�v�ł��B
- <literal><one-to-many></literal>
�^�O�́A���ꂪ��Α��֘A�ł��邱�Ƃ�\���Ă��܂��B
+ <literal>Product</literal> から <literal>Part</literal>
への関連は、
+ <literal>Part</literal> テーブルへの外部キーカラムと、場合によってはインデックスカラムが必要です。
+ <literal><one-to-many></literal>
タグは、これが一対多関連であることを表しています。
</para>
<programlistingco>
@@ -662,44 +664,44 @@
<calloutlist>
<callout arearefs="onetomany1">
<para>
- <literal>class</literal> �i�K�{�j: �֘A�N���X�̖��O�B
+ <literal>class</literal> (必須): 関連クラスの名前。
</para>
</callout>
<callout arearefs="onetomany2">
<para>
- <literal>not-found</literal> �i�I�v�V���� -
�f�t�H���g�� <literal>exception</literal>�j:
- �Q�Ɛ�̍s���Ȃ��L���b�V�����ꂽ���ʎq��ǂ̂悤�Ɉ�������w�肵�܂��B
- <literal>ignore</literal>
��w�肷��ƁA�s���Ȃ����Ƃ�֘A���Ȃ���̂Ƃ��Ĉ����܂��B
+ <literal>not-found</literal> (オプション - デフォルトは
<literal>exception</literal>):
+ 参照先の行がないキャッシュされた識別子をどのように扱うかを指定します。
+ <literal>ignore</literal>
を指定すると、行がないことを関連がないものとして扱います。
</para>
</callout>
<callout arearefs="onetomany3">
<para>
- <literal>entity-name</literal> �i�I�v�V�����j:
- <literal>class</literal>
�̑�ւł���֘A�N���X�̃G���e�B�e�B���B
- <literal>class</literal>
�̑���Ɏw�肷��A�֘A�N���X�̃G���e�B�e�B���B
+ <literal>entity-name</literal> (オプション):
+ <literal>class</literal> の代替である関連クラスのエンティティ名。
+ <literal>class</literal> の代わりに指定する、関連クラスのエンティティ名。
</para>
</callout>
</calloutlist>
</programlistingco>
<para>
- <literal><one-to-many></literal>
�v�f�̓J������錾����K�v���Ȃ����Ƃɒ��ӂ��Ă��������B
- ���l�� <literal>�e�[�u��</literal> ����w�肷��K�v�����܂���B
+ <literal><one-to-many></literal>
要素はカラムを宣言する必要がないことに注意してください。
+ 同様に <literal>テーブル</literal> 名を指定する必要もありません。
</para>
<para>
- <emphasis>�ƂĂ�d�v�Ȓ���:</emphasis> ���
<literal><one-to-many></literal>
- �֘A�̊O���L�[�J������ <literal>NOT NULL</literal>�Ɛ錾���ꂽ�ꍇ�A
- <literal><key></literal> �}�b�s���O��
<literal>not-null="true"</literal> ��錾���邩�A
- �R���N�V�����}�b�s���O��
<literal>inverse="true"</literal> ��t������ŁA
- <emphasis>�o�����֘A��g��</emphasis> �K�v������܂��B
- �o�����֘A�ɂ��Ă͂��̏͂̌�̂ق��Ő�����܂��B
+ <emphasis>とても重要な注意:</emphasis> もし
<literal><one-to-many></literal>
+ 関連の外部キーカラムが <literal>NOT NULL</literal>と宣言された場合、
+ <literal><key></literal> マッピングに
<literal>not-null="true"</literal> を宣言するか、
+ コレクションマッピングに <literal>inverse="true"</literal> を付けた上で、
+ <emphasis>双方向関連を使う</emphasis> 必要があります。
+ 双方向関連についてはこの章の後のほうで説明します。
</para>
<para>
- ���̗�́A���́i<literal>Part</literal> �̉i���I�ȃv���p�e�B�ł���
<literal>partName</literal>�j
- �ɂ�� <literal>Part</literal> �G���e�B�e�B��map��\���Ă��܂��B
- formula�ɂ��C���f�b�N�X��g���Ă��邱�Ƃɒ��ӂ��Ă��������B
+ 次の例は、名称(<literal>Part</literal> の永続的なプロパティである
<literal>partName</literal>)
+ による <literal>Part</literal> エンティティのmapを表しています。
+ formulaによるインデックスを使っていることに注意してください。
</para>
<programlisting><![CDATA[<map name="parts"
@@ -713,15 +715,15 @@
</sect1>
<sect1 id="collections-advancedmappings">
- <title>���x�ȃR���N�V������}�b�s���O</title>
+ <title>高度なコレクション・マッピング</title>
<sect2 id="collections-sorted" revision="2">
- <title>�\�[�g���ꂽ�R���N�V����</title>
+ <title>ソートされたコレクション</title>
<para>
- Hibernate�� <literal>java.util.SortedMap</literal> ��
<literal>java.util.SortedSet</literal>
- ����������R���N�V������T�|�[�g���Ă��܂��B
- �J���҂̓}�b�s���O��`�t�@�C���ɃR���p���[�^��w�肵�Ȃ���Ȃ�܂���B
+ Hibernateは <literal>java.util.SortedMap</literal> と
<literal>java.util.SortedSet</literal>
+ を実装したコレクションをサポートしています。
+ 開発者はマッピング定義ファイルにコンパレータを指定しなければなりません。
</para>
<programlisting><![CDATA[<set name="aliases"
@@ -738,22 +740,22 @@
</map>]]></programlisting>
<para>
- <literal>sort</literal> �����ɐݒ�ł���l��
<literal>unsorted</literal> �� <literal>natural</literal>
- ����сA<literal>java.util.Comparator</literal>
����������N���X�̖��O�ł��B
+ <literal>sort</literal> 属性に設定できる値は
<literal>unsorted</literal> と <literal>natural</literal>
+ および、<literal>java.util.Comparator</literal> を実装したクラスの名前です。
</para>
<para>
- �\�[�g���ꂽ�R���N�V�����͎����I�ɂ�
<literal>java.util.TreeSet</literal> ��
- <literal>java.util.TreeMap</literal> �̂悤�ɐU�����܂��B
+ ソートされたコレクションは実質的には <literal>java.util.TreeSet</literal> や
+ <literal>java.util.TreeMap</literal> のように振舞います。
</para>
<para>
- ����f�[�^�x�[�X���g�ɃR���N�V�����̗v�f����ׂ��������Ȃ�A
- <literal>set</literal> ��
<literal>bag</literal>�A<literal>map</literal> ��
- <literal>order-by</literal> ������g���܂��B
- ���̉��@��JDK1.4�A������͂���ȏ�̃o�[�W�����ŗ��p�\�ł�
- �i<literal>LinkedHashSet</literal> �܂���
<literal>LinkedHashMap</literal>��g���Ď�������Ă��܂��j�B
- ����̓�������ł͂Ȃ��ASQL�N�G����Ŏ��s����܂��B
+ もしデータベース自身にコレクションの要素を並べさせたいなら、
+ <literal>set</literal> や
<literal>bag</literal>、<literal>map</literal> の
+ <literal>order-by</literal> 属性を使います。
+ この解決法はJDK1.4、もしくはそれ以上のバージョンで利用可能です
+ (<literal>LinkedHashSet</literal> または
<literal>LinkedHashMap</literal>を使って実装されています)。
+ 整列はメモリ上ではなく、SQLクエリ内で実行されます。
</para>
<programlisting><![CDATA[<set name="aliases"
table="person_aliases" order-by="lower(name) asc">
@@ -768,12 +770,12 @@
</map>]]></programlisting>
<para>
- <literal>order-by</literal>
�����̒l��SQL���߂ł����āAHQL���߂ł͂Ȃ����Ƃɒ��ӂ��Ă��������I
+ <literal>order-by</literal> 属性の値がSQL命令であって、HQL命令ではないことに注意してください!
</para>
<para>
- �֘A�́A�R���N�V������ <literal>filter()</literal> ��g�����ƂŁA
- ���s���ɔC�ӂ�criteria�ɂ���ă\�[�g���邱�Ƃ�\�ł��B
+ 関連は、コレクションの <literal>filter()</literal> を使うことで、
+ 実行時に任意のcriteriaによってソートすることも可能です。
</para>
<programlisting><![CDATA[sortedUsers = s.createFilter( group.getUsers(),
"order by this.name" ).list();]]></programlisting>
@@ -781,18 +783,18 @@
</sect2>
<sect2 id="collections-bidirectional" revision="1">
- <title>�o�����֘A</title>
+ <title>双方向関連</title>
<para>
- <emphasis>�o�����֘A</emphasis>
�͊֘A�̂ǂ���u���v����ł�i�r�Q�[�V�����ł��܂��B
- 2��ނ̑o�����֘A���T�|�[�g����Ă��܂��B
+ <emphasis>双方向関連</emphasis> は関連のどちら「側」からでもナビゲーションできます。
+ 2種類の双方向関連がサポートされています。
<variablelist>
<varlistentry>
<term>one-to-many</term>
<listitem>
<para>
- �Б���set��bag�A����Е����P��l�ł��B
+ 片側がsetかbag、もう片方が単一値です。
</para>
</listitem>
</varlistentry>
@@ -800,7 +802,7 @@
<term>many-to-many</term>
<listitem>
<para>
- ������set��bag�ł��B
+ 両側がsetかbagです。
</para>
</listitem>
</varlistentry>
@@ -809,15 +811,15 @@
</para>
<para>
- 2�̑��Α��֘A�œ����f�[�^�x�[�X�e�[�u����}�b�s���O���A
- �Е��� <emphasis>inverse</emphasis> �Ƃ��Đ錾���邱�ƂŁA
- �o�����̑��Α��֘A��w�肷�邱�Ƃ��o���܂�
- �i�ǂ����inverse�ɑI�Ƃ��Ă�A�����瑤�ɂ̓C���f�b�N�X�t���̃R���N�V�����͎g���܂���j�B
+ 2つの多対多関連で同じデータベーステーブルをマッピングし、
+ 片方を <emphasis>inverse</emphasis> として宣言することで、
+ 双方向の多対多関連を指定することが出来ます
+ (どちらをinverseに選んだとしても、そちら側にはインデックス付きのコレクションは使えません)。
</para>
<para>
- ���ɑo�����̑��Α��֘A�̗�����܂��B
-
�e�J�e�S���͑����̃A�C�e�������Ƃ��ł��A�e�A�C�e���͑����̃J�e�S���ɑ����邱�Ƃ��o���܂��B
+ 次に双方向の多対多関連の例を示します。
+ 各カテゴリは多数のアイテムを持つことができ、各アイテムは多くのカテゴリに属することが出来ます。
</para>
<programlisting><![CDATA[<class name="Category">
@@ -841,11 +843,11 @@
</class>]]></programlisting>
<para>
- �֘A��inverse���ɂ̂ݍs��ꂽ�ύX�͉i���� <emphasis>����܂���</emphasis>�B
- ����́AHibernate�͑S�Ă̑o�����֘A�ɂ��āA��������ɂQ�̕\�������Ă���Ƃ����Ӗ��ł��B
- �܂���A����B�ւ̃����N�ŁA������B����A�ւ̃����N�Ƃ������Ƃł��B
- Java�̃I�u�W�F�N�g���f���ɂ��čl���AJava�őo�����W��ǂ�����č�邩��l����A
- ����͗����₷���ł��B���L�ɁAJava�ł̑o�����֘A�����܂��B
+ 関連のinverse側にのみ行われた変更は永続化 <emphasis>されません</emphasis>。
+ これは、Hibernateは全ての双方向関連について、メモリ上に2つの表現を持っているという意味です。
+ つまり一つはAからBへのリンクで、もう一つはBからAへのリンクということです。
+ Javaのオブジェクトモデルについて考え、Javaで双方向関係をどうやって作るかを考えれば、
+ これは理解しやすいです。下記に、Javaでの双方向関連を示します。
</para>
<programlisting><![CDATA[
@@ -856,13 +858,13 @@
session.persist(category); // The relationship will be
saved]]></programlisting>
<para>
- �֘A��inverse�ł͂Ȃ����́A��������̕\����f�[�^�x�[�X�ɕۑ�����̂Ɏg���܂��B
+ 関連のinverseではない側は、メモリ上の表現をデータベースに保存するのに使われます。
</para>
<para>
- �o�����̈�Α��֘A���`����ɂ́A
- ��Α��֘A�𑽑Έ�֘A�Ɠ����e�[�u���̃J�����Ƀ}�b�s���O���A
- ������ <literal>inverse="true"</literal> �Ɛ錾���܂��B
+ 双方向の一対多関連を定義するには、
+ 一対多関連を多対一関連と同じテーブルのカラムにマッピングし、
+ 多側に <literal>inverse="true"</literal> と宣言します。
</para>
<programlisting><![CDATA[<class name="Parent">
@@ -884,19 +886,19 @@
</class>]]></programlisting>
<para>
- �֘A�̕Б��� <literal>inverse="true"</literal> ��ݒ肵�Ă�A
- �J�X�P�[�h����ɉe����^���܂���B�����͒������T�O�ł��I
+ 関連の片側に <literal>inverse="true"</literal> を設定しても、
+ カスケード操作に影響を与えません。これらは直交した概念です!
</para>
</sect2>
<sect2 id="collections-indexedbidirectional">
- <title>�C���f�b�N�X�t���R���N�V�����Ƒo�����֘A</title>
+ <title>インデックス付きコレクションと双方向関連</title>
<para>
- �Б��� <literal><list></literal> ��
<literal><map></literal> �ł���
- �o�����֘A�́A���ɂ悭�l����K�v������܂��B
- �C���f�b�N�X�J�����Ƀ}�b�v�����q�N���X�̃v���p�e�B������ꍇ�́A���Ȃ��ł��B
- �R���N�V�����̃}�b�s���O��
<literal>inverse="true"</literal> ��g���������܂��B
+ 片側が <literal><list></literal> や
<literal><map></literal> である
+ 双方向関連は、特によく考える必要があります。
+ インデックスカラムにマップされる子クラスのプロパティがある場合は、問題ないです。
+ コレクションのマッピングで <literal>inverse="true"</literal>
を使い続けられます。
</para>
<programlisting><![CDATA[<class name="Parent">
@@ -922,11 +924,11 @@
</class>]]></programlisting>
<para>
- �������A�q�N���X�ɂ��̂悤�ȃv���p�e�B���Ȃ��ꍇ�́A
- �֘A��^�ɑo�����ł���ƍl���邱�Ƃ��ł��܂���
- �i�֘A�̕Б��ɗ��p�ł�������܂����A�������ɂ͂���܂���j�B
- ���̏ꍇ�́A�R���N�V������
<literal>inverse="true"</literal> ��}�b�s���O�ł��܂���B
- ����ɁA���̂悤�ȃ}�b�s���O���g���܂��B
+ しかし、子クラスにそのようなプロパティがない場合は、
+ 関連を真に双方向であると考えることができません
+ (関連の片側に利用できる情報がありますが、もう一方にはありません)。
+ この場合は、コレクションに <literal>inverse="true"</literal>
をマッピングできません。
+ 代わりに、次のようなマッピングが使えます。
</para>
<programlisting><![CDATA[<class name="Parent">
@@ -953,19 +955,19 @@
</class>]]></programlisting>
<para>
- ���ӁF ���̃}�b�s���O�ł́A�֘A�̃R���N�V�����l�̑��́A
- �O���L�[��A�b�v�f�[�g����ӔC������܂��B
+ 注意: このマッピングでは、関連のコレクション値の側は、
+ 外部キーをアップデートする責任があります。
<!-- TODO: Does this really result in some unnecessary update statements?
-->
</para>
</sect2>
<sect2 id="collections-ternary">
- <title>3���֘A</title>
+ <title>3項関連</title>
<para>
- 3���֘A�̃}�b�s���O�ɂ�3�̃A�v���[�`������܂��B
- 1�ڂ͊֘A��C���f�b�N�X�Ƃ��� <literal>Map</literal>
��g�p����A�v���[�`�ł��B
+ 3項関連のマッピングには3つのアプローチがあります。
+ 1つ目は関連をインデックスとして <literal>Map</literal> を使用するアプローチです。
</para>
<programlisting><![CDATA[<map name="contracts">
@@ -981,32 +983,32 @@
</map>]]></programlisting>
<para>
- 2�ڂ͒P���Ɋ֘A��G���e�B�e�B��N���X�Ƃ��ă��f�����蒼���A�v���[�`�ŁA
- �p�ɂɎg���܂��B
+ 2つ目は単純に関連をエンティティ・クラスとしてモデルを作り直すアプローチで、
+ 頻繁に使われます。
</para>
<para>
- �Ō��composite�v�f��g���A�v���[�`�ł��B����Ɋւ���c�_�͌�قǍs���܂��B
+ 最後はcomposite要素を使うアプローチです。これに関する議論は後ほど行います。
</para>
</sect2>
<sect2 id="collections-idbag" revision="1">
-
<title><literal><idbag></literal>�̎g�p</title>
+
<title><literal><idbag></literal>の使用</title>
<para>
- �����L�[�͈�����̂ŁA�G���e�B�e�B�͐l�H�̎��ʎq(�㗝�L�[)���ׂ��ł���Ƃ����l��������́A
-
���Α��֘A�ƒl�̃R���N�V�������L�[��p�����e�[�u���փ}�b�s���O����̂͏�����Ɋ����邩�����܂���I
- �m���ɂ��̍l�����ɂ͋c�_�̗]�n������܂��B
- �����Ȋ֘A�e�[�u���͑㗝�L�[��g���Ă���v���Ȃ��悤�Ɏv���邩��ł�
- �i�����l�̃R���N�V�����͗��v������ <emphasis>����</emphasis>
����܂��j�B
- �Ƃ͂����AHibernate�͑㗝�L�[���e�[�u���֑��Α��֘A�ƒl�̃R���N�V������
- �}�b�s���O����@�\������Ă��܂��B
+ 複合キーは悪いもので、エンティティは人工の識別子(代理キー)を持つべきであるという考え方からは、
+ 多対多関連と値のコレクションを複合キーを用いたテーブルへマッピングするのは少し奇妙に感じるかもしれません!
+ 確かにこの考え方には議論の余地があります。
+ 純粋な関連テーブルは代理キーを使っても利益を得られないように思えるからです
+ (合成値のコレクションは利益がある <emphasis>かも</emphasis> しれませんが)。
+ とはいえ、Hibernateは代理キーを持つテーブルへ多対多関連と値のコレクションを
+ マッピングする機能も備えています。
</para>
<para>
- bag�̃Z�}���e�B�b�N�X������ <literal>List</literal>�i�܂���
<literal>Collection</literal>�j��
- <literal><idbag></literal> �v�f�Ƀ}�b�s���O�ł��܂��B
+ bagのセマンティックスを持った <literal>List</literal>(または
<literal>Collection</literal>)を
+ <literal><idbag></literal> 要素にマッピングできます。
</para>
<programlisting><![CDATA[<idbag name="lovers"
table="LOVERS">
@@ -1018,22 +1020,22 @@
</idbag>]]></programlisting>
<para>
- �����m�̂悤�� <literal><idbag></literal>
�̓G���e�B�e�B��N���X�̂悤��
- �l�H�I��id�W�F�l���[�^�����Ă��܂��I
- �قȂ�㗝�L�[���ꂼ��̃R���N�V�����̗�Ɋ��蓖�Ă܂��B
- �������Ȃ���AHibernate�͂���s�̑㗝�L�[�̒l�����o���@�\�����Ă��܂���B
+ ご存知のように <literal><idbag></literal> はエンティティ・クラスのように
+ 人工的なidジェネレータを持っています!
+ 異なる代理キーをそれぞれのコレクションの列に割り当てます。
+ しかしながら、Hibernateはある行の代理キーの値を見つけ出す機構を持っていません。
</para>
<para>
- <literal><idbag></literal>
��X�V����p�t�H�[�}���X��
- �ʏ�� <literal><bag></literal>
����ǂ����Ƃɒ��ڂ��Ă��������I
- Hibernate�͌X�̍s����ʓI�Ɍ����邱�Ƃ��ł��A
- list��map�Aset�̂悤�Ɍʂɂ��̍s��X�V�A�폜�ł��܂��B
+ <literal><idbag></literal> を更新するパフォーマンスは
+ 通常の <literal><bag></literal> よりも良いことに注目してください!
+ Hibernateは個々の行を効果的に見つけることができ、
+ listやmap、setのように個別にその行を更新、削除できます。
</para>
<para>
- ���݂̎����ł́A<literal>native</literal> �Ƃ���id�����헪��
- <literal><idbag></literal>
�R���N�V�����̎��ʎq�ɑ��Ďg���܂���B
+ 現在の実装では、<literal>native</literal> というid生成戦略を
+ <literal><idbag></literal> コレクションの識別子に対して使えません。
</para>
</sect2>
@@ -1055,10 +1057,10 @@
</sect1-->
<sect1 id="collections-example" revision="1">
- <title>�R���N�V�����̗�</title>
+ <title>コレクションの例</title>
<para>
- ����܂ł̐߂̐���ł͗����ɂ����̂ŁA�ȉ��̗���Ă��������B
+ これまでの節の説明では理解しにくいので、以下の例を見てください。
</para>
<programlisting><![CDATA[package eg;
@@ -1079,8 +1081,8 @@
}]]></programlisting>
<para>
- ���̃N���X�� <literal>Child</literal>
�C���X�^���X�̃R���N�V���������Ă��܂��B
- ����e�X��child���ő�ł���parent�����Ă���Ȃ�A�ł���R�ȃ}�b�s���O�͈�Α��֘A�ł��B
+ このクラスは <literal>Child</literal> インスタンスのコレクションを持っています。
+ もし各々のchildが最大でも一つのparentを持っているならば、最も自然なマッピングは一対多関連です。
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -1105,7 +1107,7 @@
</hibernate-mapping>]]></programlisting>
<para>
- ����͈ȉ��̃e�[�u����`�Ƀ}�b�s���O���܂��B
+ これは以下のテーブル定義にマッピングします。
</para>
<programlisting><![CDATA[create table parent ( id bigint not null
primary key )
@@ -1113,7 +1115,7 @@
alter table child add constraint childfk0 (parent_id) references
parent]]></programlisting>
<para>
- ���parent�� <emphasis>�v��</emphasis>
�����Ȃ�A�o�����̈�Α��֘A��g�p���Ă��������B
+ もしparentが <emphasis>要求</emphasis> されるなら、双方向の一対多関連を使用してください。
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -1139,7 +1141,7 @@
</hibernate-mapping>]]></programlisting>
<para>
- <literal>NOT NULL</literal> ����ɒ��ӂ��Ă��������B
+ <literal>NOT NULL</literal> 制約に注意してください。
</para>
<programlisting><![CDATA[create table parent ( id bigint not null
primary key )
@@ -1150,8 +1152,8 @@
alter table child add constraint childfk0 (parent_id) references
parent]]></programlisting>
<para>
- ���邢�́A������̊֘A�͒P�����ł���ׂ��Ƌ����咣����̂ł���A
- <literal><key></literal> �� <literal>NOT
NULL</literal> �����錾�ł��܂��B
+ あるいは、もしこの関連は単方向であるべきと強く主張するのであれば、
+ <literal><key></literal> に <literal>NOT
NULL</literal> 制約を宣言できます。
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -1176,7 +1178,7 @@
</hibernate-mapping>]]></programlisting>
<para>
- ����ŁA���child��������parent���Ă�Ȃ�A���Α��֘A���Ó��ł��B
+ 一方で、もしchildが複数のparentを持てるならば、多対多関連が妥当です。
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -1201,7 +1203,7 @@
</hibernate-mapping>]]></programlisting>
<para>
- �e�[�u����`�͈ȉ��̂悤�ɂȂ�܂��B
+ テーブル定義は以下のようになります。
</para>
<programlisting><![CDATA[create table parent ( id bigint not null
primary key )
@@ -1213,12 +1215,12 @@
alter table childset add constraint childsetfk1 (child_id) references
child]]></programlisting>
<para>
- parent/child�W�̃}�b�s���O�ɂ��Ă̂�葽���̗�⊮�S�Ȏ菇���K�v�ł���A
- <xref linkend="example-parentchild"/> �������������B
+ parent/child関係のマッピングについてのより多くの例や完全な手順が必要であれば、
+ <xref linkend="example-parentchild"/> をご覧ください。
</para>
<para>
- �܂��A����ɓ���Ȋ֘A�}�b�s���O��\�ł��B���̏͂ŏڂ����q�ׂ܂��B
+ また、さらに特殊な関連マッピングも可能です。次の章で詳しく述べます。
</para>
</sect1>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/component_mapping.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/component_mapping.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/component_mapping.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,20 +1,22 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="components">
- <title>�R���|�[�l���g�̃}�b�s���O</title>
+ <title>コンポーネントのマッピング</title>
<para>
- <emphasis>�R���|�[�l���g</emphasis>
�̊T�O�́AHibernate��ʂ��ėl�X�ȏ̒���
- �قȂ�ړI�̂��߂ɍė��p����܂��B
+ <emphasis>コンポーネント</emphasis> の概念は、Hibernateを通して様々な状況の中で
+ 異なる目的のために再利用されます。
</para>
<sect1 id="components-dependentobjects" revision="2" >
- <title>�ˑ��I�u�W�F�N�g</title>
+ <title>依存オブジェクト</title>
<para>
- �R���|�[�l���g�́A�G���e�B�e�B�̎Q�Ƃł͂Ȃ��l�^�Ƃ��ĉi�������ꂽ�A
- ��܂��ꂽ�I�u�W�F�N�g�ł��B�R���|�[�l���g�Ƃ������t�ɂ��ẮA�R���|�W�V�����Ƃ���
-
�I�u�W�F�N�g�w���̊T�O��Q�Ƃ��Ă��������i�A�[�L�e�N�`�����x���̃R���|�[�l���g�ł͂���܂���j�B
- �Ⴆ�A�ȉ���Person���f���̂悤�Ȃ�̂ł��B
+ コンポーネントは、エンティティの参照ではなく値型として永続化された、
+ 包含されたオブジェクトです。コンポーネントという言葉については、コンポジションという
+ オブジェクト指向の概念を参照してください(アーキテクチャレベルのコンポーネントではありません)。
+ 例えば、以下のPersonモデルのようなものです。
</para>
<programlisting><![CDATA[public class Person {
@@ -68,14 +70,14 @@
}]]></programlisting>
<para>
- ���܁A<literal>Name</literal> ��
<literal>Person</literal> �̃R���|�[�l���g�Ƃ���
- �i�������邱�Ƃ��o���܂��B������ <literal>Name</literal>
�͉i���������ɑ���getter�A
- setter���\�b�h���`���܂����A�C���^�[�t�F�C�X�⎯�ʎq�v���p�e�B���`����K�v��
- �Ȃ����Ƃɒ��ӂ��ĉ������B
+ いま、<literal>Name</literal> は
<literal>Person</literal> のコンポーネントとして
+ 永続化することが出来ます。ここで <literal>Name</literal> は永続化属性に対してgetter、
+ setterメソッドを定義しますが、インターフェイスや識別子プロパティを定義する必要が
+ ないことに注意して下さい。
</para>
<para>
- �}�b�s���O��`�͈ȉ��̂悤�ɂȂ�܂��B
+ マッピング定義は以下のようになります。
</para>
<programlisting><![CDATA[<class name="eg.Person"
table="person">
@@ -91,33 +93,33 @@
</class>]]></programlisting>
<para>
- Person�e�[�u���� <literal>pid</literal>�A
- <literal>birthday</literal>�A
- <literal>initial</literal>�A
- <literal>first</literal>�A
- <literal>last</literal> �J���������܂��B
+ Personテーブルは <literal>pid</literal>、
+ <literal>birthday</literal>、
+ <literal>initial</literal>、
+ <literal>first</literal>、
+ <literal>last</literal> カラムを持ちます。
</para>
<para>
- �S�Ă̒l�^�̂悤�ɁA�R���|�[�l���g�͎Q�Ƃ̋��L���邱�Ƃ��ł��܂���B
- ����������ƁA��l��Person�͓������O�����Ƃ��ł��܂����A���Person�I�u�W�F�N�g��
- "�l����������"�̕ʁX��name�I�u�W�F�N�g��܂�ł���Ƃ������Ƃł��B
- �R���|�[�l���g��null�l�̃Z�}���e�B�N�X��
<emphasis>�A�h�z�b�N</emphasis> �ł��B
-
�R���|�[�l���g�̃I�u�W�F�N�g��ēǂݍ��݂���ہAHibernate�̓R���|�[�l���g�̂��ׂẴJ������
- null�ł���Ȃ�R���|�[�l���g���̂�null�ł���ƍl���܂��B
- ����͑��̏ꍇ��肠��܂���B
+ 全ての値型のように、コンポーネントは参照の共有をすることができません。
+ 言い換えると、二人のPersonは同じ名前を持つことができますが、二つのPersonオブジェクトは
+ "値が同じだけ"の別々のnameオブジェクトを含んでいるということです。
+ コンポーネントのnull値のセマンティクスは <emphasis>アドホック</emphasis> です。
+ コンポーネントのオブジェクトを再読み込みする際、Hibernateはコンポーネントのすべてのカラムが
+ nullであるならコンポーネント自体がnullであると考えます。
+ これは大抵の場合問題ありません。
</para>
<para>
-
�R���|�[�l���g�̑����͂ǂ��Hibernate�̌^�ł�\���܂���i�R���N�V�����Amany-to-one�֘A�A
- ���̃R���|�[�l���g�Ȃǁj�B�l�X�g���ꂽ�R���|�[�l���g�͖ő��Ɏg��Ȃ��ƍl����ׂ��ł�
- <emphasis>����܂���</emphasis>
�BHibernate�͔��ɂ��߂ׂ̍����I�u�W�F�N�g���f����T�|�[�g����悤�ɈӐ}����Ă��܂��B
+ コンポーネントの属性はどんなHibernateの型でも構いません(コレクション、many-to-one関連、
+ 他のコンポーネントなど)。ネストされたコンポーネントは滅多に使わないと考えるべきでは
+ <emphasis>ありません</emphasis>
。Hibernateは非常にきめの細かいオブジェクトモデルをサポートするように意図されています。
</para>
<para>
- <literal><component></literal>
�v�f�͐e�G���e�B�e�B�ւ̋t�Q�ƂƂ��āA�R���|�[�l���g�N���X��
- ������}�b�s���O���� <literal><parent></literal>
�T�u�v�f��g�p�ł��܂��B
+ <literal><component></literal>
要素は親エンティティへの逆参照として、コンポーネントクラスの
+ 属性をマッピングする <literal><parent></literal>
サブ要素を使用できます。
</para>
<programlisting><![CDATA[<class name="eg.Person"
table="person">
@@ -137,12 +139,12 @@
<sect1 id="components-incollections" revision="1">
- <title>�]������I�u�W�F�N�g�̃R���N�V����</title>
+ <title>従属するオブジェクトのコレクション</title>
<para>
- Hibernate�̓R���|�[�l���g�̃R���N�V������T�|�[�g���Ă��܂��i�Ⴆ��
<literal>Name</literal> �^�̔z��j�B
- <literal><element></literal> �^�O��
<literal><composite-element></literal> �^�O�Ɏ��ւ��邱�Ƃɂ��
- �R���|�[�l���g�R���N�V������錾���Ă��������B
+ Hibernateはコンポーネントのコレクションをサポートしています(例えば <literal>Name</literal>
型の配列)。
+ <literal><element></literal> タグを
<literal><composite-element></literal> タグに取り替えることにより
+ コンポーネントコレクションを宣言してください。
</para>
<programlisting><![CDATA[<set name="someNames"
table="some_names" lazy="true">
@@ -155,35 +157,35 @@
</set>]]></programlisting>
<para>
- ����: �R���|�W�b�g�G�������g�� <literal>Set</literal>
���`�����Ȃ�A
- <literal>equals()</literal> ��
<literal>hashCode()</literal> �𐳂����������邱�Ƃ��d�v�ł��B
+ 注意: コンポジットエレメントの <literal>Set</literal> を定義したなら、
+ <literal>equals()</literal> と
<literal>hashCode()</literal> を正しく実装することが重要です。
</para>
<para>
- �R���|�W�b�g�G�������g�̓R���N�V������܂܂��A�R���|�[�l���g��܂ނ��Ƃ����܂��B
- �R���|�W�b�g�G�������g���g���R���|�[�l���g��܂�ł���ꍇ��
<literal><nested-composite-element></literal> ��
-
�g�p���Ă��������B�R���|�[�l���g�̃R���N�V�������g���R���|�[�l���g���Ƃ����P�[�X�͂߂����ɂ���܂���B
- ���̒i�K�܂łɁAone-to-many�֘A�̕������K�łȂ����Ən�l���Ă��������B
- �R���|�W�b�g�G�������g��G���e�B�e�B�Ƃ��čēx���f�����O���Ă݂Ă��������B
-
�����������Java�̃��f���Ƃ��Ă͓����ł����A�����[�V���i�����f���Ɖi������͂܂���قȂ邱�Ƃɒ��ӂ��Ă��������B
+ コンポジットエレメントはコレクションを含まず、コンポーネントを含むこともあります。
+ コンポジットエレメント自身がコンポーネントを含んでいる場合は
<literal><nested-composite-element></literal> を
+ 使用してください。コンポーネントのコレクション自身がコンポーネントを持つというケースはめったにありません。
+ この段階までに、one-to-many関連の方がより適切でないかと熟考してください。
+ コンポジットエレメントをエンティティとして再度モデリングしてみてください。
+ しかしこれはJavaのモデルとしては同じですが、リレーショナルモデルと永続動作はまだ若干異なることに注意してください。
</para>
<para>
- ��� <literal><set></literal>
��g�p����̂ł���A�R���|�W�b�g�G�������g�̃}�b�s���O��null�l���\��
- ������T�|�[�g���Ă��Ȃ����Ƃɒ��ӂ��Ă��������BHibernate�̓I�u�W�F�N�g��폜����Ƃ��A
- ���R�[�h���ʂ��邽�߂ɂ��ꂼ��̃J�����̒l��g�p����K�v�����邽�߁Anull�l�����Ƃ��o���܂���
- �i�R���|�W�b�g�G�������g�e�[�u���ɂ͕ʂ̎�L�[�J�����͂���܂���j�B
- �R���|�W�b�g�G�������g��not-null�̑����݂̂�g�p���邩�A�܂���
<literal><list></literal>�A<literal><map></literal>�A
-
<literal><bag></literal>�A<literal><idbag></literal>
��I����K�v������܂��B
+ もし <literal><set></literal>
を使用するのであれば、コンポジットエレメントのマッピングがnull値が可能な
+ 属性をサポートしていないことに注意してください。Hibernateはオブジェクトを削除するとき、
+ レコードを識別するためにそれぞれのカラムの値を使用する必要があるため、null値を持つことが出来ません
+ (コンポジットエレメントテーブルには別の主キーカラムはありません)。
+ コンポジットエレメントにnot-nullの属性のみを使用するか、または
<literal><list></literal>、<literal><map></literal>、
+
<literal><bag></literal>、<literal><idbag></literal>
を選択する必要があります。
</para>
<para>
- �R���|�W�b�g�G�������g�̓��ʂȃP�[�X�Ƃ��āA�l�X�g���ꂽ
<literal><many-to-one></literal> ��������
- �R���|�W�b�g�G�������g������܂��B
- ���̃}�b�s���O�́A�R���|�W�b�g�G�������g�N���X�𑽑Α��֘A�e�[�u����
- �]���ȃJ�����փ}�b�s���O���܂��B
- ���̗�� <literal>Order</literal>
����A<literal>Item</literal> �ւ̑��Α��֘A�ł��B
-
<literal>purchaseDate</literal>�A<literal>price</literal>�A<literal>quantity</literal>
�͊֘A�̑����ƂȂ�܂��B
+ コンポジットエレメントの特別なケースとして、ネストされた
<literal><many-to-one></literal> 属性を持つ
+ コンポジットエレメントがあります。
+ このマッピングは、コンポジットエレメントクラスを多対多関連テーブルの
+ 余分なカラムへマッピングします。
+ 次の例は <literal>Order</literal>
から、<literal>Item</literal> への多対多関連です。
+
<literal>purchaseDate</literal>、<literal>price</literal>、<literal>quantity</literal>
は関連の属性となります。
</para>
<programlisting><![CDATA[<class name="eg.Order" .... >
@@ -200,14 +202,14 @@
</class>]]></programlisting>
<para>
- ������A�o�����֘A�̃i�r�Q�[�V�����̂��߂ɔ��Α�����purchase�ւ̎Q�Ƃ��邱�Ƃ͏o���܂���B
- �R���|�[�l���g�͒l�^�ł���A�Q�Ƃ��L�ł��Ȃ����Ƃ�o���Ă����Ă��������B
- ��� <literal>Purchase</literal> �͈��
<literal>Order</literal> ��set�ɑ��݂ł��܂����A
- ������ <literal>Item</literal> ����Q�Ƃ��邱�Ƃ͏o���܂���B
+ もちろん、双方向関連のナビゲーションのために反対側からpurchaseへの参照を作ることは出来ません。
+ コンポーネントは値型であり、参照を共有できないことを覚えておいてください。
+ 一つの <literal>Purchase</literal> は一つの
<literal>Order</literal> のsetに存在できますが、
+ 同時に <literal>Item</literal> から参照することは出来ません。
</para>
<para>
- 3���֘A�i���邢��4���Ȃǁj��\�ł��B
+ 3項関連(あるいは4項など)も可能です。
</para>
<programlisting><![CDATA[<class name="eg.Order" .... >
@@ -222,61 +224,61 @@
</class>]]></programlisting>
<para>
- �R���|�W�b�g�G�������g�͑��̃G���e�B�e�B�ւ̊֘A�Ƃ��āA
- �����V���^�b�N�X��g���Ă���N�G����Ŏg�p�ł��܂��B
+ コンポジットエレメントは他のエンティティへの関連として、
+ 同じシンタックスを使っているクエリ内で使用できます。
</para>
</sect1>
<sect1 id="components-asmapindex">
- <title>Map�̃C���f�b�N�X�Ƃ��ẴR���|�[�l���g</title>
+ <title>Mapのインデックスとしてのコンポーネント</title>
<para>
- <literal><composite-map-key></literal> �v�f��
<literal>Map</literal> �̃L�[�Ƃ��ăR���|�[�l���g�N���X��
- �}�b�s���O���܂��B�R���|�[�l���g�N���X���
<literal>hashCode()</literal> �� <literal>equals()</literal>
- �𐳊m�ɃI�[�o�[���C�h���Ă��������B
+ <literal><composite-map-key></literal> 要素は
<literal>Map</literal> のキーとしてコンポーネントクラスを
+ マッピングします。コンポーネントクラス上で <literal>hashCode()</literal> と
<literal>equals()</literal>
+ を正確にオーバーライドしてください。
</para>
</sect1>
<sect1 id="components-compositeid" revision="1">
- <title>�������ʎq�Ƃ��ẴR���|�[�l���g</title>
+ <title>複合識別子としてのコンポーネント</title>
<para>
- �R���|�[�l���g��G���e�B�e�B�N���X�̎��ʎq�Ƃ��Ďg�����Ƃ��ł��܂��B
- �R���|�[�l���g�N���X�͈ȉ��̏������K�v������܂��B
+ コンポーネントをエンティティクラスの識別子として使うことができます。
+ コンポーネントクラスは以下の条件を満たす必要があります。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>java.io.Serializable</literal>
��������Ȃ���Ȃ�܂���B
+ <literal>java.io.Serializable</literal> を実装しなければなりません。
</para>
</listitem>
<listitem>
<para>
-
�f�[�^�x�[�X��̕����L�[�̓������Ɩ����̂Ȃ��悤�ɁA<literal>equals()</literal>
- �� <literal>hashCode()</literal> ��Ď������Ȃ���Ȃ�܂���B
+ データベース上の複合キーの等価性と矛盾のないように、<literal>equals()</literal>
+ と <literal>hashCode()</literal> を再実装しなければなりません。
</para>
</listitem>
</itemizedlist>
<para>
- <emphasis>����: Hibernate3�ɂ����āA2�Ԗڂ̏��͐�ΓI�ȏ��ł͂���܂���B
- �������Ƃɂ����������Ă��������B
+ <emphasis>注意: Hibernate3において、2番目の条件は絶対的な条件ではありません。
+ しかしとにかく条件を満たしてください。
</emphasis>
</para>
<para>
- �����L�[�����邽�߂� <literal>IdentifierGenerator</literal>
��g�p���邱�Ƃ͂ł��܂���B
- ����ɃA�v���P�[�V���������ʎq���蓖�ĂȂ��Ă͂Ȃ�܂���B
+ 複合キーを生成するために <literal>IdentifierGenerator</literal>
を使用することはできません。
+ 代わりにアプリケーションが識別子を割り当てなくてはなりません。
</para>
<para>
- �ʏ�� <literal><id></literal> �錾�̑����
<literal><composite-id></literal> �^�O��
- �i�l�X�g���ꂽ <literal><key-property></literal>
�����Ƌ��Ɂj�g���܂��B
- �ȉ��̗�ł́A<literal>OrderLine</literal> �N���X��
<literal>Order</literal> �́i�����j��L�[��
- �ˑ�������L�[�����Ă��܂��B
+ 通常の <literal><id></literal> 宣言の代わりに
<literal><composite-id></literal> タグを
+ (ネストされた <literal><key-property></literal>
属性と共に)使います。
+ 以下の例では、<literal>OrderLine</literal> クラスは
<literal>Order</literal> の(複合)主キーに
+ 依存した主キーを持っています。
</para>
<programlisting><![CDATA[<class name="OrderLine">
@@ -299,9 +301,9 @@
</class>]]></programlisting>
<para>
- ���̂Ƃ��A<literal>OrderLine</literal>
�e�[�u���֊֘A����O���L�[��܂������ł��B
- ���̃N���X�̃}�b�s���O�ł����錾���Ȃ���Ȃ�܂���B
- <literal>OrderLine</literal> �ւ̊֘A�͎��̂悤�Ƀ}�b�s���O����܂��B
+ このとき、<literal>OrderLine</literal> テーブルへ関連する外部キーもまた複合です。
+ 他のクラスのマッピングでこれを宣言しなければなりません。
+ <literal>OrderLine</literal> への関連は次のようにマッピングされます。
</para>
<programlisting><![CDATA[<many-to-one name="orderLine"
class="OrderLine">
@@ -312,13 +314,13 @@
</many-to-one>]]></programlisting>
<para>
- �i<literal><column></literal> �^�O�͂ǂ��ł����Ă�
<literal>column</literal> ������
- ����ɂȂ�܂��B�j
+ (<literal><column></literal> タグはどこであっても
<literal>column</literal> 属性の
+ 代わりになります。)
</para>
<para>
- <literal>OrderLine</literal> �ւ�
<literal>many-to-many</literal> �֘A��
- �����O���L�[��g���܂��B
+ <literal>OrderLine</literal> への
<literal>many-to-many</literal> 関連も
+ 複合外部キーを使います。
</para>
<programlisting><![CDATA[<set name="undeliveredOrderLines">
@@ -331,8 +333,8 @@
</set>]]></programlisting>
<para>
- <literal>Order</literal> �ɂ���
<literal>OrderLine</literal> �̃R���N�V������
- ���̂�̂�g�p���܂��B
+ <literal>Order</literal> にある
<literal>OrderLine</literal> のコレクションは
+ 次のものを使用します。
</para>
<programlisting><![CDATA[<set name="orderLines"
inverse="true">
@@ -344,12 +346,12 @@
</set>]]></programlisting>
<para>
- �i<literal><one-to-many></literal>
�����́A��ɂ���ăJ������錾���܂���j
+ (<literal><one-to-many></literal>
属性は、例によってカラムを宣言しません)
</para>
<para>
- <literal>OrderLine</literal> ���g���R���N�V���������Ă���ꍇ�A
- �����ɕ����O���L�[������Ă��܂��B
+ <literal>OrderLine</literal> 自身がコレクションを持っている場合、
+ 同時に複合外部キーも持っています。
</para>
<programlisting><![CDATA[<class name="OrderLine">
@@ -371,10 +373,10 @@
</sect1>
<sect1 id="components-dynamic" revision="1">
- <title>���I�R���|�[�l���g</title>
+ <title>動的コンポーネント</title>
<para>
- <literal>Map</literal> �^�̃v���p�e�B�̃}�b�s���O��\�ł��B
+ <literal>Map</literal> 型のプロパティのマッピングも可能です。
</para>
<programlisting><![CDATA[<dynamic-component
name="userAttributes">
@@ -384,11 +386,11 @@
</dynamic-component>]]></programlisting>
<para>
- <literal><dynamic-component></literal>
�}�b�s���O�̃Z�}���e�B�N�X�� <literal><component></literal>
-
�Ɠ���̂�̂ł��B���̎�̃}�b�s���O�̗��_�́A�}�b�s���O�h�L�������g�̕ҏW�ɂ��A�z�u����bean�̑�����
-
����ł���_�ł��B�܂��ADOM�p�[�T�𗘗p���āA�}�b�s���O�h�L�������g�̃����^�C�����삪�\�ł��B
- ����ɁA<literal>Configuration</literal>
�I�u�W�F�N�g�o�R��Hibernate�̃R���t�B�O���[�V�������̃��^���f����
- �A�N�Z�X�i�܂��͕ύX�j���\�ł��B
+ <literal><dynamic-component></literal>
マッピングのセマンティクスは <literal><component></literal>
+ と同一のものです。この種のマッピングの利点は、マッピングドキュメントの編集により、配置時にbeanの属性を
+ 決定できる点です。また、DOMパーサを利用して、マッピングドキュメントのランタイム操作が可能です。
+ さらに、<literal>Configuration</literal>
オブジェクト経由でHibernateのコンフィグレーション時のメタモデルに
+ アクセス(または変更)が可能です。
</para>
</sect1>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/configuration.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/configuration.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/configuration.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,30 +1,32 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="session-configuration" revision="1">
- <title>�ݒ�</title>
+ <title>設定</title>
<para>
- Hibernate�͂��܂��܂Ȋ��œ��삷��悤�Ƀf�U�C������Ă��邽�߁A���ɑ����̐ݒ�v�f������܂��B
- �K���Ȃ��ƂɁAHibernate�́A���J����Ă���p�b�P�[�W��
<literal>etc/</literal> �t�H���_��
<literal>hibernate.properties</literal>
- �ɁA�قƂ�ǂ̐ݒ�v�f�̓K�ȃf�t�H���g�l���L�q����Ă��܂��B
- ���� <literal>hibernate.properties</literal>
��N���X�p�X�ɐݒ肵�A�ݒ�v�f��J�X�^�}�C�Y���邾���ł��B
+ Hibernateはさまざまな環境で動作するようにデザインされているため、非常に多くの設定要素があります。
+ 幸いなことに、Hibernateは、公開されているパッケージの <literal>etc/</literal> フォルダの
<literal>hibernate.properties</literal>
+ に、ほとんどの設定要素の適切なデフォルト値が記述されています。
+ この <literal>hibernate.properties</literal>
をクラスパスに設定し、設定要素をカスタマイズするだけです。
</para>
<sect1 id="configuration-programmatic" revision="1">
- <title>�v���O������̐ݒ�</title>
+ <title>プログラム上の設定</title>
<para>
- <literal>org.hibernate.cfg.Configuration</literal>
�̃C���X�^���X�́A
- Java�̌^��SQL�f�[�^�x�[�X�̃}�b�s���O�����ׂĎ����Ă��܂��B
- The <literal>Configuration</literal> �́A�i�s�ς́j
<literal>SessionFactory</literal>
- ������Ƃ��Ɏg�p���܂��B
- ������XML�}�b�s���O�t�@�C����ϊ����A�}�b�s���O���ɂ��܂��B
+ <literal>org.hibernate.cfg.Configuration</literal> のインスタンスは、
+ Javaの型とSQLデータベースのマッピング情報をすべて持っています。
+ The <literal>Configuration</literal> は、(不変の)
<literal>SessionFactory</literal>
+ を生成するときに使用します。
+ 複数のXMLマッピングファイルを変換し、マッピング情報にします。
</para>
<para>
- �ʏ�A<literal>Configuration</literal>
�C���X�^���X�́A�����XML�}�b�s���O�t�@�C��
- �ɂ���Ē��ڏ���������܂��B����A�}�b�s���O�t�@�C�����N���X�p�X�ɐݒ肳��Ă���ꍇ�A
- ���̃��\�b�h��g���Ă��������B <literal>addResource()</literal> :
+ 通常、<literal>Configuration</literal> インスタンスは、特定のXMLマッピングファイル
+ によって直接初期化されます。もし、マッピングファイルがクラスパスに設定されている場合、
+ 次のメソッドを使ってください。 <literal>addResource()</literal> :
</para>
<programlisting><![CDATA[Configuration cfg = new Configuration()
@@ -32,8 +34,8 @@
.addResource("Bid.hbm.xml");]]></programlisting>
<para>
-
��ֈ�(������̂ق����ǂ��Ƃ������܂�)�Ƃ��ă}�b�s���O�N���X��w�肷����@�����܂��BHibernate�ɁA�}�b�s���O�t�@�C����
- �����������������F
+ 代替案(こちらのほうが良いときもあります)としてマッピングクラスを指定する方法もあります。Hibernateに、マッピングファイルを
+ 見つけさせてください:
</para>
<programlisting><![CDATA[Configuration cfg = new Configuration()
@@ -41,14 +43,14 @@
.addClass(org.hibernate.auction.Bid.class);]]></programlisting>
<para>
- Hibernate�́A�N���X�p�X�ɂ���ȉ��̂悤�Ȗ��O�̃}�b�s���O�t�@�C�������܂��B
- <literal>/org/hibernate/auction/Item.hbm.xml</literal> �A
- <literal>/org/hibernate/auction/Bid.hbm.xml</literal> �B
- ���̕��@���ƁA�n�[�h�R�[�f�B���O���ꂽ�t�@�C������r���ł��܂��B
+ Hibernateは、クラスパスにある以下のような名前のマッピングファイルを見つけます。
+ <literal>/org/hibernate/auction/Item.hbm.xml</literal> 、
+ <literal>/org/hibernate/auction/Bid.hbm.xml</literal> 。
+ この方法だと、ハードコーディングされたファイル名を排除できます。
</para>
<para>
- <literal>Configuration</literal>
�́A�ݒ�v���p�e�B��w�肷�邱�Ƃ�ł��܂��F
+ <literal>Configuration</literal> は、設定プロパティを指定することもできます:
</para>
<programlisting><![CDATA[Configuration cfg = new Configuration()
@@ -59,103 +61,103 @@
.setProperty("hibernate.order_updates",
"true");]]></programlisting>
<para>
- Hibernate�ɐݒ�v���p�e�B��ʂ����@��1�ł͂���܂���B
- ���܂��܂ȃI�v�V������p�ӂ��Ă��܂��F
+ Hibernateに設定プロパティを通す方法は1つではありません。
+ さまざまなオプションを用意しています:
</para>
<orderedlist spacing="compact">
<listitem>
<para>
- <literal>java.util.Properties</literal> �C���X�^���X��
- <literal>Configuration.setProperties()</literal>
�ɓn���܂��B
+ <literal>java.util.Properties</literal> インスタンスを
+ <literal>Configuration.setProperties()</literal> に渡します。
</para>
</listitem>
<listitem>
<para>
- <literal>hibernate.properties</literal> ��
- �N���X�p�X�̃��[�g�f�B���N�g���ɒu���܂��B
+ <literal>hibernate.properties</literal> を
+ クラスパスのルートディレクトリに置きます。
</para>
</listitem>
<listitem>
<para>
- <literal>System</literal> �v���p�e�B��
- <literal>java -Dproperty=value</literal>
��g���悤�ɐݒ肵�܂��B
+ <literal>System</literal> プロパティが
+ <literal>java -Dproperty=value</literal> を使うように設定します。
</para>
</listitem>
<listitem>
<para>
- <literal><property></literal> �v�f��
- <literal>hibernate.cfg.xml</literal> �i��q�j�ɐݒ肵�܂��B
+ <literal><property></literal> 要素を
+ <literal>hibernate.cfg.xml</literal> (後述)に設定します。
</para>
</listitem>
</orderedlist>
<para>
- �������n�߂����̂Ȃ�A<literal>hibernate.properties</literal>
- ��g���̂���Ԃ̋ߓ��ł��B
+ 今すぐ始めたいのなら、<literal>hibernate.properties</literal>
+ を使うのが一番の近道です。
</para>
<para>
- <literal>Configuration</literal>
�́A�N�����ɂ�������I�u�W�F�N�g�ł���A
- ��x <literal>SessionFactory</literal>
��������́A�j������邱�Ƃ�Ӑ}���Ă��܂��B
+ <literal>Configuration</literal> は、起動時にだけあるオブジェクトであり、
+ 一度 <literal>SessionFactory</literal> を生成した後は、破棄されることを意図しています。
</para>
</sect1>
<sect1 id="configuration-sessionfactory">
- <title>SessionFactory��擾����</title>
+ <title>SessionFactoryを取得する</title>
<para>
- <literal>Configuration</literal> �����ׂẴ}�b�s���O�����͂�����A
- �A�v���P�[�V�����́A <literal>Session</literal>
�t�@�N�g���C���X�^���X��擾���܂��B
- ����SessionFactory�́AHibernate��g�p���邷�ׂẴX���b�h�ŋ��L�����ׂ��ł��B
+ <literal>Configuration</literal> がすべてのマッピング情報を解析したら、
+ アプリケーションは、 <literal>Session</literal> ファクトリインスタンスを取得します。
+ このSessionFactoryは、Hibernateを使用するすべてのスレッドで共有されるべきです。
</para>
<programlisting><![CDATA[SessionFactory sessions =
cfg.buildSessionFactory();]]></programlisting>
<para>
- Hibernate�́A <literal>SessionFactory</literal>
���������邱�Ƃ��ł��܂��B
- ����́A�����̃f�[�^�x�[�X��g�p����ꍇ�ɕ֗��ł��B
+ Hibernateは、 <literal>SessionFactory</literal> を複数生成することができます。
+ これは、複数のデータベースを使用する場合に便利です。
</para>
</sect1>
<sect1 id="configuration-hibernatejdbc" revision="1">
- <title>JDBC�R�l�N�V����</title>
+ <title>JDBCコネクション</title>
<para>
- �ʏ�A�J���҂� <literal>SessionFactory</literal>
�����ASessionFactory��JDBC�R�l�N�V������v�[�����O�������ƍl���܂��B
- ���̃A�v���[�`��̗p����ꍇ�A�P���� <literal>Session</literal>
��I�[�v�������������F
+ 通常、開発者は <literal>SessionFactory</literal>
を生成し、SessionFactoryでJDBCコネクションをプーリングしたいと考えます。
+ そのアプローチを採用する場合、単純に <literal>Session</literal> をオープンしてください:
</para>
<programlisting><![CDATA[Session session = sessions.openSession(); //
open a new Session]]></programlisting>
<para>
- ���ꂾ���ŁA�v�[�����O����JDBC�R�l�N�V������g���ĖړI�̃f�[�^�x�[�X
- �ɃA�N�Z�X���邱�Ƃ��ł��܂��B
+ これだけで、プーリングしたJDBCコネクションを使って目的のデータベース
+ にアクセスすることができます。
</para>
<para>
- ���̂��߂ɂ́AJDBC�R�l�N�V�����̃v���p�e�B��Hibernate�ɐݒ肷��K�v������܂��B
- ���ׂĂ�Hibernate�v���p�e�B���ƃZ�}���e�B�N�X��
- <literal>org.hibernate.cfg.Environment</literal>
�N���X�ɒ�`����Ă��܂��B
- ���̐ݒ��JDBC�R�l�N�V�����ݒ�̒��ň�ԏd�v�Ȃ�̂ł��B
+ そのためには、JDBCコネクションのプロパティをHibernateに設定する必要があります。
+ すべてのHibernateプロパティ名とセマンティクスは
+ <literal>org.hibernate.cfg.Environment</literal> クラスに定義されています。
+ この設定はJDBCコネクション設定の中で一番重要なものです。
</para>
<para>
- ����A�ȉ��̃v���p�e�B��ݒ肷��ƁAHibernate�̓R�l�N�V������擾����i�v�[����j���߂�
- <literal>java.sql.DriverManager</literal> ��g���܂��B
+ もし、以下のプロパティを設定すると、Hibernateはコネクションを取得する(プールも)ために
+ <literal>java.sql.DriverManager</literal> を使います。
</para>
<table frame="topbot">
- <title>Hibernate JDBC�v���p�e�B</title>
+ <title>Hibernate JDBCプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
- <entry>�v���p�e�B��</entry>
- <entry>�Ӗ�</entry>
+ <entry>プロパティ名</entry>
+ <entry>意味</entry>
</row>
</thead>
<tbody>
@@ -164,7 +166,7 @@
<literal>hibernate.connection.driver_class</literal>
</entry>
<entry>
- <emphasis>JDBC�h���C�o�N���X</emphasis>
+ <emphasis>JDBCドライバクラス</emphasis>
</entry>
</row>
<row>
@@ -196,7 +198,7 @@
<literal>hibernate.connection.pool_size</literal>
</entry>
<entry>
- <emphasis>�v�[������R�l�N�V�����̍ő吔</emphasis>
+ <emphasis>プールするコネクションの最大数</emphasis>
</entry>
</row>
</tbody>
@@ -204,26 +206,26 @@
</table>
<para>
- Hibernate�̃R�l�N�V�����v�[���A���S���Y���͔��ɏ���I�Ȃ�̂ł��B
-
����͂����Ɏn�߂���悤�ɂƗp�ӂ��ꂽ��̂ŁA<emphasis>���i�Ƃ��Ďg�p���邱�Ƃ�Ӑ}���Ă��܂���</emphasis>
�B
- �܂��A�p�t�H�[�}���X�̃e�X�g�̂��߂̂�̂ł����܂���B
-
�ō��̃p�t�H�[�}���X�ƈ��萫�������v�[���������������A�T�[�h�p�[�e�B�̃c�[�������߂��܂��B
- <literal>hibernate.connection.pool_size</literal> �v���p�e�B��
- �K�ȃR�l�N�V�����v�[���T�C�Y��L�q���Ă��������B
- ���̂܂܂���Hibernate�̃R�l�N�V�����v�[����g���܂��B
- �Ⴆ�Ύ��̂悤��C3P0��g���܂��B
+ Hibernateのコネクションプールアルゴリズムは非常に初歩的なものです。
+ これはすぐに始められるようにと用意されたもので、<emphasis>製品として使用することを意図していません</emphasis>
。
+ また、パフォーマンスのテストのためのものでもありません。
+ 最高のパフォーマンスと安定性を持ったプールを実現したければ、サードパーティのツールをお勧めします。
+ <literal>hibernate.connection.pool_size</literal> プロパティに
+ 適切なコネクションプールサイズを記述してください。
+ このままだとHibernateのコネクションプールを使います。
+ 例えば次のようにC3P0を使います。
</para>
<para>
- C3P0�̓I�[�v���\�[�XJDBC�R�l�N�V�����v�[���ŁAHibernate��
<literal>lib</literal>
- �f�B���N�g���ɂ���܂��B����A<literal>hibernate.c3p0.*</literal>
�v���p�e�B��
- �Z�b�g����AHibernate�́A
<literal>C3P0ConnectionProvider</literal> ��g���܂��B
- ���Proxool��g�������ꍇ�́A <literal>hibernate.properties</literal>
�p�b�P�[�W��
- �Q�Ƃ�����AHibernate��Web�T�C�g�ł�葽���̏���擾���Ă��������B
+ C3P0はオープンソースJDBCコネクションプールで、Hibernateの <literal>lib</literal>
+ ディレクトリにあります。もし、<literal>hibernate.c3p0.*</literal> プロパティを
+ セットすれば、Hibernateは、 <literal>C3P0ConnectionProvider</literal>
を使います。
+ もしProxoolを使いたい場合は、 <literal>hibernate.properties</literal>
パッケージを
+ 参照したり、HibernateのWebサイトでより多くの情報を取得してください。
</para>
<para>
- C3P0�p�� <literal>hibernate.properties</literal>
�t�@�C�����Ƃ��Ď����܂��F
+ C3P0用の <literal>hibernate.properties</literal> ファイルを例として示します:
</para>
<programlisting id="c3p0-configuration"
revision="1"><![CDATA[hibernate.connection.driver_class =
org.postgresql.Driver
@@ -237,21 +239,21 @@
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect]]></programlisting>
<para>
- �A�v���P�[�V�����T�[�o��Ŏg���ꍇ�́AHibernate��ݒ肵�A
- �A�v���P�[�V�����T�[�o����R�l�N�V������擾����悤�ɂ��Ă��������B
- <literal>Datasource</literal> ��JNDI�ɓo�^���܂��B������
- �v���p�e�B��ȉ��̂悤�ɐݒ肵�Ă��������B
+ アプリケーションサーバ上で使う場合は、Hibernateを設定し、
+ アプリケーションサーバからコネクションを取得するようにしてください。
+ <literal>Datasource</literal> をJNDIに登録します。そして
+ プロパティを以下のように設定してください。
</para>
<table frame="topbot">
- <title>Hibernate �f�[�^�\�[�X�v���p�e�B</title>
+ <title>Hibernate データソースプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
- <entry>�v���p�e�B��</entry>
- <entry>�Ӗ�</entry>
+ <entry>プロパティ名</entry>
+ <entry>意味</entry>
</row>
</thead>
<tbody>
@@ -260,7 +262,7 @@
<literal>hibernate.connection.datasource</literal>
</entry>
<entry>
- <emphasis>�f�[�^�\�[�X��JNDI��</emphasis>
+ <emphasis>データソースのJNDI名</emphasis>
</entry>
</row>
<row>
@@ -268,7 +270,7 @@
<literal>hibernate.jndi.url</literal>
</entry>
<entry>
- <emphasis>JNDI�v���o�C�_��URL</emphasis> (�I�v�V����)
+ <emphasis>JNDIプロバイダのURL</emphasis> (オプション)
</entry>
</row>
<row>
@@ -276,7 +278,7 @@
<literal>hibernate.jndi.class</literal>
</entry>
<entry>
- <emphasis>JNDI�N���X
<literal>InitialContextFactory</literal> </emphasis> (�I�v�V����)
+ <emphasis>JNDIクラス
<literal>InitialContextFactory</literal> </emphasis> (オプション)
</entry>
</row>
<row>
@@ -284,7 +286,7 @@
<literal>hibernate.connection.username</literal>
</entry>
<entry>
- <emphasis>database user</emphasis> (�I�v�V����)
+ <emphasis>database user</emphasis> (オプション)
</entry>
</row>
<row>
@@ -292,7 +294,7 @@
<literal>hibernate.connection.password</literal>
</entry>
<entry>
- <emphasis>database user password</emphasis> (�I�v�V����)
+ <emphasis>database user password</emphasis> (オプション)
</entry>
</row>
</tbody>
@@ -300,61 +302,61 @@
</table>
<para>
- �A�v���P�[�V�����T�[�o������ꂽJNDI�f�[�^�\�[�X��g��
- <literal>hibernate.properties</literal> �t�@�C���̗�����܂��F
+ アプリケーションサーバから提供されたJNDIデータソースを使う
+ <literal>hibernate.properties</literal> ファイルの例を示します:
</para>
<programlisting><![CDATA[hibernate.connection.datasource =
java:/comp/env/jdbc/test
-hibernate.transaction.factory_class = \
+hibernate.transaction.factory_class = ¥
org.hibernate.transaction.JTATransactionFactory
-hibernate.transaction.manager_lookup_class = \
+hibernate.transaction.manager_lookup_class = ¥
org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect]]></programlisting>
<para>
- JNDI�f�[�^�\�[�X����擾����JDBC�R�l�N�V�����́A�A�v���P�[�V�����T�[�o��
- �R���e�i�Ǘ��g�����U�N�V�����Ɏ����I�ɎQ�����܂��B
+ JNDIデータソースから取得したJDBCコネクションは、アプリケーションサーバの
+ コンテナ管理トランザクションに自動的に参加します。
</para>
<para>
- �C�ӂ̃R�l�N�V�����v���p�e�B�́A�^����ꂽ�h
<literal>hibernate.connnection</literal> �h
- �v���p�e�B���ɂ���ė^�����܂��B�Ⴆ�A <literal>charSet</literal>
��ݒ肵�����ꍇ�́A
- <literal>hibernate.connection.charSet</literal> ��g���܂��B
+ 任意のコネクションプロパティは、与えられた” <literal>hibernate.connnection</literal>
”
+ プロパティ名によって与えられます。例えば、 <literal>charSet</literal> を設定したい場合は、
+ <literal>hibernate.connection.charSet</literal> を使います。
</para>
<para>
- JDBC�R�l�N�V������擾����헪���Ǝ��̃v���O�C�����`����ꍇ�́A
- <literal>org.hibernate.connection.ConnectionProvider</literal>
�C���^�[�t�F�C�X��
- �������Ă��������B�����āA�����N���X��
<literal>hibernate.connection.provider_class</literal>
- �ɐݒ肵�Ă��������B
+ JDBCコネクションを取得する戦略を持つ独自のプラグインを定義する場合は、
+ <literal>org.hibernate.connection.ConnectionProvider</literal>
インターフェイスを
+ 実装してください。そして、実装クラスを
<literal>hibernate.connection.provider_class</literal>
+ に設定してください。
</para>
</sect1>
<sect1 id="configuration-optional" revision="1">
- <title>�I�v�V�����ݒ�v���p�e�B</title>
+ <title>オプション設定プロパティ</title>
<para>
- �����̃v���p�e�B��Hibernate�̋����𐧌䂷���̂ł��B
- �����̃v���p�e�B�͂��ׂđÓ��ȃf�t�H���g�l������A�C�ӂŐݒ肵�܂��B
+ これらのプロパティはHibernateの挙動を制御するものです。
+ これらのプロパティはすべて妥当なデフォルト値があり、任意で設定します。
</para>
<para>
-
<emphasis>���ӁF�����̃v���p�e�B��"�V�X�e�����x��"�݂̂ł��B</emphasis>
- �V�X�e�����x���v���p�e�B�� <literal>java
-Dproperty=value</literal> �A�������
- <literal>hibernate.properties</literal> �ł̂ݐݒ�\�ł��B
- ����ȊO�̐ݒ���@�� <emphasis>����܂���</emphasis> �B
+ <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�ݒ�v���p�e�B</title>
+ <title>Hibernate設定プロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
- <entry>�v���p�e�B��</entry>
- <entry>�Ӗ�</entry>
+ <entry>プロパティ名</entry>
+ <entry>意味</entry>
</row>
</thead>
<tbody>
@@ -363,10 +365,10 @@
<literal>hibernate.dialect</literal>
</entry>
<entry>
- Hibernate <literal>Dialect</literal>
�N���X��������܂��B
- ����̓����[�V���i���f�[�^�x�[�X���ƂɍœK�����ꂽSQL�����܂��B
+ Hibernate <literal>Dialect</literal> クラス名が入ります。
+ これはリレーショナルデータベースごとに最適化されたSQLを生成します。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>full.classname.of.Dialect</literal>
</para>
</entry>
@@ -376,11 +378,11 @@
<literal>hibernate.show_sql</literal>
</entry>
<entry>
- ���s���ꂽ���ׂĂ�SQL��R���\�[���ɏo�͂��܂��B
- ����̓��O�J�e�S����
<literal>org.hibernate.SQL</literal>
- �� <literal>debug</literal> ��ݒ肷����@�̑�֎�i�ł��B
+ 発行されたすべてのSQLをコンソールに出力します。
+ これはログカテゴリの <literal>org.hibernate.SQL</literal>
+ に <literal>debug</literal> を設定する方法の代替手段です。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -390,9 +392,9 @@
<literal>hibernate.format_sql</literal>
</entry>
<entry>
- ���O�ƃR���\�[����SQL��������\�����܂��B
+ ログとコンソールのSQLを美しく表示します。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -402,9 +404,9 @@
<literal>hibernate.default_schema</literal>
</entry>
<entry>
- ���������SQL���̃e�[�u���ɐݒ肷��X�L�[�}/�e�[�u���X�y�[�X�ł��B
+ 生成されるSQL文のテーブルに設定するスキーマ/テーブルスペースです。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>SCHEMA_NAME</literal>
</para>
</entry>
@@ -414,9 +416,9 @@
<literal>hibernate.default_catalog</literal>
</entry>
<entry>
- ���������SQL���̃e�[�u���ɐݒ肷��J�^���O�ł��B
+ 生成されるSQL文のテーブルに設定するカタログです。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>CATALOG_NAME</literal>
</para>
</entry>
@@ -426,9 +428,9 @@
<literal>hibernate.session_factory_name</literal>
</entry>
<entry>
- <literal>SessionFactory</literal>
�͐�����A���̖��O��JNDI�ɓo�^����܂��B
+ <literal>SessionFactory</literal>
は生成後、この名前でJNDIに登録されます。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>jndi/composite/name</literal>
</para>
</entry>
@@ -438,12 +440,12 @@
<literal>hibernate.max_fetch_depth</literal>
</entry>
<entry>
- �O�������t�F�b�`�̍ő�[�x��ݒ肵�܂��B��������֘A��
- �Έ�֘A�̂݁i��Έ�A���Έ�j�ł��B
- <literal>0</literal>
��w�肷��ƊO�������t�F�b�`�͖����ɂȂ�܂��B
+ 外部結合フェッチの最大深度を設定します。結合する関連は
+ 対一関連のみ(一対一、多対一)です。
+ <literal>0</literal> を指定すると外部結合フェッチは無効になります。
<para>
- <emphasis
role="strong">��F</emphasis>
- ��������l�� <literal>0</literal> ����
<literal>3</literal> �ł��B
+ <emphasis
role="strong">例:</emphasis>
+ 推奨する値は <literal>0</literal> から
<literal>3</literal> です。
</para>
</entry>
</row>
@@ -452,10 +454,10 @@
<literal>hibernate.default_batch_fetch_size</literal>
</entry>
<entry>
- �֘A�t�F�b�`�̃f�t�H���g�o�b�`�T�C�Y��w�肵�܂��B
+ 関連フェッチのデフォルトバッチサイズを指定します。
<para>
- <emphasis
role="strong">��F</emphasis>
- ��������l�� <literal>4</literal> ,
<literal>8</literal> , <literal>16</literal> �ł��B
+ <emphasis
role="strong">例:</emphasis>
+ 推奨する値は <literal>4</literal> ,
<literal>8</literal> , <literal>16</literal> です。
</para>
</entry>
</row>
@@ -464,8 +466,8 @@
<literal>hibernate.default_entity_mode</literal>
</entry>
<entry>
- <literal>SessionFactory</literal>
����Z�b�V������I�[�v�������Ƃ���
- �g�p����G���e�B�e�B�̃f�t�H���g���[�h��ݒ肵�܂��B
+ <literal>SessionFactory</literal>
からセッションをオープンしたときに
+ 使用するエンティティのデフォルトモードを設定します。
<para>
<literal>dynamic-map</literal>,
<literal>dom4j</literal>,
<literal>pojo</literal>
@@ -477,10 +479,10 @@
<literal>hibernate.order_updates</literal>
</entry>
<entry>
- ���ڂ��X�V���ꂽ�Ƃ��ɁA�ʂ�SQL�Ŏ�L�[��X�V���邱�Ƃ������܂��B
-
���̏ꍇ�A�������s�\�ȃV�X�e���ł́A�܂�Ƀf�b�h���b�N����������\��������܂��B
+ 項目が更新されたときに、別のSQLで主キーを更新することを強制します。
+ この場合、同時実行可能なシステムでは、まれにデッドロックが発生する可能性があります。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -490,10 +492,10 @@
<literal>hibernate.generate_statistics</literal>
</entry>
<entry>
- �L���̏ꍇ�AHibernate�̓p�t�H�[�}���X�`���[�j���O��
- �L���ȓ��v������W���܂��B
+ 有効の場合、Hibernateはパフォーマンスチューニングに
+ 有効な統計情報を収集します。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -503,10 +505,10 @@
<literal>hibernate.use_identifer_rollback</literal>
</entry>
<entry>
- �L���̏ꍇ�A�I�u�W�F�N�g���폜���ꂽ�Ƃ���
- ���ʎq�v���p�e�B���Z�b�g���A�f�t�H���g�l�ɂ�����̂����܂��B
+ 有効の場合、オブジェクトが削除されたときに
+ 識別子プロパティをリセットし、デフォルト値にしたものを生成します。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -516,10 +518,10 @@
<literal>hibernate.use_sql_comments</literal>
</entry>
<entry>
- �L���̏ꍇ�ASQL��ɃR�����g�����܂��B����̓f�o�b�N��e�Ղɂ��܂��B
- �f�t�H���g�̒l�� <literal>false</literal> �ł��B
+ 有効の場合、SQL内にコメントを生成します。これはデバックを容易にします。
+ デフォルトの値は <literal>false</literal> です。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -529,14 +531,14 @@
</table>
<table frame="topbot" id="configuration-jdbc-properties"
revision="8">
- <title>Hibernate JDBC �ƃR�l�N�V�����v���p�e�B</title>
+ <title>Hibernate JDBC とコネクションプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
- <entry>�v���p�e�B��</entry>
- <entry>�Ӗ�</entry>
+ <entry>プロパティ名</entry>
+ <entry>意味</entry>
</row>
</thead>
<tbody>
@@ -545,8 +547,8 @@
<literal>hibernate.jdbc.fetch_size</literal>
</entry>
<entry>
- �l��0�łȂ��ꍇ�AJDBC�t�F�b�`�T�C�Y���肵�܂�
- ( <literal>Statement.setFetchSize()</literal>
��Ăт܂�)�B
+ 値が0でない場合、JDBCフェッチサイズを決定します
+ ( <literal>Statement.setFetchSize()</literal>
を呼びます)。
</entry>
</row>
<row>
@@ -554,10 +556,10 @@
<literal>hibernate.jdbc.batch_size</literal>
</entry>
<entry>
- �l��0�łȂ��ꍇ�AHibernate��JDBC2�o�b�`�X�V��g�p���܂��B
+ 値が0でない場合、HibernateがJDBC2バッチ更新を使用します。
<para>
- <emphasis
role="strong">��F</emphasis>
- ��������l�� <literal>5</literal> ����
<literal>30</literal> �ł��B
+ <emphasis
role="strong">例:</emphasis>
+ 推奨する値は <literal>5</literal> から
<literal>30</literal> です。
</para>
</entry>
</row>
@@ -566,13 +568,13 @@
<literal>hibernate.jdbc.batch_versioned_data</literal>
</entry>
<entry>
- ���JDBC�h���C�o��
<literal>executeBatch()</literal> �ɂ���Đ��m�ȍs����
- �Ԃ��ꍇ�A���̃v���p�e�B�� <literal>true</literal>
�ɂ��Ă�������
- �i�ʏ�͂��̃I�v�V������ON�ɂ��܂��j�B
- Hibernate�́A�����o�[�W�����f�[�^�̂��߃o�b�`DML��g���܂��B
- �f�t�H���g�̒l�� <literal>false</literal> �ł��B
+ もしJDBCドライバが <literal>executeBatch()</literal>
によって正確な行数を
+ 返す場合、このプロパティを <literal>true</literal> にしてください
+ (通常はこのオプションをONにします)。
+ Hibernateは、自動バージョンデータのためバッチDMLを使います。
+ デフォルトの値は <literal>false</literal> です。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -582,10 +584,10 @@
<literal>hibernate.jdbc.factory_class</literal>
</entry>
<entry>
- �J�X�^�� <literal>Batcher</literal> ��I�т܂��B
- �قƂ�ǂ̃A�v���P�[�V�����ɁA���̐ݒ�͕K�v����܂���B
+ カスタム <literal>Batcher</literal> を選びます。
+ ほとんどのアプリケーションに、この設定は必要ありません。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>classname.of.BatcherFactory</literal>
</para>
</entry>
@@ -595,11 +597,11 @@
<literal>hibernate.jdbc.use_scrollable_resultset</literal>
</entry>
<entry>
- �X�N���[���\�ȃ��U���g�Z�b�g��AHibernate���g�p���܂��B
- ���̃v���p�e�B�́AJDBC�R�l�N�V�������R�l�N�V�������^�f�[�^��
- �T�|�[�g���Ă��邱�Ƃ��K�{���ɂȂ�܂��B
+ スクロール可能なリザルトセットを、Hibernateが使用します。
+ このプロパティは、JDBCコネクションがコネクションメタデータを
+ サポートしていることが必須条件になります。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -609,10 +611,10 @@
<literal>hibernate.jdbc.use_streams_for_binary</literal>
</entry>
<entry>
- JDBC��/���� <literal>binary</literal> ��
<literal>serializable</literal>
-
�̏�������/�ǂݍ��݃X�g���[����g���܂�(�V�X�e�����x���̃v���p�e�B)�B
+ JDBCへ/から <literal>binary</literal> や
<literal>serializable</literal>
+ の書き込み/読み込みストリームを使います(システムレベルのプロパティ)。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -622,13 +624,13 @@
<literal>hibernate.jdbc.use_get_generated_keys</literal>
</entry>
<entry>
- �}���̌�Ɏ����������ꂽ��L�[��擾���邽�߂�
- JDBC3
<literal>PreparedStatement.getGeneratedKeys()</literal> �̎g�p��L���ɂ��܂��B
- �����JDBC3+�h���C�o��JRE1.4+��K�v�Ƃ��A
-
���Hibernate�̎��ʎq�W�F�l���[�^�ɖ�肪��������悤�Ȃ�false�ɐݒ肵�Ă��������B
- �f�t�H���g�ł̓R�l�N�V�������^�f�[�^��g���h���C�o�̔\�͂��肵�܂��B
+ 挿入の後に自動生成された主キーを取得するための
+ JDBC3
<literal>PreparedStatement.getGeneratedKeys()</literal> の使用を有効にします。
+ これはJDBC3+ドライバとJRE1.4+を必要とし、
+ もしHibernateの識別子ジェネレータに問題が発生するようならfalseに設定してください。
+ デフォルトではコネクションメタデータを使いドライバの能力を決定します。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
@@ -638,10 +640,10 @@
<literal>hibernate.connection.provider_class</literal>
</entry>
<entry>
- JDBC�R�l�N�V������Hibernate�ɒ���Ǝ���
<literal>ConnectionProvider</literal> ��
- ���O��w�肵�܂��B
+ JDBCコネクションをHibernateに提供する独自の
<literal>ConnectionProvider</literal> の
+ 名前を指定します。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>classname.of.ConnectionProvider</literal>
</para>
</entry>
@@ -651,11 +653,11 @@
<literal>hibernate.connection.isolation</literal>
</entry>
<entry>
- JDBC�g�����U�N�V�����������x����ݒ肵�܂��B
- �Ó��Ȓl�ׂ邽�߂ɂ� <literal>java.sql.Connection</literal>
��`�F�b�N�����������B
-
�������g�p����f�[�^�x�[�X���A���ׂĂ̕������x����T�|�[�g���Ă���Ƃ͌���܂���B
+ JDBCトランザクション分離レベルを設定します。
+ 妥当な値を調べるためには <literal>java.sql.Connection</literal>
をチェックしてください。
+ しかし使用するデータベースが、すべての分離レベルをサポートしているとは限りません。
<para>
- <emphasis role="strong">��F</emphasis>
+ <emphasis role="strong">例:</emphasis>
<literal>1, 2, 4, 8</literal>
</para>
</entry>
@@ -665,9 +667,9 @@
<literal>hibernate.connection.autocommit</literal>
</entry>
<entry>
-
�v�[������Ă���JDBC�R�l�N�V�����̎����R�~�b�g��L���ɂ���i���j�B
+ プールされているJDBCコネクションの自動コミットを有効にする(非推奨)。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -677,28 +679,28 @@
<literal>hibernate.connection.release_mode</literal>
</entry>
<entry>
-
Hibernate��JDBC�R�l�N�V���������[�X���邩��w�肵�܂��B�f�t�H���g�ł�
-
�Z�b�V�����������I�ɃN���[�Y�܂��͐ؒf����Ă�R�l�N�V�����͕ێ����܂��B
- �A�v���P�[�V�����T�[�o��JTA�f�[�^�\�[�X�̏ꍇ�A
- ���ׂĂ�JDBC�R�[���̌�A�����I�ɃR�l�N�V���������[�X���邽�߂�
<literal>after_statement</literal> ��
- �g�����������B
- ��JTA�R�l�N�V�����̏ꍇ�A�e�g�����U�N�V�������I�������Ƃ���
<literal>after_transaction</literal>
- ��g���A�R�l�N�V���������[�X�����������B
- <literal>auto</literal> �ɂ���ƁA
- JTA��CMT�g�����U�N�V�����̏ꍇ�A
<literal>after_statement</literal> �ŃN���[�Y���A
- JDBC�g�����U�N�V�����̏ꍇ�A
<literal>after_transaction</literal> �ŃN���[�Y���܂��B
+ 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">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>auto</literal> (default) |
<literal>on_close</literal> |
<literal>after_transaction</literal> |
<literal>after_statement</literal>
</para>
<para>
- ���ӂ��Ă��������B���̐ݒ��
<literal>SessionFactory.openSession</literal> ����
- �擾���� <literal>Session</literal>
�����Ɍ��ʂ�����܂��B
-
<literal>SessionFactory.getCurrentSession</literal> ��ʂ��Ď擾����
- <literal>Session</literal>
�ł́A<literal>CurrentSessionContext</literal>
- �̎����ɂ���āA�R�l�N�V�����̃����[�X���[�h��ݒ肵�܂��B
- <xref
linkend="architecture-current-session"/> ��Q�Ƃ��Ă��������B
+ 注意してください。この設定は
<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>
@@ -707,8 +709,8 @@
<literal>hibernate.connection.<emphasis><propertyName></emphasis></literal>
</entry>
<entry>
- JDBC�� <literal>propertyName</literal> �v���p�e�B��A
- <literal>DriverManager.getConnection()</literal>
�ɓn���܂��B
+ JDBCの <literal>propertyName</literal> プロパティを、
+ <literal>DriverManager.getConnection()</literal>
に渡します。
</entry>
</row>
<row>
@@ -716,8 +718,8 @@
<literal>hibernate.jndi.<emphasis><propertyName></emphasis></literal>
</entry>
<entry>
- <literal>propertyName</literal> �v���p�e�B��A
- JNDI <literal>InitialContextFactory</literal>
�ɓn���܂��B
+ <literal>propertyName</literal> プロパティを、
+ JNDI <literal>InitialContextFactory</literal>
に渡します。
</entry>
</row>
</tbody>
@@ -725,14 +727,14 @@
</table>
<table frame="topbot" id="configuration-cache-properties"
revision="7">
- <title>Hibernate �L���b�V���v���p�e�B</title>
+ <title>Hibernate キャッシュプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
- <entry>�v���p�e�B��</entry>
- <entry>�Ӗ�</entry>
+ <entry>プロパティ名</entry>
+ <entry>意味</entry>
</row>
</thead>
<tbody>
@@ -741,9 +743,9 @@
<literal>hibernate.cache.provider_class</literal>
</entry>
<entry>
- �J�X�^�� <literal>CacheProvider</literal>
�̃N���X���ł��B
+ カスタム <literal>CacheProvider</literal> のクラス名です。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>classname.of.CacheProvider</literal>
</para>
</entry>
@@ -753,12 +755,12 @@
<literal>hibernate.cache.use_minimal_puts</literal>
</entry>
<entry>
- �������݂�ŏ����ɂ��邽�߂ɁA�L���b�V���̑����œK�����܂��B
- ���̑���ɁA�ǂݍ��݂����p�ɂɔ�������悤�ɂȂ�܂��B
- ���̃Z�b�e�B���O�̓N���X�^�L���b�V���Ŗ�ɗ����܂��B
-
Hibernate3�ł̓N���X�^�L���b�V�������p�Ƀf�t�H���g�ł͗L���ɂȂ��Ă��܂��B
+ 書き込みを最小限にするために、二次キャッシュの操作を最適化します。
+ その代わりに、読み込みがより頻繁に発生するようになります。
+ このセッティングはクラスタキャッシュで役に立ちます。
+ Hibernate3ではクラスタキャッシュ実装用にデフォルトでは有効になっています。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
@@ -768,9 +770,9 @@
<literal>hibernate.cache.use_query_cache</literal>
</entry>
<entry>
- ����̃N�G�����L���b�V���\�ȏꍇ�ɁA�N�G���L���b�V����L���ɂ��܂��B
+ 特定のクエリがキャッシュ可能な場合に、クエリキャッシュを有効にします。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
@@ -780,11 +782,11 @@
<literal>hibernate.cache.use_second_level_cache</literal>
</entry>
<entry>
- �L���b�V�����S�ɖ����ɂ���ꍇ�Ɏg���܂��B
- �f�t�H���g�ł͗L���ŁA�N���X��
<literal><cache></literal> �}�b�s���O
- �Ő��䂵�܂��B
+ 二次キャッシュを完全に無効にする場合に使います。
+ デフォルトでは有効で、クラスの
<literal><cache></literal> マッピング
+ で制御します。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
@@ -794,10 +796,10 @@
<literal>hibernate.cache.query_cache_factory</literal>
</entry>
<entry>
- �J�X�^�� <literal>QueryCache</literal>
�C���^�[�t�F�C�X�̃N���X����
- �w�肵�܂��B�f�t�H���g�ł�
<literal>StandardQueryCache</literal> �ɂȂ�܂��B
+ カスタム <literal>QueryCache</literal>
インターフェイスのクラス名を
+ 指定します。デフォルトでは
<literal>StandardQueryCache</literal> になります。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>classname.of.QueryCache</literal>
</para>
</entry>
@@ -807,9 +809,9 @@
<literal>hibernate.cache.region_prefix</literal>
</entry>
<entry>
- �L���b�V���̗̈於�̐ړ����ł��B
+ 二次キャッシュの領域名の接頭辞です。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>prefix</literal>
</para>
</entry>
@@ -819,9 +821,9 @@
<literal>hibernate.cache.use_structured_entries</literal>
</entry>
<entry>
- �L���b�V���Ɋi�[����f�[�^��A�l�������₷���t�H�[�}�b�g�ɂ��܂��B
+ 二次キャッシュに格納するデータを、人が理解しやすいフォーマットにします。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true|false</literal>
</para>
</entry>
@@ -831,14 +833,14 @@
</table>
<table frame="topbot"
id="configuration-transaction-properties" revision="9">
- <title>Hibernate �g�����U�N�V�����v���p�e�B</title>
+ <title>Hibernate トランザクションプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
- <entry>�v���p�e�B��</entry>
- <entry>�Ӗ�</entry>
+ <entry>プロパティ名</entry>
+ <entry>意味</entry>
</row>
</thead>
<tbody>
@@ -847,11 +849,11 @@
<literal>hibernate.transaction.factory_class</literal>
</entry>
<entry>
- Hibernate <literal>Transaction</literal>
API�ƈꏏ�Ɏg����
- <literal>TransactionFactory</literal>
�̃N���X���ł��B
- �i�f�t�H���g�ł�
<literal>JDBCTransactionFactory</literal> �ł��j�B
+ Hibernate <literal>Transaction</literal>
APIと一緒に使われる
+ <literal>TransactionFactory</literal> のクラス名です。
+ (デフォルトでは
<literal>JDBCTransactionFactory</literal> です)。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>classname.of.TransactionFactory</literal>
</para>
</entry>
@@ -861,10 +863,10 @@
<literal>jta.UserTransaction</literal>
</entry>
<entry>
- �A�v���P�[�V�����T�[�o����JTA
<literal>UserTransaction</literal> ��擾���邽�߂�
- <literal>JTATransactionFactory</literal>
�Ɏg����JNDI���ł��B
+ アプリケーションサーバからJTA
<literal>UserTransaction</literal> を取得するために
+ <literal>JTATransactionFactory</literal>
に使われるJNDI名です。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>jndi/composite/name</literal>
</para>
</entry>
@@ -874,10 +876,10 @@
<literal>hibernate.transaction.manager_lookup_class</literal>
</entry>
<entry>
- <literal>TransactionManagerLookup</literal>
�̃N���X���ł��B
- JTA���ɂ����āAJVM���x���̃L���b�V����L���ɂ��邽�߂ɕK�v�ł��B
+ <literal>TransactionManagerLookup</literal>
のクラス名です。
+ JTA環境において、JVMレベルのキャッシュを有効にするために必要です。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>classname.of.TransactionManagerLookup</literal>
</para>
</entry>
@@ -887,11 +889,11 @@
<literal>hibernate.transaction.flush_before_completion</literal>
</entry>
<entry>
- �L���̏ꍇ�A�g�����U�N�V������completion�t�F�[�Y�̑O�Ɏ����I��
-
�Z�b�V������t���b�V�����܂��B����̎����Z�b�V�����R���e�L�X�g�Ǘ��ɓK���Ă��܂��B
- <xref
linkend="architecture-current-session"/>��Q�Ƃ��Ă��������B
+ 有効の場合、トランザクションのcompletionフェーズの前に自動的に
+ セッションをフラッシュします。内臓の自動セッションコンテキスト管理に適しています。
+ <xref
linkend="architecture-current-session"/>を参照してください。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -901,11 +903,11 @@
<literal>hibernate.transaction.auto_close_session</literal>
</entry>
<entry>
- �L���̏ꍇ�A�g�����U�N�V������completion�t�F�[�Y�̌��
-
�Z�b�V���������I�ɃN���[�Y���܂��B����̎����Z�b�V�����R���e�L�X�g�Ǘ��ɓK���Ă��܂��B
- <xref
linkend="architecture-current-session"/>��Q�Ƃ��Ă��������B
+ 有効の場合、トランザクションのcompletionフェーズの後に
+ セッションを自動的にクローズします。内臓の自動セッションコンテキスト管理に適しています。
+ <xref
linkend="architecture-current-session"/>を参照してください。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -915,14 +917,14 @@
</table>
<table frame="topbot" id="configuration-misc-properties"
revision="10">
- <title>���̑��̃v���p�e�B</title>
+ <title>その他のプロパティ</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
<colspec colname="c2" colwidth="1*"/>
<thead>
<row>
- <entry>�v���p�e�B��</entry>
- <entry>�Ӗ�</entry>
+ <entry>プロパティ名</entry>
+ <entry>意味</entry>
</row>
</thead>
<tbody>
@@ -931,11 +933,11 @@
<literal>hibernate.current_session_context_class</literal>
</entry>
<entry>
- �u���݂́v<literal>Session</literal>
�̂��߂́i�J�X�^���j�헪����܂��B
- �r���g�C���X�g���e�W�[�Ɋւ��邻�̑��̏��ɂ��Ă�
- <xref
linkend="architecture-current-session"/>��Q�Ƃ��Ă��������B
+ 「現在の」<literal>Session</literal>
のための(カスタム)戦略を提供します。
+ ビルトインストラテジーに関するその他の情報については
+ <xref
linkend="architecture-current-session"/>を参照してください。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>jta</literal> |
<literal>thread</literal> |
<literal>managed</literal> |
<literal>custom.Class</literal>
</para>
@@ -946,9 +948,9 @@
<literal>hibernate.query.factory_class</literal>
</entry>
<entry>
- HQL�p�[�T�[�̎�����I���܂��B
+ HQLパーサーの実装を選択します。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>org.hibernate.hql.ast.ASTQueryTranslatorFactory</literal> or
<literal>org.hibernate.hql.classic.ClassicQueryTranslatorFactory</literal>
</para>
@@ -959,10 +961,10 @@
<literal>hibernate.query.substitutions</literal>
</entry>
<entry>
- HQL��SQL�̃g�[�N����}�b�s���O���܂��B
- �i�Ⴆ�A�g�[�N���͊���e�������ł��j�B
+ HQLとSQLのトークンをマッピングします。
+ (例えば、トークンは関数やリテラル名です)。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>hqlLiteral=SQL_LITERAL,
hqlFunction=SQLFUNC</literal>
</para>
</entry>
@@ -972,12 +974,12 @@
<literal>hibernate.hbm2ddl.auto</literal>
</entry>
<entry>
- <literal>SessionFactory</literal> �������Ƃ��ɁA
- �����I�ɃX�L�[�}DDL��DB�ɏo�͂��܂��B
- <literal>create-drop</literal> �̏ꍇ�A
<literal>SessionFactory</literal> ��
- �N���[�Y�����Ƃ��ɁA�f�[�^�x�[�X�X�L�[�}��h���b�v���܂��B
+ <literal>SessionFactory</literal> を生成したときに、
+ 自動的にスキーマDDLをDBに出力します。
+ <literal>create-drop</literal> の場合、
<literal>SessionFactory</literal> を
+ クローズしたときに、データベーススキーマをドロップします。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>validate</literal> |
<literal>update</literal> |
<literal>create</literal> |
<literal>create-drop</literal>
</para>
@@ -988,14 +990,14 @@
<literal>hibernate.cglib.use_reflection_optimizer</literal>
</entry>
<entry>
- ���s�����t���N�V�����̑����CGLIB�̎g�p��L���ɂ��܂�
- �i�V�X�e�����x���̃v���p�e�B�j
- ���t���N�V�����̓g���u���V���[�e�B���O�̂Ƃ��ɖ𗧂��Ƃ�����܂��B
- �I�v�e�B�}�C�U��I�t�ɂ��Ă���Ƃ��ł����A
- Hibernate�ɂ͕K��CGLIB���K�v�Ȃ��Ƃɒ��ӂ��Ă��������B
- ���̃v���p�e�B��
<literal>hibernate.cfg.xml</literal> �Őݒ�ł��܂���B
+ 実行時リフレクションの代わりのCGLIBの使用を有効にします
+ (システムレベルのプロパティ)
+ リフレクションはトラブルシューティングのときに役立つことがあります。
+ オプティマイザをオフにしているときでさえ、
+ Hibernateには必ずCGLIBが必要なことに注意してください。
+ このプロパティは <literal>hibernate.cfg.xml</literal>
で設定できません。
<para>
- <emphasis
role="strong">��F</emphasis>
+ <emphasis
role="strong">例:</emphasis>
<literal>true</literal> |
<literal>false</literal>
</para>
</entry>
@@ -1005,15 +1007,15 @@
</table>
<sect2 id="configuration-optional-dialects"
revision="1">
- <title>SQL �����iDialect�j</title>
+ <title>SQL 方言(Dialect)</title>
<para>
- <literal>hibernate.dialect</literal> �v���p�e�B�ɂ́A
- �g�p����f�[�^�x�[�X�̐�����
<literal>org.hibernate.dialect.Dialect</literal> �̃T�u�N���X��A
- �K���w�肷�ׂ��ł��B
- ������������w�肷��AHibernate�͏�q�����v���p�e�B�̂������ɂ��āA
- ���K�ȃf�t�H���g�l��g���܂��B
- ��������A��������ƂŐݒ肷���Ԃ��Ȃ��܂��B
+ <literal>hibernate.dialect</literal> プロパティには、
+ 使用するデータベースの正しい
<literal>org.hibernate.dialect.Dialect</literal> のサブクラスを、
+ 必ず指定すべきです。
+ しかし方言を指定すれば、Hibernateは上述したプロパティのいくつかについて、
+ より適切なデフォルト値を使います。
+ そうすれば、それらを手作業で設定する手間が省けます。
</para>
<table frame="topbot" id="sql-dialects"
revision="2">
@@ -1101,21 +1103,21 @@
</sect2>
<sect2 id="configuration-optional-outerjoin"
revision="4">
- <title>�O�������t�F�b�`</title>
+ <title>外部結合フェッチ</title>
<para>
- ���DB��ANSI���AOracle��Sybase�X�^�C���̊O��������T�|�[�g���Ă���ꍇ�A
- <emphasis>outer join fetching</emphasis> �́ADB��SQL���s��ߖ�
- �p�t�H�[�}���X��ǂ����܂��B�iDB��ł�葽���̏����R�X�g���������܂��j
- �O�������t�F�b�`�́A���Έ�A��Α��A���Α��A��Έ�̃I�u�W�F�N�g�֘A��
- �O���[�v�I�u�W�F�N�g��1��SQL�� <literal>SELECT</literal>
���܂��B
+ もし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> �v���p�e�B�̒l��
<literal>0</literal> �ɂ����
- Outer join fetching�� <emphasis>���ׂ�</emphasis>
�����ɂ��邱�ƂɂȂ�܂��B
- <literal>1</literal>
�₻��ȏ�̒l��ݒ肷��ƁA�O�������t�F�b�`���L���ɂȂ�A
- ��Έ�Ƒ��Έ�֘A�� <literal>fetch="join"</literal>
�Ƃ��ă}�b�s���O����܂��B
+ <literal>hibernate.max_fetch_depth</literal> プロパティの値を
<literal>0</literal> にすると
+ Outer join fetchingを <emphasis>すべて</emphasis> 無効にすることになります。
+ <literal>1</literal> やそれ以上の値を設定すると、外部結合フェッチが有効になり、
+ 一対一と多対一関連が <literal>fetch="join"</literal>
としてマッピングされます。
</para>
<para>
@@ -1125,146 +1127,146 @@
</sect2>
<sect2 id="configuration-optional-binarystreams"
revision="1">
- <title>�o�C�i���X�g���[��</title>
+ <title>バイナリストリーム</title>
<para>
- Oracle��JDBC�h���C�o�Ƃ̊Ԃł��Ƃ肳��� <literal>byte</literal>
�z��̃T�C�Y�𐧌����܂��B
- <literal>binary</literal> ��
<literal>serializable</literal> �^�̑傫�ȃC���X�^���X��g��������A
- <literal>hibernate.jdbc.use_streams_for_binary</literal>
��L���ɂ��Ă��������B
- ������ <emphasis>����̓V�X�e�����x���̐ݒ肾���ł�</emphasis> �B
+ 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���L���b�V���ƃN�G���[�L���b�V��</title>
+ <title>2次キャッシュとクエリーキャッシュ</title>
<para>
- <literal>hibernate.cache</literal> �v���p�e�B�ړ�����
- Hibernate�Ńv���Z�X��N���X�^�L���b�V����g���Ƃ��Ƃ����܂��B
- <xref linkend="performance-cache"/>�ɂ�葽���̏ڍׂ�����܂��B
+ <literal>hibernate.cache</literal> プロパティ接頭辞は
+ Hibernateでプロセスやクラスタ二次キャッシュを使うとことを許可します。
+ <xref linkend="performance-cache"/>により多くの詳細があります。
</para>
</sect2>
<sect2 id="configuration-optional-querysubstitution">
- <title>�N�G���[����̒u������</title>
+ <title>クエリー言語の置き換え</title>
<para>
- <literal>hibernate.query.substitutions</literal> ��g�����ƂŁA
- �V����Hibernate�N�G���g�[�N�����`�ł��܂��B
- ��F
+ <literal>hibernate.query.substitutions</literal> を使うことで、
+ 新しいHibernateクエリトークンを定義できます。
+ 例:
</para>
<programlisting>hibernate.query.substitutions true=1,
false=0</programlisting>
<para>
- ����̓g�[�N�� <literal>true</literal> ��
<literal>false</literal> ��A
- ���������SQL�ɂ����Đ������e�����ɖ|�܂��B
+ これはトークン <literal>true</literal> と
<literal>false</literal> を、
+ 生成されるSQLにおいて整数リテラルに翻訳します。
</para>
<programlisting>hibernate.query.substitutions
toLowercase=LOWER</programlisting>
<para>
- �����SQL�� <literal>LOWER</literal>
���̖��O�̕t���ւ���\�ɂ��܂��B
+ これはSQLの <literal>LOWER</literal> 関数の名前の付け替えを可能にします。
</para>
</sect2>
<sect2 id="configuration-optional-statistics"
revision="2">
- <title>Hibernate ���v</title>
+ <title>Hibernate 統計</title>
<para>
- <literal>hibernate.generate_statistics</literal>
��L���ɂ����ꍇ�A
-
���삵�Ă���V�X�e����`���[�j���O����Ƃ��ɁA<literal>SessionFactory.getStatistics()</literal>
- ��o�R���āAHibernate�͕֗��ȓ��v����o�͂��܂��B
- JMX��o�R���ē��v����o�͂��邱�Ƃ�\�ł��B
- Javadoc�� <literal>org.hibernate.stats</literal>
�p�b�P�[�W���
- �C���^�[�t�F�C�X�ɂ͂�葽���̏����܂��B
+ <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>���M���O</title>
+ <title>ロギング</title>
<para>
- Hibernate��Apache commons-loggin��g���āA���܂��܂ȃC�x���g���O�Ƃ���
- �o�͂��܂��B
+ HibernateはApache commons-logginを使って、さまざまなイベントをログとして
+ 出力します。
</para>
<para>
- commons-logging�T�[�r�X�́i�N���X�p�X��
<literal>log4j.jar</literal> ��܂߂�jApache Log4j�ɁA
- �܂��iJDK1.4������ȏ�Ŏ��s������jJDK1.4 logging�ɒ��ڏo�͂��܂��B
- Log4j�� <literal>http://jakarta.apache.org</literal>
����_�E�����[�h�ł��܂��B
- Log4j��g�����߂ɂ́A�N���X�p�X��
<literal>log4j.properties</literal> �t�@�C����z�u����K�v������܂��B
- ��̃v���p�e�B�t�@�C����Hibernate�ƈꏏ�ɔz�z����A�����
<literal>src/</literal> �f�B���N�g���ɂ���܂��B
+ 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�̃��O���b�Z�[�W�Ɋ���邱�Ƃ����������߂��܂��B
- Hibernate�̃��O�͓ǂ݂₷���A�ł������ڍׂɂȂ�悤�ɓw�͂���Ă��܂��B
- ����͕K�{�̃g���u���V���[�e�B���O�f�o�C�X�ł��B
- �ȉ��ɏd�v�ȃ��O�̃J�e�S�������܂��B
+ Hibernateのログメッセージに慣れることを強くおすすめします。
+ Hibernateのログは読みやすく、できる限り詳細になるように努力されています。
+ これは必須のトラブルシューティングデバイスです。
+ 以下に重要なログのカテゴリを示します。
</para>
<table frame="topbot" id="log-categories"
revision="2">
- <title>Hibernate ���O�J�e�S��</title>
+ <title>Hibernate ログカテゴリ</title>
<tgroup cols="2">
<colspec colwidth="1*"/>
<colspec colwidth="2.5*"/>
<thead>
<row>
- <entry>�J�e�S��</entry>
- <entry>�@�\</entry>
+ <entry>カテゴリ</entry>
+ <entry>機能</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>org.hibernate.SQL</literal></entry>
-
<entry>���s�������ׂĂ�SQL�iDDL�j�X�e�[�g�����g���M���O���܂��B</entry>
+ <entry>実行したすべてのSQL(DDL)ステートメントをロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.type</literal></entry>
-
<entry>���ׂĂ�JDBC�p�����[�^���M���O���܂��B</entry>
+ <entry>すべてのJDBCパラメータをロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.tool.hbm2ddl</literal></entry>
-
<entry>���s�������ׂĂ�SQL�iDDL�j�X�e�[�g�����g���M���O���܂��B</entry>
+ <entry>実行したすべてのSQL(DDL)ステートメントをロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.pretty</literal></entry>
<entry>
-
session�Ɋ֘A���邷�ׂẴG���e�B�e�B�i�ő�Q�O�j�̃t���b�V�����Ԃ��M���O���܂��B
+ sessionに関連するすべてのエンティティ(最大20)のフラッシュ時間をロギングします。
</entry>
</row>
<row>
<entry><literal>org.hibernate.cache</literal></entry>
-
<entry>���ׂĂ̂Q���L���b�V���̓�����M���O���܂��B</entry>
+ <entry>すべての2次キャッシュの動作をロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.transaction</literal></entry>
-
<entry>�g�����U�N�V�����Ɋ֘A���铮����M���O���܂��B</entry>
+ <entry>トランザクションに関連する動作をロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.jdbc</literal></entry>
- <entry>JDBC���\�[�X�擾���M���O���܂��B</entry>
+ <entry>JDBCリソース取得をロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate.hql.ast.AST</literal></entry>
<entry>
- HQL��SQL��AST�̃N�G���[�p�[�X���M���O���܂��B
+ HQLとSQLのASTのクエリーパースをロギングします。
</entry>
</row>
<row>
<entry><literal>org.hibernate.secure</literal></entry>
- <entry>���ׂĂ�JAAS���͂��M���O���܂��B</entry>
+ <entry>すべてのJAAS分析をロギングします。</entry>
</row>
<row>
<entry><literal>org.hibernate</literal></entry>
<entry>
-
���ׂĂ��M���O���܂��B�i���ʂɂȂ�܂����A�g���u���V���[�e�B���O�ɂ͕֗��ł��j
+ すべてをロギングします。(情報が大量になりますが、トラブルシューティングには便利です)
</entry>
</row>
</tbody>
@@ -1272,34 +1274,34 @@
</table>
<para>
-
Hibernate�ŃA�v���P�[�V������쐬����Ƃ��́A<literal>org.hibernate.SQL</literal>
- �J�e�S���� <literal>debug</literal>
���ɗL���ɂ��Ă������ق����ǂ��ł��傤�B
- ��֕��@�Ƃ��āA<literal>hibernate.show_sql</literal>
��L���ɂ�����@������܂��B
+ 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>
+ <title><literal>NamingStrategy</literal> の実装</title>
<para>
- �C���^�[�t�F�C�X
<literal>net.sf.hibernate.cfg.NamingStrategy</literal> ��g����
- �f�[�^�x�[�X�I�u�W�F�N�g�ƃX�L�[�}�v�f�̂��߂́u�����W���v��w��ł��܂��B
+ インターフェイス <literal>net.sf.hibernate.cfg.NamingStrategy</literal>
を使うと
+ データベースオブジェクトとスキーマ要素のための「命名標準」を指定できます。
</para>
<para>
- Java�̎��ʎq����f�[�^�x�[�X�̎��ʎq�����������邽�߂̃��[����A
- �}�b�s���O�t�@�C���ŗ^�����u�_���I�ȁv�J�����ƃe�[�u��������
- �u�����I�ȁv�e�[�u���ƃJ�����������邽�߂̃��[����p�ӂ��邱�Ƃ��ł��܂��B
- ���̋@�\�͌J��Ԃ��̎G���i�Ⴆ�� <literal>TBL_</literal>
�v���t�B�b�N�X�j���菜���A
- �}�b�s���O�h�L�������g�̏璷�����炷���Ƃɖ𗧂��܂��B
- Hibernate���g���f�t�H���g�̐헪�͂��Ȃ�ŏ����ɋ߂���̂ł��B
+ Javaの識別子からデータベースの識別子を自動生成するためのルールや、
+ マッピングファイルで与えた「論理的な」カラムとテーブル名から
+ 「物理的な」テーブルとカラム名を生成するためのルールを用意することができます。
+ この機能は繰り返しの雑音(例えば <literal>TBL_</literal> プリフィックス)を取り除き、
+ マッピングドキュメントの冗長さを減らすことに役立ちます。
+ Hibernateが使うデフォルトの戦略はかなり最小限に近いものです。
</para>
<para>
- �}�b�s���O��lj�����O��
<literal>Configuration.setNamingStrategy()</literal> ��ĂԂ��Ƃ�
- �ȉ��̂悤�ɈقȂ�헪��w�肷�邱�Ƃ��ł��܂��F
+ マッピングを追加する前に <literal>Configuration.setNamingStrategy()</literal>
を呼ぶことで
+ 以下のように異なる戦略を指定することができます:
</para>
<programlisting><![CDATA[SessionFactory sf = new Configuration()
@@ -1309,25 +1311,25 @@
.buildSessionFactory();]]></programlisting>
<para>
- <literal>org.hibernate.cfg.ImprovedNamingStrategy</literal>
�͑g�ݍ��݂̐헪�ł��B
- ����͂������̃A�v���P�[�V�����ɂƂ��ėL�p�ȊJ�n�_�ƂȂ邩�����܂���B
+ <literal>org.hibernate.cfg.ImprovedNamingStrategy</literal>
は組み込みの戦略です。
+ これはいくつかのアプリケーションにとって有用な開始点となるかもしれません。
</para>
</sect1>
<sect1 id="configuration-xmlconfig" revision="2">
- <title>XML�ݒ�t�@�C��</title>
+ <title>XML設定ファイル</title>
<para>
- ���1�̕��@�� <literal>hibernate.cfg.xml</literal>
�Ƃ������O�̃t�@�C����
- �\���Ȑݒ��w�肷����@�ł��B
- ���̃t�@�C���� <literal>hibernate.properties</literal>
�t�@�C���̑���ƂȂ�܂��B
- ��������̃t�@�C��������A�v���p�e�B���u���������܂��B
+ もう1つの方法は <literal>hibernate.cfg.xml</literal> という名前のファイルで
+ 十分な設定を指定する方法です。
+ このファイルは <literal>hibernate.properties</literal> ファイルの代わりとなります。
+ もし両方のファイルがあれば、プロパティが置き換えられます。
</para>
<para>
- XML�ݒ�t�@�C���͏����ݒ�� <literal>CLASSPATH</literal>
�ɔz�u���Ă��������B
- ���ꂪ��ł��F
+ XML設定ファイルは初期設定で <literal>CLASSPATH</literal> に配置してください。
+ これが例です:
</para>
<programlisting><![CDATA[<?xml version='1.0'
encoding='utf-8'?>
@@ -1338,7 +1340,7 @@
<hibernate-configuration>
<!-- a SessionFactory instance listed as /jndi/name -->
- <!-- /jndi/name�̂悤�Ƀ��X�g�A�b�v���ꂽSessionFactory�C���X�^���X -->
+ <!-- /jndi/nameのようにリストアップされたSessionFactoryインスタンス -->
<session-factory
name="java:hibernate/SessionFactory">
@@ -1365,22 +1367,22 @@
</hibernate-configuration>]]></programlisting>
<para>
- ���Ă̂Ƃ���A���̕��@�̗D�ʐ��͐ݒ�̂��߂̃}�b�s���O�t�@�C������O�o���ɂł��邱�Ƃł��B
- Hibernate�L���b�V����`���[�j���O���Ȃ���Ȃ�Ȃ��̂ł���A
- <literal>hibernate.cfg.xml</literal> �͂��֗��ł��B
- <literal>hibernate.properties</literal> ��
<literal>hibernate.cfg.xml</literal> ��
- �ǂ��炩��g���邱�Ƃ�o���Ă����Ă��������B
- ��͓�����̂ŁA�Ⴄ�Ƃ���Ƃ�����XML�\����g�����Ƃ̗��_�����ł��B
+ 見てのとおり、この方法の優位性は設定のためのマッピングファイル名を外出しにできることです。
+ Hibernateキャッシュをチューニングしなければならないのであれば、
+ <literal>hibernate.cfg.xml</literal> はより便利です。
+ <literal>hibernate.properties</literal> と
<literal>hibernate.cfg.xml</literal> の
+ どちらかを使えることを覚えておいてください。
+ 二つは同じもので、違うところといえばXML構文を使うことの利点だけです。
</para>
<para>
- XML�ݒ��g�����ƂŁAHibernate�͈ȉ��̂悤�ɃV���v���ɂȂ�܂��B
+ XML設定を使うことで、Hibernateは以下のようにシンプルになります。
</para>
<programlisting><![CDATA[SessionFactory sf = new
Configuration().configure().buildSessionFactory();]]></programlisting>
<para>
- �ႤXML�ݒ�t�@�C����g�����Ƃ�ł��܂��B
+ 違うXML設定ファイルを使うこともできます。
</para>
<programlisting><![CDATA[SessionFactory sf = new Configuration()
@@ -1390,23 +1392,23 @@
</sect1>
<sect1 id="configuration-j2ee" revision="1">
- <title>J2EE�A�v���P�[�V�����T�[�o�Ƃ̓���</title>
+ <title>J2EEアプリケーションサーバとの統合</title>
<para>
- Hibernate��J2EE�\���Ɠ�������|�C���g��T�|�[�g���Ă��܂��B
+ HibernateはJ2EE構造と統合するポイントをサポートしています。
</para>
<itemizedlist>
<listitem>
<para>
- <emphasis>�R���e�i�Ǘ��f�[�^�\�[�X</emphasis>�FHibernate��
- JNDI�����A�R���e�i���Ǘ�����JDBC�R�l�N�V������g�p�ł��܂��B
- �ʏ�AJTA������ <literal>TransactionManager</literal> ��
- <literal>ResourceManager</literal>
���g�����U�N�V�����Ǘ�(CMT)�A
- ���ɗl�X�ȃf�[�^�\�[�X�ɂ܂����镪�U�g�����U�N�V���������܂��B
- ���R�v���O�����Ńg�����U�N�V�������E��w��ł��܂�(BMT)�B
- ���邢�́A�L�q�����R�[�h�̃|�[�^�r���e�B��ۂ��߂ɁA
- �I�v�V������Hibernate�� <literal>Transaction</literal>
API��g�������Ȃ邩�����܂���B
+ <emphasis>コンテナ管理データソース</emphasis>:Hibernateは
+ JNDIが提供し、コンテナが管理するJDBCコネクションを使用できます。
+ 通常、JTA準拠の <literal>TransactionManager</literal> と
+ <literal>ResourceManager</literal> がトランザクション管理(CMT)、
+ 特に様々なデータソースにまたがる分散トランザクションを扱います。
+ 当然プログラムでトランザクション境界を指定できます(BMT)。
+ あるいは、記述したコードのポータビリティを保つために、
+ オプションのHibernateの <literal>Transaction</literal>
APIを使いたくなるかもしれません。
</para>
</listitem>
</itemizedlist>
@@ -1414,8 +1416,8 @@
<itemizedlist>
<listitem>
<para>
-
<emphasis>����JNDI�o�C���f�B���O</emphasis>�FHibernate��JNDI�������オ�������
- <literal>SessionFactory</literal> �����܂��B
+ <emphasis>自動JNDIバインディング</emphasis>:HibernateはJNDIが立ち上がった後に
+ <literal>SessionFactory</literal> を生成します。
</para>
</listitem>
</itemizedlist>
@@ -1423,12 +1425,12 @@
<itemizedlist>
<listitem>
<para>
- <emphasis>JTA�Z�b�V�����o�C���f�B���O</emphasis> �F
- Hibernate <literal>Session</literal>
�̃g�����U�N�V�������E��JTA�g�����U�N�V�����Ɠ����ɂȂ�܂��B
- �P���� <literal>SessionFactory</literal>
��JNDI����lookup���āA
- ���݂� <literal>Session</literal> ��擾���܂��B
- JTA�g�����U�N�V���������������Ƃ��ɁAHibernate��
<literal>Session</literal> ��t���b�V�����A�N���[�Y���܂��B
- EJB�f�v���C�����g�f�B�X�N���v�^�̒��ɁA�g�����U�N�V�������E��錾���܂��B
+ <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>
@@ -1436,85 +1438,85 @@
<itemizedlist>
<listitem>
<para>
- <emphasis>JMX�f�v���C:</emphasis>
���JMX���g�p�\�ȃA�v���P�[�V�����T�[�o�i�Ⴆ��JBOSS�j
- ������ꍇ�AHibernate��MBean�Ƃ��ăf�v���C���邱�Ƃ�I�ׂ܂��B
- ����� <literal>Configuration</literal> ����
<literal>SessionFactory</literal> ��
- ��������R�[�h�������Ƃ��ł��܂��B
- �R���e�i�� <literal>HibernateService</literal> ��N�����A
- �T�[�r�X�̈ˑ��𗝑z�I�ɊǗ����܂��i�f�[�^�\�[�X��Hibernate�₻�̑����N������O��
- �g�p�ł���悤�ɂ��Ȃ���Ȃ�܂���j�B
+ <emphasis>JMXデプロイ:</emphasis>
もしJMXが使用可能なアプリケーションサーバ(例えばJBOSS)
+ がある場合、HibernateをMBeanとしてデプロイすることを選べます。
+ これは <literal>Configuration</literal> から
<literal>SessionFactory</literal> を
+ 生成するコードを無くすことができます。
+ コンテナは <literal>HibernateService</literal> を起動し、
+ サービスの依存を理想的に管理します(データソースはHibernateやその他が起動する前に
+ 使用できるようにしなければなりません)。
</para>
</listitem>
</itemizedlist>
<para>
- ���Ɉˑ����܂����A����A�A�v���P�[�V�����T�[�o��"connection
containment"�̗�O��X���[����Ȃ�
- �ݒ�̃I�v�V����
<literal>hibernate.connection.aggressive_release</literal>
- ��true�ɂ��Ă��������B
+ 環境に依存しますが、もし、アプリケーションサーバが"connection containment"の例外をスローするなら
+ 設定のオプション
<literal>hibernate.connection.aggressive_release</literal>
+ をtrueにしてください。
</para>
<sect2 id="configuration-optional-transactionstrategy"
revision="3">
- <title>�g�����U�N�V�����헪�ݒ�</title>
+ <title>トランザクション戦略設定</title>
<para>
- Hibernate <literal>Session</literal>
API�́A�A�[�L�e�N�`����̃V�X�e���̊NJ��ł���
- ������g�����U�N�V�����Ɉˑ����܂���B
- ����R�l�N�V�����v�[����JDBC�ڎg�������ꍇ�AJDBC API����
- �g�����U�N�V������ĂԂ��Ƃ��ł��܂��B
-
����AJ2EE�A�v���P�[�V�����T�[�o�œ��삳����Ȃ�ABean�Ǘ��g�����U�N�V������g���A
- �K�v�ɉ����� <literal>UserTransaction</literal> ��JTA
API����ĂԂ��ƂɂȂ�ł��傤�B
+ Hibernate <literal>Session</literal>
APIは、アーキテクチャ内のシステムの管轄である
+ あらゆるトランザクションに依存しません。
+ もしコネクションプールのJDBCを直接使いたい場合、JDBC APIから
+ トランザクションを呼ぶことができます。
+ もし、J2EEアプリケーションサーバで動作させるなら、Bean管理トランザクションを使い、
+ 必要に応じて <literal>UserTransaction</literal> をJTA
APIから呼ぶことになるでしょう。
</para>
<para>
-
2�i����ȏ�j�̊��Ō݊����̂���R�[�h��ێ����邽�߂ɁA�I�v�V�����Ƃ��č��{�I�ȃV�X�e����
- ���b�s���O����Hibernate <literal>Transaction</literal>
API�𐄏����܂��B
- Hibernate�ݒ�v���p�e�B��
<literal>hibernate.transaction.factory_class</literal> ��ݒ肷�邱�Ƃ�
- �������� <literal>Transaction</literal>
�N���X�̃C���X�^���X�����Ƃ��ł��܂��B
+ 2つ(それ以上)の環境で互換性のあるコードを維持するために、オプションとして根本的なシステムを
+ ラッピングするHibernate <literal>Transaction</literal> APIを推奨します。
+ Hibernate設定プロパティの
<literal>hibernate.transaction.factory_class</literal> を設定することで
+ ある特定の <literal>Transaction</literal> クラスのインスタンスを持つことができます。
</para>
<para>
- 3�̊�{�I�ȁi���ɂ���j�I������܂��F
+ 3つの基本的な(既にある)選択を挙げます:
</para>
<variablelist spacing="compact">
<varlistentry>
<term><literal>org.hibernate.transaction.JDBCTransactionFactory</literal></term>
<listitem>
-
<para>�f�[�^�x�[�X(JDBC)�g�����U�N�V�����ɈϏ����܂��i�f�t�H���g�j</para>
+ <para>データベース(JDBC)トランザクションに委譲します(デフォルト)</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>org.hibernate.transaction.JTATransactionFactory</literal></term>
<listitem>
<para>
-
����A���̃R���e�L�X�g�i�Ⴆ�AEJB�Z�b�V����Bean���\�b�h�j�Ői�s���̃g�����U�N�V���������݂���A�������
-
�V�����g�����U�N�V�������J�n����Ă���ABean�Ǘ��g�����U�N�V�������g���Ă���ꍇ�A
- �R���e�i�Ǘ��g�����U�N�V�����ɈϏ����܂��B
+ もし、このコンテキスト(例えば、EJBセッションBeanメソッド)で進行中のトランザクションが存在する、もしくは
+ 新しいトランザクションが開始されており、Bean管理トランザクションが使われている場合、
+ コンテナ管理トランザクションに委譲します。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>org.hibernate.transaction.CMTTransactionFactory</literal></term>
<listitem>
- <para>�R���e�i�Ǘ�JTA�g�����U�N�V�����ɈϏ����܂�</para>
+ <para>コンテナ管理JTAトランザクションに委譲します</para>
</listitem>
</varlistentry>
</variablelist>
<para>
-
�������g�̃g�����U�N�V�����헪�i�Ⴆ�ACORBA�g�����U�N�V�����T�[�r�X�j���`���邱�Ƃ�ł��܂��B
+ 自分自身のトランザクション戦略(例えば、CORBAトランザクションサービス)を定義することもできます。
</para>
<para>
- Hibernate�̂������̋@�\�i�Ⴆ�A�L���b�V���AJTA�ɂ��R���e�L�X�g�Z�b�V����
���j��
- �Ǘ����ꂽ���̒���JTA <literal>TransactionManager</literal>
�ւ̃A�N�Z�X��v�����܂��B
- J2EE���ЂƂ̃��J�j�Y���ɋK�i������Ă��Ȃ��̂ŁA
- �A�v���P�[�V�����T�[�o�ɂ����āAHibernate��
<literal>TransactionManager</literal> �̃��t�@�����X
- ��擾������@�m�ɂ���K�v������܂��B
+ Hibernateのいくつかの機能(例えば、二次キャッシュ、JTAによるコンテキストセッション 等)は
+ 管理された環境の中のJTA <literal>TransactionManager</literal>
へのアクセスを要求します。
+ J2EEがひとつのメカニズムに規格化されていないので、
+ アプリケーションサーバにおいて、Hibernateが
<literal>TransactionManager</literal> のリファレンス
+ を取得する方法を明確にする必要があります。
</para>
<table frame="topbot" id="jtamanagerlookup"
revision="1">
- <title>JTA �g�����U�N�V�����}�l�[�W��</title>
+ <title>JTA トランザクションマネージャ</title>
<tgroup cols="2">
<colspec colwidth="2.5*"/>
<colspec colwidth="1*"/>
@@ -1572,95 +1574,95 @@
</sect2>
<sect2 id="configuration-optional-jndi" revision="3">
- <title><literal>SessionFactory</literal>
��JNDI�ւ̓o�^</title>
+ <title><literal>SessionFactory</literal>
のJNDIへの登録</title>
<para>
- JNDI�ɓo�^����Hibernate <literal>SessionFactory</literal>
�͒P����
- �t�@�N�g�����b�N�A�b�v���A�V���� <literal>Session</literal>
����܂��B
- �����JNDI�ɓo�^���ꂽ <literal>Datasource</literal> �ɂ͊֘A�����A
- ���݂��ɃV���v���ɂ����̓o�^��g�����Ƃɒ��ӂ��Ă��������B
+ JNDIに登録したHibernate <literal>SessionFactory</literal> は単純に
+ ファクトリをルックアップし、新しい <literal>Session</literal> を作ります。
+ これはJNDIに登録された <literal>Datasource</literal> には関連せず、
+ お互いにシンプルにこれらの登録を使うことに注意してください。
</para>
<para>
- ��� <literal>SessionFactory</literal>
��JNDI�l�[���X�y�[�X�ɓo�^�������ꍇ�A
- ���ʂȖ��O�i�Ⴆ�A
<literal>java:hibernate/SessionFactory</literal> �j��
- <literal>hibernate.session_factory_name</literal>
�v���p�e�B�Ɏg���Ă�������
- ������̃v���p�e�B��ȗ������ꍇ�A
<literal>SessionFactory</literal> ��
-
JNDI�ɓo�^����܂���B�i�����Tomcat�̂悤�ȃf�t�H���g������JNDI���ǂ݂���p�̊��̏ꍇ���ɕ֗��ł��B�j
+ もし <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�ɓo�^����Ƃ��AHibernate��
- <literal>hibernate.jndi.url</literal>
�̒l��g�p���A<literal>hibernate.jndi.class</literal>
- ��C�j�V�����R���e�L�X�g�Ƃ��ċ�̉����܂��B
- �������ݒ肵�Ȃ��ꍇ�́A�f�t�H���g��
<literal>InitialContext</literal> ��g�p���܂��B
+ <literal>SessionFactory</literal> をJNDIに登録するとき、Hibernateは
+ <literal>hibernate.jndi.url</literal>
の値を使用し、<literal>hibernate.jndi.class</literal>
+ をイニシャルコンテキストとして具体化します。
+ もし何も設定しない場合は、デフォルトの <literal>InitialContext</literal>
を使用します。
</para>
<para>
- <literal>cfg.buildSessionFactory()</literal> ��R�[����
- Hibernate�͎����I�� <literal>SessionFactory</literal>
��JNDI�ɔz�u���܂��B
- <literal>HibernateService</literal>
�ƈꏏ��JMX�f�v���C�����g��g��Ȃ�����A
-
����͂��̌Ăяo����A�v���P�[�V������̉��炩�̃X�^�[�g�A�b�v�R�[�h�i������̓��[�e�B���e�B�N���X�j
- �ɔz�u���Ȃ���Ȃ�Ȃ����Ƃ�Ӗ����܂��B�i��ŋc�_���܂��j
+ <literal>cfg.buildSessionFactory()</literal> をコール後
+ Hibernateは自動的に <literal>SessionFactory</literal>
をJNDIに配置します。
+ <literal>HibernateService</literal> と一緒にJMXデプロイメントを使わない限り、
+ これはこの呼び出しをアプリケーション内の何らかのスタートアップコード(もしくはユーティリティクラス)
+ に配置しなければならないことを意味します。(後で議論します)
</para>
<para>
- ���JNDI <literal>SessionFactory</literal>
��g���ꍇ�AEJB�⑼�̃N���X��
- JNDI���b�N�A�b�v��g���� <literal>SessionFactory</literal>
��擾���܂��B
+ もしJNDI <literal>SessionFactory</literal> を使う場合、EJBや他のクラスは
+ JNDIルックアップを使って <literal>SessionFactory</literal> を取得します。
</para>
<para>
- �Ǘ����ꂽ���ł� <literal>SessionFactory</literal>
��JNDI�Ƀo�C���h���A
- �����łȂ���� <literal>static</literal>
�V���O���g����g�����Ƃ𐄏����܂��B
- �����������ڍׂ���A�v���P�[�V�����R�[�h��ی삷�邽�߂ɁA
- <literal>HibernateUtil.getSessionFactory()</literal>
�̂悤�ȃw���p�[�N���X�̒��ɁA
- <literal>SessionFactory</literal>
���b�N�A�b�v����R�[�h��B�����Ƃ𐄏����܂��B
- ���̂悤�ȃw���p�[�N���X��Hibernate��J�n����֗��Ȏ�i�ł����܂��B
- —�P�͂�Q�Ƃ��Ă��������B
+ 管理された環境では <literal>SessionFactory</literal> をJNDIにバインドし、
+ そうでなければ <literal>static</literal> シングルトンを使うことを推奨します。
+ こういった詳細からアプリケーションコードを保護するために、
+ <literal>HibernateUtil.getSessionFactory()</literal>
のようなヘルパークラスの中に、
+ <literal>SessionFactory</literal> をルックアップするコードを隠すことを推奨します。
+ このようなヘルパークラスはHibernateを開始する便利な手段でもあります。
+ —1章を参照してください。
</para>
</sect2>
<sect2 id="configuration-j2ee-currentsession"
revision="4">
- <title>JTA�ɂ�錻�݂̃Z�b�V�����R���e�L�X�g�}�l�[�W�����g</title>
+ <title>JTAによる現在のセッションコンテキストマネージメント</title>
<para>
- ����Ƃ�ȒP�� <literal>Session</literal>
�ƃg�����U�N�V�����������@�́A
- Hibernate�������I�Ɂu���݂́v <literal>Session</literal>
��Ǘ����邱�Ƃł��B
- <xref
linkend="architecture-current-session">�J�����g�Z�b�V����</xref>
�̐����Q�Ƃ��Ă��������B
- ��� <literal>�uJTA�v</literal>
�Z�b�V�����R���e�L�X�g��g������ŁA
- ���݂�JTA�g�����U�N�V������Hibernate
<literal>Session</literal> ���֘A���Ă��Ȃ��ꍇ�́A
- �ŏ��� <literal>sessionFactory.getCurrentSession()</literal>
��R�[�����A
- JTA�g�����U�N�V�����Ƃ̊֘A�t����s���Ă��������B
- <literal>�uJTA�v</literal> �R���e�L�X�g��
<literal>getCurrentSession()</literal> ��
- �ʂ��Ď擾���� <literal>Session</literal>
�́A�g�����U�N�V��������������O��
- �����I�Ƀt���b�V�����A����������ɂ͎����I�ɃN���[�Y���܂��B
- �܂��A�e�X�e�[�g�����g���JDBC�R�l�N�V������ϋɓI�Ƀ����[�X���܂��B
- ����ɂ��JTA�g�����U�N�V�����̃��C�t�T�C�N����
<literal>Session</literal> ��Ǘ����邱�Ƃ��ł��A
- ���[�U�[�̃R�[�h���炻�̂悤�ȊǗ�����R�[�h��r���ł��܂��B
- <literal>UserTransaction</literal>
��ʂ���JTA��v���O�����ŊǗ����邱�Ƃ��ł��܂��B
- �܂��́A�i�|�[�^�u���ȃR�[�h�ł���jHibernate
<literal>Transaction</literal> API��
- �g�����U�N�V�������E�Ƃ��Ďg�����Ƃ�ł��܂��B
- EJB�R���e�i��g���Ƃ��́ACMT�ɂ��錾�I�g�����U�N�V�������E���D�܂����ł��B
+ もっとも簡単に <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�f�v���C�����g</title>
+ <title>JMXデプロイメント</title>
<para>
- <literal>SessionFactory</literal> ��JNDI����擾���邽�߂ɂ�
- <literal>cfg.buildSessionFactory()</literal>
�s��ǂ����Ŏ��s���Ă��Ȃ���Ȃ�܂���B
- ���Ȃ��͂����A<literal>static</literal> �������u���b�N��i
<literal>HibernateUtil</literal> �̂悤�ȁj��
- <emphasis>managed service</emphasis>
�Ƃ���Hibernate��f�v���C���邩�A�ǂ��炩�Ŏ��s�ł��܂��B
+ <literal>SessionFactory</literal> をJNDIから取得するためには
+ <literal>cfg.buildSessionFactory()</literal>
行をどこかで実行していなければなりません。
+ あなたはこれを、<literal>static</literal> 初期化ブロック内(
<literal>HibernateUtil</literal> のような)か
+ <emphasis>managed service</emphasis>
としてHibernateをデプロイするか、どちらかで実行できます。
</para>
<para>
- JBOSS�̂悤��JMX�̋@�\�ŃA�v���P�[�V�����T�[�o�Ƀf�v���C���邽�߂�
- <literal>org.hibernate.jmx.HibernateService</literal>
��g���āA�z�u���܂��B
- ���ۂ̃f�v���C�����g�Ɛݒ�̓x���_�[���L�ł��B
- �����ŗ�Ƃ���JBOSS 4.0.x�p��
<literal>jboss-service.xml</literal> �����܂��B
+ JBOSSのようなJMXの機能でアプリケーションサーバにデプロイするために
+ <literal>org.hibernate.jmx.HibernateService</literal>
を使って、配置します。
+ 実際のデプロイメントと設定はベンダー特有です。
+ ここで例としてJBOSS 4.0.x用の <literal>jboss-service.xml</literal>
を示します。
</para>
<programlisting><![CDATA[<?xml version="1.0"?>
@@ -1707,14 +1709,14 @@
</server>]]></programlisting>
<para>
- ���̃t�@�C���� <literal>META-INF</literal>
�f�B���N�g���ɔz�u����A
- JAR�t�@�C����g������ <literal>.sar</literal> (service
archive)�Ńp�b�P�[�W������܂��B
-
���l��Hibernate�p�b�P�[�W��K�v�ł��B�܂��AHibernate�̓T�[�h�p�[�e�B�̃��C�u������v�����܂��B
-
�R���p�C�������i�����N���X�Ƃ��̃}�b�s���O�t�@�C������l�ɃA�[�J�C�u�i.sar�t�@�C���j�ɓ���܂��B
- �G���^�[�v���C�Ybean�i�ʏ�̓Z�b�V����bean�j�͎��g��JAR�t�@�C����ێ����܂����A
- 1��Łi�z�b�g�j�f�v���C�\�ȃ��j�b�g�̂��߂Ƀ��C���T�[�r�X�A�[�J�C�u�Ƃ��Ă���EJB
JAR�t�@�C����C���N���[�h����
- ���Ƃ��ł��܂��BJBoss�A�v���P�[�V�����T�[�o�̃h�L�������g��JXM�T�[�r�X��
- EJB�f�v���C�����g�̂�葽���̏����܂��B
+ このファイルは <literal>META-INF</literal> ディレクトリに配置され、
+ JARファイルを拡張した <literal>.sar</literal> (service
archive)でパッケージ化されます。
+ 同様にHibernateパッケージも必要です。また、Hibernateはサードパーティのライブラリも要求します。
+ コンパイルした永続化クラスとそのマッピングファイルも同様にアーカイブ(.sarファイル)に入れます。
+ エンタープライズbean(通常はセッションbean)は自身のJARファイルを保持しますが、
+ 1回で(ホット)デプロイ可能なユニットのためにメインサービスアーカイブとしてこのEJB JARファイルをインクルードする
+ ことができます。JBossアプリケーションサーバのドキュメントにJXMサービスと
+ EJBデプロイメントのより多くの情報があります。
</para>
</sect2>
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/events.xml
===================================================================
--- core/trunk/documentation/manual/ja-JP/src/main/docbook/content/events.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++ core/trunk/documentation/manual/ja-JP/src/main/docbook/content/events.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,31 +1,33 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="events">
- <title>�C���^�[�Z�v�^�ƃC�x���g</title>
+ <title>インターセプタとイベント</title>
<para>
- �A�v���P�[�V������Hibernate�̓���Ŕ�������C�x���g�ɑΉ��ł���Ɩ�ɗ����Ƃ�����܂��B
- �����̈�ʓI�ȋ@�\������ł���悤�ɂȂ�A
- �܂�Hibernate�̋@�\��g�����邱�Ƃ�ł���悤�ɂȂ�܂��B
+ アプリケーションがHibernateの内部で発生するイベントに対応できると役に立つことがあります。
+ ある種の一般的な機能を実装できるようになり、
+ またHibernateの機能を拡張することもできるようになります。
</para>
<sect1 id="objectstate-interceptors" revision="3">
- <title>�C���^�[�Z�v�^</title>
+ <title>インターセプタ</title>
<para>
- <literal>Interceptor</literal> �C���^�[�t�F�C�X��g���āA
- �Z�b�V��������A�v���P�[�V�����փR�[���o�b�N���邱�Ƃ��ł��܂��B
- ����ɂ��i���I�u�W�F�N�g�̕ۑ��A�X�V�A�폜�A�ǂݍ��݂̑O�ɁA
- �A�v���P�[�V�������v���p�e�B���������葀�삵����ł���悤�ɂȂ�܂��B
- ����͊č����̒ǐՂɗ��p�ł��܂��B
- ���̗�� <literal>Interceptor</literal> ��
<literal>Auditable</literal>
- ���쐬�����Ǝ����I�� <literal>createTimestamp</literal> ��ݒ肵�A
- <literal>Auditable</literal> ���X�V�����Ǝ����I��
- <literal>lastUpdateTimestamp</literal> �v���p�e�B��X�V���܂��B
+ <literal>Interceptor</literal> インターフェイスを使って、
+ セッションからアプリケーションへコールバックをすることができます。
+ これにより永続オブジェクトの保存、更新、削除、読み込みの前に、
+ アプリケーションがプロパティを検査したり操作したりできるようになります。
+ これは監査情報の追跡に利用できます。
+ 下の例で <literal>Interceptor</literal> は
<literal>Auditable</literal>
+ が作成されると自動的に <literal>createTimestamp</literal> を設定し、
+ <literal>Auditable</literal> が更新されると自動的に
+ <literal>lastUpdateTimestamp</literal> プロパティを更新します。
</para>
<para>
- <literal>Interceptor</literal> �ڎ���������A
- �i����ɂ悢�̂́j<literal>EmptyInterceptor</literal>
��g��������ł��܂��B
+ <literal>Interceptor</literal> を直接実装したり、
+ (さらによいのは)<literal>EmptyInterceptor</literal> を拡張したりできます。
</para>
<programlisting><![CDATA[package org.hibernate.test;
@@ -112,30 +114,30 @@
}]]></programlisting>
<para>
- �C���^�[�Z�v�^�ɂ͓��ނ���܂��F
- <literal>Session</literal> �X�R�[�v�̂�̂�
- <literal>SessionFactory</literal> �X�R�[�v�̂�̂ł��B
+ インターセプタには二種類あります:
+ <literal>Session</literal> スコープのものと
+ <literal>SessionFactory</literal> スコープのものです。
</para>
<para>
- <literal>Session</literal> �X�R�[�v�̃C���^�[�Z�v�^�́A
- �Z�b�V������I�[�v������Ƃ��Ɏw�肵�܂��B
- <literal>Interceptor</literal>
������Ɏ��SessionFactory.openSession()
- �̃I�[�o�[���[�h���\�b�h�̈��g���܂��B
+ <literal>Session</literal> スコープのインターセプタは、
+ セッションをオープンするときに指定します。
+ <literal>Interceptor</literal>
を引数に取るSessionFactory.openSession()
+ のオーバーロードメソッドの一つを使います。
</para>
<programlisting><![CDATA[Session session = sf.openSession( new
AuditInterceptor() );]]></programlisting>
<para>
- <literal>SessionFactory</literal> �X�R�[�v�̃C���^�[�Z�v�^��
<literal>Configuration</literal>
- �I�u�W�F�N�g��g���ēo�^���܂��B
- ����� <literal>SessionFactory</literal> �̍\�z����D�悳��܂��B
- ���̏ꍇ�A�����C���^�[�Z�v�^�� <literal>SessionFactory</literal>
- ����I�[�v�����ꂽ���ׂẴZ�b�V�����ɓK�p����܂��B
- ����͎g�p����C���^�[�Z�v�^���I�Ɏw�肵�ăZ�b�V������I�[�v�����Ȃ�����A�����Ȃ�܂��B
- <literal>SessionFactory</literal>
�X�R�[�v�̃C���^�[�Z�v�^�̓X���b�h�Z�[�t�łȂ���Ȃ�܂���B
- �����̃Z�b�V�������i���ݓI�Ɂj���̃C���^�[�Z�v�^�����s�Ŏg�p���邱�ƂɂȂ邽�߁A
- �Z�b�V�����ŗL�̏�Ԃ�i�[���Ȃ��悤�ɋC����Ă��������B
+ <literal>SessionFactory</literal> スコープのインターセプタは
<literal>Configuration</literal>
+ オブジェクトを使って登録します。
+ これは <literal>SessionFactory</literal> の構築よりも優先されます。
+ この場合、提供されるインターセプタは <literal>SessionFactory</literal>
+ からオープンされたすべてのセッションに適用されます。
+ これは使用するインターセプタを明示的に指定してセッションをオープンしない限り、そうなります。
+ <literal>SessionFactory</literal>
スコープのインターセプタはスレッドセーフでなければなりません。
+ 複数のセッションが(潜在的に)このインターセプタを同時並行で使用することになるため、
+ セッション固有の状態を格納しないように気をつけてください。
</para>
<programlisting><![CDATA[new Configuration().setInterceptor( new
AuditInterceptor() );]]></programlisting>
@@ -143,46 +145,46 @@
</sect1>
<sect1 id="objectstate-events" revision="4">
- <title>�C�x���g�V�X�e��</title>
+ <title>イベントシステム</title>
<para>
- �i�����w�œ���̃C�x���g�ɑΉ����Ȃ���Ȃ�Ȃ��ꍇ�A
- Hibernate3�� <emphasis>�C�x���g</emphasis>
�A�[�L�e�N�`����g�����Ƃ�ł��܂��B
-
�C�x���g�V�X�e���̓C���^�[�Z�v�^�ƈꏏ�Ɏg�����A�܂��̓C���^�[�Z�v�^�̑���Ƃ��Ďg�����Ƃ��ł��܂��B
+ 永続化層で特定のイベントに対応しなければならない場合、
+ Hibernate3の <emphasis>イベント</emphasis> アーキテクチャを使うこともできます。
+ イベントシステムはインターセプタと一緒に使うか、またはインターセプタの代わりとして使うことができます。
</para>
<para>
- �{���I�� <literal>Session</literal>
�C���^�[�t�F�C�X�̂��ׂẴ��\�b�h�́A
- 1�̃C�x���g�Ƒ��݂Ɋ֘A���܂��B
- �Ⴆ��
<literal>LoadEvent</literal>�A<literal>FlushEvent</literal>
�Ȃǂ�����܂�
- �i��`�ς݂̃C�x���g�^�̈ꗗ�ɂ��ẮAXML�ݒ�t�@�C����DTD��
- <literal>org.hibernate.event</literal> �p�b�P�[�W�ׂĂ��������j�B
- ���N�G�X�g�������̃��\�b�h��1��������Ƃ��A
- Hibernate�� <literal>Session</literal> �͓K�ȃC�x���g�����A
- ���̃C�x���g�^�ɐݒ肳�ꂽ�C�x���g���X�i�ɓn���܂��B
- ���炵�����ƂɁA�����̃��X�i�͂��̃��\�b�h�Ɠ���������������܂��B
- �Ƃ͂����A���X�i�C���^�[�t�F�C�X�̈���R�ɃJ�X�^�������ł��܂�
- �i�܂�A<literal>LoadEvent</literal> �͓o�^���ꂽ
<literal>LoadEventListener</literal>
- �C���^�[�t�F�C�X�̎����ɂ�菈������܂��j�B
- ���̏ꍇ�A���̎����ɂ� <literal>Session</literal> ������ꂽ�ǂ̂悤��
<literal>load()</literal>
- ���N�G�X�g����������ӔC������܂��B
+ 本質的に <literal>Session</literal> インターフェイスのすべてのメソッドは、
+ 1個のイベントと相互に関連します。
+ 例えば
<literal>LoadEvent</literal>、<literal>FlushEvent</literal>
などがあります
+ (定義済みのイベント型の一覧については、XML設定ファイルのDTDや
+ <literal>org.hibernate.event</literal> パッケージを調べてください)。
+ リクエストがこれらのメソッドの1つから作られるとき、
+ Hibernateの <literal>Session</literal> は適切なイベントを生成し、
+ そのイベント型に設定されたイベントリスナに渡します。
+ すばらしいことに、これらのリスナはそのメソッドと同じ処理を実装します。
+ とはいえ、リスナインターフェイスの一つを自由にカスタム実装できます
+ (つまり、<literal>LoadEvent</literal> は登録された
<literal>LoadEventListener</literal>
+ インターフェイスの実装により処理されます)。
+ その場合、その実装には <literal>Session</literal> から作られたどのような
<literal>load()</literal>
+ リクエストをも処理する責任があります。
</para>
<para>
- ���X�i�͎�����V���O���g���ł���ƌ��Ȃ��܂��B
- �܂胊�X�i�̓��N�G�X�g�Ԃŋ��L����邽�߁A
- �C���X�^���X�ϐ��Ƃ��ď�Ԃ�ێ�����ׂ��ł͂Ȃ��Ƃ������Ƃł��B
+ リスナは事実上シングルトンであると見なせます。
+ つまりリスナはリクエスト間で共有されるため、
+ インスタンス変数として状態を保持するべきではないということです。
</para>
<para>
- �J�X�^�����X�i�͏����������C�x���g�ɂ��ēK�ȃC���^�[�t�F�C�X���������ׂ��ł��B
- �֗��Ȋ��N���X�̂����̈��p�����Ă�悢�ł�
- �i�܂���Hibernate���f�t�H���g�Ŏg�p����C�x���g���X�i��p�����Ă�悢�ł��B
- ���炵�����ƂɁA���̖ړI�̂��߂ɔ�final�Ƃ��Đ錾����Ă��܂��j�B
- �J�X�^�����X�i�� <literal>Configuration</literal>
�I�u�W�F�N�g��g���ăv���O��������o�^���邩�A
- Hibernate��XML�ݒ�t�@�C���Ŏw��ł��܂�
- �i�v���p�e�B�t�@�C���Ő錾�I�ɐݒ肷����@�̓T�|�[�g����Ă��܂���j�B
- �J�X�^�����[�h�C�x���g���X�i�̗�����܂��B
+ カスタムリスナは処理したいイベントについて適切なインターフェイスを実装するべきです。
+ 便利な基底クラスのうちの一つを継承してもよいです
+ (またはHibernateがデフォルトで使用するイベントリスナを継承してもよいです。
+ すばらしいことに、この目的のために非finalとして宣言されています)。
+ カスタムリスナは <literal>Configuration</literal>
オブジェクトを使ってプログラムから登録するか、
+ HibernateのXML設定ファイルで指定できます
+ (プロパティファイルで宣言的に設定する方法はサポートされていません)。
+ カスタムロードイベントリスナの例を示します。
</para>
<programlisting><![CDATA[public class MyLoadListener implements
LoadEventListener {
@@ -196,7 +198,7 @@
}]]></programlisting>
<para>
- �f�t�H���g���X�i�ȊO�̃��X�i��g���ɂ́AHibernate�ւ̐ݒ��K�v�ł��F
+ デフォルトリスナ以外のリスナを使うには、Hibernateへの設定も必要です:
</para>
<programlisting><![CDATA[<hibernate-configuration>
@@ -210,7 +212,7 @@
</hibernate-configuration>]]></programlisting>
<para>
- �܂����̑��ɁA�v���O�����œo�^������@�����܂��F
+ またその他に、プログラムで登録する方法もあります:
</para>
<programlisting><![CDATA[Configuration cfg = new Configuration();
@@ -218,31 +220,31 @@
cfg.EventListeners().setLoadEventListeners(stack);]]></programlisting>
<para>
- ���X�i��錾�I�ɓo�^����ƁA���̃��X�i�̃C���X�^���X���L�ł��܂���B
- ������ <literal><listener/></literal>
�v�f�œ����N���X�����g����ƁA
- ���ꂼ��̎Q�Ƃ͂��̃N���X�̕ʁX�̃C���X�^���X��w�����ƂɂȂ�܂��B
- ���X�i�^�̊ԂŃ��X�i�C���X�^���X���L����K�v������A
- �v���O�����œo�^������@��̂�Ȃ���Ȃ�܂���B
+ リスナを宣言的に登録すると、そのリスナのインスタンスを共有できません。
+ 複数の <literal><listener/></literal>
要素で同じクラス名が使われると、
+ それぞれの参照はそのクラスの別々のインスタンスを指すことになります。
+ リスナ型の間でリスナインスタンスを共有する必要があれば、
+ プログラムで登録する方法を採らなければなりません。
</para>
<para>
- �Ȃ��C���^�[�t�F�C�X��������āA���������^��ݒ莞�Ɏw�肷��̂ł��傤���H
- ���X�i�̎����N���X�ɁA�����̃C�x���g���X�i�C���^�[�t�F�C�X������ł��邩��ł��B
- �o�^���ɒlj��Ō^��w�肷�邱�ƂŁA�J�X�^�����X�i��on/off��ݒ莞�ɊȒP�ɐ�ւ����܂��B
+ なぜインターフェイスを実装して、特化した型を設定時に指定するのでしょうか?
+ リスナの実装クラスに、複数のイベントリスナインターフェイスを実装できるからです。
+ 登録時に追加で型を指定することで、カスタムリスナのon/offを設定時に簡単に切り替えられます。
</para>
</sect1>
<sect1 id="objectstate-decl-security" revision="2">
- <title>Hibernate�̐錾�I�ȃZ�L�����e�B</title>
+ <title>Hibernateの宣言的なセキュリティ</title>
<para>
-
��ʓI��Hibernate�A�v���P�[�V�����̐錾�I�ȃZ�L�����e�B�́A�Z�b�V�����t�@�T�[�h�w�ŊǗ����܂��B
- ���݁AHiberenate3��JACC�ŋ������AJAAS�ŔF�����A�N�V���������Ă��܂��B
- ����̓C�x���g�A�[�L�e�N�`���̍ŏ�ʂɑg�ݍ��܂�Ă���I�v�V�����̋@�\�ł��B
+ 一般的にHibernateアプリケーションの宣言的なセキュリティは、セッションファサード層で管理します。
+ 現在、Hiberenate3はJACCで許可しかつ、JAASで認証したアクションを許しています。
+ これはイベントアーキテクチャの最上位に組み込まれているオプションの機能です。
</para>
<para>
- �܂��ŏ��ɁA�K�ȃC�x���g���X�i��ݒ肵��JAAS�F��g����悤�ɂ��Ȃ���Ȃ�܂���B
+ まず最初に、適切なイベントリスナを設定してJAAS認証を使えるようにしなければなりません。
</para>
<programlisting><![CDATA[<listener type="pre-delete"
class="org.hibernate.secure.JACCPreDeleteEventListener"/>
@@ -251,21 +253,21 @@
<listener type="pre-load"
class="org.hibernate.secure.JACCPreLoadEventListener"/>]]></programlisting>
<para>
- ����̃C�x���g�^�ɑ��Ă��傤�Lj�̃��X�i������Ƃ��A
+ 特定のイベント型に対してちょうど一つのリスナがあるとき、
<literal><listener type="..."
class="..."/></literal>
- �� <literal><event type="..."><listener
class="..."/></event></literal>
- �̊ȗ��`�ɉ߂��Ȃ����Ƃɒ��ӂ��Ă��������B
+ は <literal><event type="..."><listener
class="..."/></event></literal>
+ の簡略形に過ぎないことに注意してください。
</para>
<para>
- ���ɁA������ <literal>hibernate.cfg.xml</literal>
�Ń��[���Ƀp�[�~�b�V������^���Ă��������F
+ 次に、同じく <literal>hibernate.cfg.xml</literal>
でロールにパーミッションを与えてください:
</para>
<programlisting><![CDATA[<grant role="admin"
entity-name="User" actions="insert,update,read"/>
<grant role="su" entity-name="User"
actions="*"/>]]></programlisting>
<para>
- ���̃��[�����͎g�p����JACC�v���o�C�_�ɗ�����郍�[���ł��B
+ このロール名は使用するJACCプロバイダに理解されるロールです。
</para>
</sect1>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_mappings.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_mappings.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_mappings.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<chapter id="example-mappings">
- <title>��F���낢��ȃ}�b�s���O</title>
+ <title>例:いろいろなマッピング</title>
<para>
- ���̏͂ł́A��蕡�G�Ȋ֘A�̃}�b�s���O�������Љ�܂��B
+ この章では、より複雑な関連のマッピングをいくつか紹介します。
</para>
<sect1 id="example-mappings-emp">
- <title>�ٗp��/�]�ƈ�</title>
+ <title>雇用者/従業員</title>
<para>
- <literal>Employer</literal> ��
<literal>Employee</literal> �̊W��\���ȉ��̃��f���́A
- �֘A�̕\���Ɏ��ۂ̃G���e�B�e�B�N���X�i <literal>Employment</literal>
�j
- ��g���܂��B
- �Ȃ��Ȃ�A����2�̃p�[�e�B�ɕ����̊��Ԍٗp�����Ƃ������Ƃ����肦�邩��ł��B
- ����̒l�Ə]�ƈ��̖��O���f�������邽�߂ɃR���|�[�l���g��g���Ă��܂��B
+ <literal>Employer</literal> と
<literal>Employee</literal> の関係を表す以下のモデルは、
+ 関連の表現に実際のエンティティクラス( <literal>Employment</literal> )
+ を使います。
+ なぜなら、同じ2つのパーティに複数の期間雇用されるということがありえるからです。
+ お金の値と従業員の名前をモデル化するためにコンポーネントを使っています。
</para>
<mediaobject>
@@ -29,7 +29,7 @@
</mediaobject>
<para>
- �}�b�s���O�h�L�������g�̈��ł��F
+ マッピングドキュメントの一例です:
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -82,7 +82,7 @@
</hibernate-mapping>]]></programlisting>
<para>
- <literal>SchemaExport</literal> �Ő��������e�[�u���X�L�[�}�ł��B
+ <literal>SchemaExport</literal> で生成したテーブルスキーマです。
</para>
<programlisting><![CDATA[create table employers (
@@ -122,14 +122,14 @@
</sect1>
<sect1 id="example-mappings-authorwork">
- <title>���/��i</title>
+ <title>作者/作品</title>
<para>
- <literal>Work</literal> , <literal>Author</literal>
������ <literal>Person</literal>
- �̊W��\���ȉ��̃��f����l���Ă݂Ă��������B
- <literal>Work</literal> �� <literal>Author</literal>
�̊W�𑽑Α��֘A�ŕ\���Ă��܂��B
- <literal>Author</literal> ��
<literal>Person</literal> �̊W�͈�Έ�֘A�Ƃ��ĕ\���Ă��܂��B
- ���ɂ� <literal>Author</literal> ��
<literal>Person</literal> ��g������Ƃ������@�����܂��B
+ <literal>Work</literal> , <literal>Author</literal>
そして <literal>Person</literal>
+ の関係を表す以下のモデルを考えてみてください。
+ <literal>Work</literal> と <literal>Author</literal>
の関係を多対多関連で表しています。
+ <literal>Author</literal> と <literal>Person</literal>
の関係は一対一関連として表しています。
+ 他には <literal>Author</literal> が
<literal>Person</literal> を拡張するという方法もあります。
</para>
<mediaobject>
@@ -142,7 +142,7 @@
</mediaobject>
<para>
- �ȉ��̃}�b�s���O�h�L�������g�͂��̂悤�ȊW�𐳊m�ɕ\�����Ă��܂��B
+ 以下のマッピングドキュメントはこのような関係を正確に表現しています。
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -198,11 +198,11 @@
</hibernate-mapping>]]></programlisting>
<para>
- ���̃}�b�s���O�ɂ�4�̃e�[�u��������܂��B
+ このマッピングには4つのテーブルがあります。
<literal>works</literal> , <literal>authors</literal> ,
<literal>persons</literal>
- �͂��ꂼ��A�d���A��ҁA�l�̃f�[�^��ێ����܂��B
- <literal>author_work</literal> �͍�҂ƍ�i�����N����֘A�e�[�u���ł��B
- �ȉ��� <literal>SchemaExport</literal> �Ő��������e�[�u���X�L�[�}�ł��B
+ はそれぞれ、仕事、作者、人のデータを保持します。
+ <literal>author_work</literal> は作者と作品をリンクする関連テーブルです。
+ 以下は <literal>SchemaExport</literal> で生成したテーブルスキーマです。
</para>
<programlisting><![CDATA[create table works (
@@ -243,17 +243,17 @@
</sect1>
<sect1 id="example-mappings-customerorderproduct">
- <title>�ڋq/����/���i</title>
+ <title>顧客/注文/製品</title>
<para>
- ���āA <literal>Customer</literal> ,
<literal>Order</literal> , <literal>LineItem</literal>
- <literal>Product</literal> �̊W��\�����f����l���Ă݂܂��傤�B
- <literal>Customer</literal> ��
<literal>Order</literal> �͈�Α��̊֘A�ł����A
+ さて、 <literal>Customer</literal> ,
<literal>Order</literal> , <literal>LineItem</literal>
+ <literal>Product</literal> の関係を表すモデルを考えてみましょう。
+ <literal>Customer</literal> と
<literal>Order</literal> は一対多の関連ですが、
<literal>Order</literal> /
<literal>LineItem</literal> / <literal>Product</literal>
- �͂ǂ̂悤�ɕ\������ׂ��ł��傤���H
- <literal>LineItem</literal>
��A<literal>Order</literal> �� <literal>Product</literal>
- �̑��Α��֘A��\������֘A�N���X�Ƃ��ă}�b�s���O���܂����B
- Hibernate�ł͂����R���|�W�b�g�v�f�ƌĂт܂��B
+ はどのように表現するべきでしょうか?
+ <literal>LineItem</literal>
を、<literal>Order</literal> と <literal>Product</literal>
+ の多対多関連を表現する関連クラスとしてマッピングしました。
+ Hibernateではこれをコンポジット要素と呼びます。
</para>
<mediaobject>
@@ -266,7 +266,7 @@
</mediaobject>
<para>
- �}�b�s���O�h�L�������g�F
+ マッピングドキュメント:
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -309,8 +309,8 @@
<para>
<literal>customers</literal> , <literal>orders</literal>
, <literal>line_items</literal> ,
- <literal>products</literal>
�͂��ꂼ��A�ڋq�A�����A�������ׁA���i�̃f�[�^��ێ����܂��B
- <literal>line_items</literal>
�͒����Ɛ��i�����N����֘A�e�[�u���Ƃ��Ă�����܂��B
+ <literal>products</literal> はそれぞれ、顧客、注文、注文明細、製品のデータを保持します。
+ <literal>line_items</literal> は注文と製品をリンクする関連テーブルとしても働きます。
</para>
<programlisting><![CDATA[create table customers (
@@ -350,18 +350,18 @@
</sect1>
<sect1 id="misc">
- <title>��X�G���ȃ}�b�s���O��</title>
+ <title>種々雑多なマッピング例</title>
<para>
- �����ɂ����͂��ׂ�Hibernate�̃e�X�g�X�C�[�g������܂����B
- �����ɂ́A���ɂ��������̃}�b�s���O�̗Ⴊ����܂��B
- Hibernate�f�B�X�g���r���[�V������ <literal>test</literal>
�t�H���_�����������B
+ ここにある例はすべてHibernateのテストスイートから取りました。
+ そこには、他にもたくさんのマッピングの例があります。
+ Hibernateディストリビューションの <literal>test</literal> フォルダを見てください。
</para>
- <para>TODO: �����ɕ��͂߂�</para>
+ <para>TODO: ここに文章を埋める</para>
<sect2 id="example-mappings-typed-onetone">
- <title>�u�^�t�����ꂽ�v��Έ�֘A</title>
+ <title>「型付けされた」一対一関連</title>
<programlisting><![CDATA[<class name="Person">
<id name="name"/>
<one-to-one name="address"
@@ -391,7 +391,7 @@
</sect2>
<sect2 id="example-mappings-composite-key">
- <title>�����L�[�̗�</title>
+ <title>複合キーの例</title>
<programlisting><![CDATA[<class name="Customer">
<id name="customerId"
@@ -508,7 +508,7 @@
</sect2>
<sect2 id="example-mappings-composite-key-manytomany">
- <title>�����L�[�������L���鑽�Α�</title>
+ <title>複合キー属性を共有する多対多</title>
<programlisting><![CDATA[<class name="User"
table="`User`">
<composite-id>
<key-property name="name"/>
@@ -547,7 +547,7 @@
</sect2>
<sect2 id="example-mappings-content-discrimination">
- <title>discrimination�Ɋ�Â���e</title>
+ <title>discriminationに基づく内容</title>
<programlisting><![CDATA[<class name="Person"
discriminator-value="P">
@@ -601,7 +601,7 @@
</sect2>
<sect2 id="example-mappings-association-alternatekeys"
revision="2">
- <title>��փL�[�̊֘A</title>
+ <title>代替キーの関連</title>
<programlisting><![CDATA[<class name="Person">
<id name="id">
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_parentchild.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_parentchild.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_parentchild.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,70 +1,72 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="example-parentchild">
- <title>��F�e/�q��
+ <title>例:親/子供
</title>
<para>
- �V�K���[�U��Hibernate��g���Ă܂��ŏ��Ɉ������f���̈�ɁA�e�q�^�̃��f����������܂��B
- ���̃��f�����ɂ͓�̃A�v���[�`�����݂��܂��B�Ƃ�킯�V�K���[�U�ɂƂ��āA
- ���܂��܂ȗ��R����ł�֗����Ǝv����A�v���[�`�́A<literal>�e</literal> ����
<literal>�q��</literal>
- �ւ� <literal><one-to-many></literal> �֘A�ɂ��
<literal>�e</literal> �� <literal>�q��</literal>
- �̗�����G���e�B�e�B�N���X�Ƃ��ă��f�����O������@�ł�
- �i�����̕��@�́A<literal>�q��</literal> ��
<literal><composite-element></literal> �Ƃ��Ē�`�����̂ł��j�B
-
����ŁiHibernate�ɂ�����j��Α��֘A�̃f�t�H���g�̃Z�}���e�B�N�X���A�ʏ�̕����v�f�̃}�b�s���O����A
- �e�q�W�̃Z�}���e�B�N�X���牓�����Ƃ��킩��܂��B
- ����ł͐e�q�W������I���G���K���g�Ƀ��f�����O���邽�߂ɁA
- <emphasis>�J�X�P�[�h�����g�����o������Α��֘A</emphasis>
�̈������������܂��B����͂܂����������̂ł͂���܂���B
+ 新規ユーザがHibernateを使ってまず最初に扱うモデルの一つに、親子型のモデル化があります。
+ このモデル化には二つのアプローチが存在します。とりわけ新規ユーザにとって、
+ さまざまな理由から最も便利だと思われるアプローチは、<literal>親</literal> から
<literal>子供</literal>
+ への <literal><one-to-many></literal> 関連により
<literal>親</literal> と <literal>子供</literal>
+ の両方をエンティティクラスとしてモデリングする方法です
+ (もう一つの方法は、<literal>子供</literal> を
<literal><composite-element></literal> として定義するものです)。
+ これで(Hibernateにおける)一対多関連のデフォルトのセマンティクスが、通常の複合要素のマッピングよりも、
+ 親子関係のセマンティクスから遠いことがわかります。
+ それでは親子関係を効率的かつエレガントにモデリングするために、
+ <emphasis>カスケード操作を使った双方向一対多関連</emphasis>
の扱い方を説明します。これはまったく難しいものではありません。
</para>
<sect1 id="example-parentchild-collections">
- <title>�R���N�V�����Ɋւ��钍��</title>
+ <title>コレクションに関する注意</title>
<para>
- Hibernate�̃R���N�V�����͎��g�̃G���e�B�e�B�̘_���I�ȕ����ƍl�����A
- �����ĕ�܂���G���e�B�e�B�̂�̂ł͂���܂���B����͒v���I�ȈႢ�ł��I
- ����͈ȉ��̂悤�Ȍ��ʂɂȂ�܂��F
+ Hibernateのコレクションは自身のエンティティの論理的な部分と考えられ、
+ 決して包含するエンティティのものではありません。これは致命的な違いです!
+ これは以下のような結果になります:
</para>
<itemizedlist>
<listitem>
<para>
- �I�u�W�F�N�g��R���N�V��������폜�A�܂��̓R���N�V�����ɒlj�����Ƃ��A
- �R���N�V�����̃I�[�i�[�̃o�[�W�����ԍ��̓C���N�������g����܂��B
+ オブジェクトをコレクションから削除、またはコレクションに追加するとき、
+ コレクションのオーナーのバージョン番号はインクリメントされます。
</para>
</listitem>
<listitem>
<para>
- ����R���N�V��������폜���ꂽ�I�u�W�F�N�g���l�^�̃C���X�^���X
- �i�Ⴆ�R���|�W�b�g�G�������g)�������Ȃ�A���̃I�u�W�F�N�g�͉i���I�ł͂Ȃ��Ȃ�A
- ���̏�Ԃ̓f�[�^�x�[�X���犮�S�ɍ폜����܂��B
-
�����悤�ɁA�l�^�̃C���X�^���X��R���N�V�����ɒlj�����ƁA���̏�Ԃ͂����ɉi���I�ɂȂ�܂��B
+ もしコレクションから削除されたオブジェクトが値型のインスタンス
+ (例えばコンポジットエレメント)だったならば、そのオブジェクトは永続的ではなくなり、
+ その状態はデータベースから完全に削除されます。
+ 同じように、値型のインスタンスをコレクションに追加すると、その状態はすぐに永続的になります。
</para>
</listitem>
<listitem>
<para>
- ����A����G���e�B�e�B���R���N�V�����i��Α��܂��͑��Α��֘A)����폜����Ă�A
- �f�t�H���g�ł͂���͍폜����܂���B���̓���͊��S�Ɉ�т��Ă��܂��B
-
���Ȃ킿�A���̃G���e�B�e�B�̓����Ԃ�ύX���Ă�A�֘A����G���e�B�e�B�����ł��ׂ��ł͂Ȃ��Ƃ������Ƃł��B
-
���l�ɁA�G���e�B�e�B���R���N�V�����ɒlj�����Ă�A�f�t�H���g�ł͂��̃G���e�B�e�B�͉i���I�ɂ͂Ȃ�܂���B
+ 一方、もしエンティティがコレクション(一対多または多対多関連)から削除されても、
+ デフォルトではそれは削除されません。この動作は完全に一貫しています。
+ すなわち、他のエンティティの内部状態を変更しても、関連するエンティティが消滅すべきではないということです。
+ 同様に、エンティティがコレクションに追加されても、デフォルトではそのエンティティは永続的にはなりません。
</para>
</listitem>
</itemizedlist>
<para>
-
���̑���ɁA�f�t�H���g�̓���ł́A�G���e�B�e�B��R���N�V�����ɒlj�����ƒP�ɓ�̃G���e�B�e�B�Ԃ̃����N��쐬���A
- ����G���e�B�e�B��폜����ƃ����N��폜���܂��B����͂��ׂẴP�[�X�ɂ����Ĕ��ɓK�ł��B
-
���ꂪ�K�łȂ��̂͐e/�q�W�̏ꍇ�ł��B���̏ꍇ�q���̐����͐e�̃��C�t�T�C�N���ɐ�������邩��ł��B
+ その代わりに、デフォルトの動作では、エンティティをコレクションに追加すると単に二つのエンティティ間のリンクを作成し、
+ 一方エンティティを削除するとリンクも削除します。これはすべてのケースにおいて非常に適切です。
+ これが適切でないのは親/子関係の場合です。この場合子供の生存は親のライフサイクルに制限されるからです。
</para>
</sect1>
<sect1 id="example-parentchild-bidir">
- <title>�o������Α�
+ <title>双方向一対多
</title>
<para>
- <literal>Parent</literal> ����
<literal>Child</literal> �ւ̒P����
<literal><one-to-many></literal> �֘A����n�߂�Ƃ��܂��B
+ <literal>Parent</literal> から <literal>Child</literal>
への単純な <literal><one-to-many></literal> 関連から始めるとします。
</para>
<programlisting><![CDATA[<set name="children">
@@ -73,7 +75,7 @@
</set>]]></programlisting>
<para>
- �ȉ��̃R�[�h����s����ƁA
+ 以下のコードを実行すると、
</para>
<programlisting><![CDATA[Parent p = .....;
@@ -83,25 +85,25 @@
session.flush();]]></programlisting>
<para>
- Hibernate�͓��SQL���s���܂�:
+ Hibernateは二つのSQL文を発行します:
</para>
<itemizedlist>
<listitem>
<para>
-
<literal>c</literal>�ɑ��郌�R�[�h������<literal>INSERT</literal>
+
<literal>c</literal>に対するレコードを生成する<literal>INSERT</literal>
</para>
</listitem>
<listitem>
<para>
-
<literal>p</literal>����<literal>c</literal>�ւ̃����N��쐬����<literal>UPDATE</literal>
+
<literal>p</literal>から<literal>c</literal>へのリンクを作成する<literal>UPDATE</literal>
</para>
</listitem>
</itemizedlist>
<para>
- ����͔�����I�Ȃ����ł͂Ȃ��A<literal>parent_id</literal> �J�����ɂ�����
<literal>NOT NULL</literal> ����Ɉᔽ���܂��B
- �R���N�V�����̃}�b�s���O��
<literal>not-null="true"</literal>
�Ǝw�肷�邱�ƂŁAnull����ᔽ������邱�Ƃ��ł��܂�:
+ これは非効率的なだけではなく、<literal>parent_id</literal> カラムにおいて
<literal>NOT NULL</literal> 制約に違反します。
+ コレクションのマッピングで <literal>not-null="true"</literal>
と指定することで、null制約違反を解決することができます:
</para>
<programlisting><![CDATA[<set name="children">
@@ -110,24 +112,24 @@
</set>]]></programlisting>
<para>
- ���������̉���͐����ł��܂���B
+ しかしこの解決策は推奨できません。
</para>
<para>
- ���̓���̍��{�I�Ȍ����́A<literal>p</literal> ����
<literal>c</literal> �ւ̃����N
- �i�O���L�[ <literal>parent_id</literal>)��
<literal>Child</literal> �I�u�W�F�N�g�̏�Ԃ̈ꕔ�Ƃ͍l����ꂸ�A
- ���̂��� <literal>INSERT</literal>
�ɂ���ă����N����������Ȃ����Ƃł��B
- �ł�����A����̓����N��Child�}�b�s���O�̈ꕔ�ɂ��邱�Ƃł��B
+ この動作の根本的な原因は、<literal>p</literal> から
<literal>c</literal> へのリンク
+ (外部キー <literal>parent_id</literal>)は
<literal>Child</literal> オブジェクトの状態の一部とは考えられず、
+ そのため <literal>INSERT</literal> によってリンクが生成されないことです。
+ ですから、解決策はリンクをChildマッピングの一部にすることです。
</para>
<programlisting><![CDATA[<many-to-one name="parent"
column="parent_id" not-null="true"/>]]></programlisting>
<para>
- (�܂� <literal>Child</literal> �N���X��
<literal>parent</literal> �v���p�e�B��lj�����K�v������܂��B)
+ (また <literal>Child</literal> クラスに
<literal>parent</literal> プロパティを追加する必要があります。)
</para>
<para>
- ����ł� <literal>Child</literal>
�G���e�B�e�B�������N�̏�Ԃ𐧌䂷��悤�ɂȂ����̂ŁA
- �R���N�V�����������N��X�V���Ȃ��悤�ɂ��܂��傤�B����ɂ�
<literal>inverse</literal> ������g���܂��B
+ それでは <literal>Child</literal> エンティティがリンクの状態を制御するようになったので、
+ コレクションがリンクを更新しないようにしましょう。それには <literal>inverse</literal>
属性を使います。
</para>
<programlisting><![CDATA[<set name="children"
inverse="true">
@@ -136,7 +138,7 @@
</set>]]></programlisting>
<para>
- �ȉ��̃R�[�h��g���A�V���� <literal>Child</literal>
��lj����邱�Ƃ��ł��܂��B
+ 以下のコードを使えば、新しい <literal>Child</literal> を追加することができます。
</para>
<programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class,
pid);
@@ -147,11 +149,11 @@
session.flush();]]></programlisting>
<para>
- ����ɂ��ASQL�� <literal>INSERT</literal>
��������������s�����悤�ɂȂ�܂����I
+ これにより、SQLの <literal>INSERT</literal> 文が一つだけが発行されるようになりました!
</para>
<para>
- ���������������ɂ́A<literal>Parent</literal> ��
<literal>addChild()</literal> ���\�b�h��쐬���܂��B
+ もう少し強化するには、<literal>Parent</literal> の
<literal>addChild()</literal> メソッドを作成します。
</para>
<programlisting><![CDATA[public void addChild(Child c) {
@@ -160,7 +162,7 @@
}]]></programlisting>
<para>
- <literal>Child</literal> ��lj�����R�[�h�͂��̂悤�ɂȂ�܂��B
+ <literal>Child</literal> を追加するコードはこのようになります。
</para>
<programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class,
pid);
@@ -172,10 +174,10 @@
</sect1>
<sect1 id="example-parentchild-cascades">
- <title>���C�t�T�C�N���̃J�X�P�[�h</title>
+ <title>ライフサイクルのカスケード</title>
<para>
- �����I�� <literal>save()</literal>
��R�[������̂͂܂��ς킵����̂ł��B�����J�X�P�[�h��g���đΏ����܂��B
+ 明示的に <literal>save()</literal>
をコールするのはまだ煩わしいものです。これをカスケードを使って対処します。
</para>
<programlisting><![CDATA[<set name="children"
inverse="true" cascade="all">
@@ -184,7 +186,7 @@
</set>]]></programlisting>
<para>
- ����ɂ���قǂ̃R�[�h���̂悤�ɒP�������܂�
+ これにより先ほどのコードをこのように単純化します
</para>
<programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class,
pid);
@@ -193,8 +195,8 @@
session.flush();]]></programlisting>
<para>
- ���l�� <literal>Parent</literal>
��ۑ��܂��͍폜����Ƃ��ɁA�q��������o���Ĉ����K�v�͂���܂���B
- �ȉ��̃R�[�h�� <literal>p</literal>
��폜���A�����ăf�[�^�x�[�X���炻�̎q�����ׂč폜���܂��B
+ 同様に <literal>Parent</literal>
を保存または削除するときに、子供を一つ一つ取り出して扱う必要はありません。
+ 以下のコードは <literal>p</literal> を削除し、そしてデータベースからその子供をすべて削除します。
</para>
<programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class,
pid);
@@ -202,7 +204,7 @@
session.flush();]]></programlisting>
<para>
- ���������̃R�[�h��
+ しかしこのコードは
</para>
<programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class,
pid);
@@ -212,9 +214,9 @@
session.flush();]]></programlisting>
<para>
- �f�[�^�x�[�X���� <literal>c</literal>
��폜���܂���B<literal>p</literal> �ւ̃����N��폜����
- �i�����Ă��̃P�[�X�ł� <literal>NOT NULL</literal>
����ᔽ������N�����j�����ł��B
- <literal>Child</literal> ��
<literal>delete()</literal> ������K�v������܂��B
+ データベースから <literal>c</literal>
を削除しません。<literal>p</literal> へのリンクを削除する
+ (そしてこのケースでは <literal>NOT NULL</literal> 制約違反を引き起こす)だけです。
+ <literal>Child</literal> の
<literal>delete()</literal> を明示する必要があります。
</para>
<programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class,
pid);
@@ -224,9 +226,9 @@
session.flush();]]></programlisting>
<para>
- �����̃P�[�X�ł͎��ۂ� <literal>Child</literal>
���e�Ȃ��ł͑��݂ł��Ȃ��悤�ɂȂ�܂����B
- ���̂��߁A����R���N�V�������� <literal>Child</literal>
���菜���ꍇ�A�����폜�������ł��B
- ���̂��߂ɂ�
<literal>cascade="all-delete-orphan"</literal> ��g��Ȃ���Ȃ�܂���B
+ 今このケースでは実際に <literal>Child</literal> が親なしでは存在できないようになりました。
+ そのため、もしコレクションから <literal>Child</literal> を取り除く場合、これも削除したいです。
+ そのためには <literal>cascade="all-delete-orphan"</literal>
を使わなければなりません。
</para>
<programlisting><![CDATA[<set name="children"
inverse="true" cascade="all-delete-orphan">
@@ -235,35 +237,35 @@
</set>]]></programlisting>
<para>
- ���ӁF�R���N�V�����̃}�b�s���O��
<literal>inverse="true"</literal> �Ǝw�肵�Ă�A
- �R���N�V�����̗v�f�̃C�e���[�V�����ɂ���āA�ˑR�J�X�P�[�h�����s����܂��B
- ���̂��߂���J�X�P�[�h�ŃI�u�W�F�N�g��Z�[�u�A�폜�A�X�V����K�v������Ȃ�A
- �����R���N�V�����ɒlj����Ȃ���Ȃ�܂���B�P��
<literal>setParent()</literal> ��ĂԂ����ł͕s�\���ł��B
+ 注意:コレクションのマッピングで <literal>inverse="true"</literal>
と指定しても、
+ コレクションの要素のイテレーションによって、依然カスケードが実行されます。
+ そのためもしカスケードでオブジェクトをセーブ、削除、更新する必要があるなら、
+ それをコレクションに追加しなければなりません。単に <literal>setParent()</literal>
を呼ぶだけでは不十分です。
</para>
</sect1>
<sect1 id="example-parentchild-update">
- <title>�J�X�P�[�h��
<literal>unsaved-value</literal></title>
+ <title>カスケードと <literal>unsaved-value</literal></title>
<para>
- <literal>Parent</literal> ���A����
<literal>Session</literal> �Ń��[�h����AUI�̃A�N�V�����ŕύX���������A
- <literal>update()</literal>
��Ă�ł��̕ύX��V�����Z�b�V�����ʼni�����������Ƃ��܂��B
- <literal>Parent</literal>
���q���̃R���N�V���������A�J�X�P�[�h�X�V���L���ɂȂ��Ă��邽�߁A
-
Hibernate�͂ǂ̎q�����V�����C���X�^���X�����ꂽ���A�ǂꂪ�f�[�^�x�[�X�̊����̍s�ɑ�������̂���m��K�v������܂��B
- <literal>Parent</literal> ��
<literal>Child</literal> �̗����� <literal>java.lang.Long</literal>
- �^�̎��ʃv���p�e�B�������Ƃ��܂��傤�B
-
Hibernate�͂ǂ̎q�����V������̂����肷�邽�߂Ɏ��ʃv���p�e�B�̒l��g���܂�(version��timestamp�v���p�e�B��g���܂��B
- <xref linkend="manipulatingdata-updating-detached"/>
�Q��)�BHibernate3�ɂȂ��āA
- �����I�� <literal>unsaved-value</literal>
��w�肷��K�v�͂Ȃ��Ȃ�܂����B
+ <literal>Parent</literal> が、ある
<literal>Session</literal> でロードされ、UIのアクションで変更が加えられ、
+ <literal>update()</literal> を呼んでこの変更を新しいセッションで永続化したいとします。
+ <literal>Parent</literal> が子供のコレクションを持ち、カスケード更新が有効になっているため、
+ Hibernateはどの子供が新しくインスタンス化されたか、どれがデータベースの既存の行に相当するのかを知る必要があります。
+ <literal>Parent</literal> と
<literal>Child</literal> の両方が <literal>java.lang.Long</literal>
+ 型の識別プロパティを生成したとしましょう。
+ Hibernateはどの子供が新しいものかを決定するために識別プロパティの値を使います(versionやtimestampプロパティも使えます。
+ <xref linkend="manipulatingdata-updating-detached"/>
参照)。Hibernate3になって、
+ 明示的に <literal>unsaved-value</literal> を指定する必要はなくなりました。
</para>
<para>
- �ȉ��̃R�[�h�� <literal>parent</literal> ��
<literal>child</literal> ��X�V���A<literal>newChild</literal>
��}�����܂��B
+ 以下のコードは <literal>parent</literal> と
<literal>child</literal> を更新し、<literal>newChild</literal> を挿入します。
</para>
<programlisting><![CDATA[//parent and child were both loaded in a
previous session
-//parent��child�͗����Ƃ�A�ȑO��Session�Ń��[�h����Ă��܂�
+//parentとchildは両方とも、以前のSessionでロードされています
parent.addChild(child);
Child newChild = new Child();
parent.addChild(newChild);
@@ -271,11 +273,11 @@
session.flush();]]></programlisting>
<para>
-
�����͐������ꂽ���ʎq�̏ꍇ�ɂ͔��ɗǂ��̂ł����A���蓖�Ă�ꂽ���ʎq�ƕ������ʎq�̏ꍇ�͂ǂ��ł��傤���H
-
�����Hibernate���A�i���[�U�ɂ�芄�蓖�Ă�ꂽ���ʎq���j�V�����C���X�^���X�����ꂽ�I�u�W�F�N�g�ƁA
- �ȑO��Session�Ń��[�h���ꂽ�I�u�W�F�N�g���ʂł��Ȃ����߁A������ł��B
-
���̏ꍇ�AHibernate�̓^�C���X�^���v���o�[�W�����̃v���p�e�B�̂ǂ��炩��g�����A�L���b�V���ɖ₢���킹�܂��B
- �ň��̏ꍇ�A�s�����݂��邩�ǂ����f�[�^�x�[�X���܂��B
+ これらは生成された識別子の場合には非常に良いのですが、割り当てられた識別子と複合識別子の場合はどうでしょうか?
+ これはHibernateが、(ユーザにより割り当てられた識別子を持つ)新しくインスタンス化されたオブジェクトと、
+ 以前のSessionでロードされたオブジェクトを区別できないため、より難しいです。
+ この場合、Hibernateはタイムスタンプかバージョンのプロパティのどちらかを使うか、二次キャッシュに問い合わせます。
+ 最悪の場合、行が存在するかどうかデータベースを見ます。
</para>
<!-- undocumenting
@@ -341,22 +343,22 @@
</sect1>
<sect1 id="example-parentchild-conclusion">
- <title>���_
+ <title>結論
</title>
<para>
- �����ł͂��Ȃ�̗ʂ�v���̂ŁA�ŏ��̍��͍������Ă���悤�Ɏv���邩�����܂���B
-
���������ۂ́A���ׂĔ��ɗǂ����삵�܂��B�قƂ�ǂ�Hibernate�A�v���P�[�V�����ł́A�����̏�ʂŐe�q�p�^�[����g�p���܂��B
+ ここではかなりの量を要約したので、最初の頃は混乱しているように思われるかもしれません。
+ しかし実際は、すべて非常に良く動作します。ほとんどのHibernateアプリケーションでは、多くの場面で親子パターンを使用します。
</para>
<para>
- �ŏ��̒i���ő�֕��@�ɂ��ĐG��܂����B��L�̂悤�Ȗ���
<literal><composite-element></literal> �}�b�s���O�̏ꍇ�͑��݂����A
- �ɂ������炸����͊m���ɐe�q�W�̃Z�}���e�B�N�X�����܂��B
- �������c�O�Ȃ���A�����v�f�N���X�ɂ͓�̑傫�Ȑ���������܂��F
- 1�͕����v�f�̓R���N�V���������Ƃ��ł��Ȃ����Ƃł��B����ЂƂ́A
- ���j�[�N�Ȑe�ł͂Ȃ��G���e�B�e�B�̎q���ƂȂ�ׂ��ł͂Ȃ��Ƃ������Ƃł�
+ 最初の段落で代替方法について触れました。上記のような問題は
<literal><composite-element></literal> マッピングの場合は存在せず、
+ にもかかわらずそれは確かに親子関係のセマンティクスを持ちます。
+ しかし残念ながら、複合要素クラスには二つの大きな制限があります:
+ 1つは複合要素はコレクションを持つことができないことです。もうひとつは、
+ ユニークな親ではないエンティティの子供となるべきではないということです
</para>
</sect1>
-</chapter>
\ No newline at end of file
+</chapter>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_weblog.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_weblog.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/example_weblog.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,15 +1,17 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="example-weblog">
- <title>��: Weblog�A�v���P�[�V����</title>
+ <title>例: Weblogアプリケーション</title>
<sect1 id="example-weblog-classes">
- <title>�i���N���X
+ <title>永続クラス
</title>
<para>
- �i���N���X���E�F�u���O�ƁA�E�F�u���O�Ɍf�����ꂽ���ڂ�\���Ă��܂��B
- �����͒ʏ�̐e�q�W�Ƃ��ă��f�����O����܂����A
- set�ł͂Ȃ�����������bag��g�p���邱�Ƃɂ��܂��B
+ 永続クラスがウェブログと、ウェブログに掲示された項目を表しています。
+ それらは通常の親子関係としてモデリングされますが、
+ setではなく順序を持ったbagを使用することにします。
</para>
<programlisting><![CDATA[package eg;
@@ -88,11 +90,11 @@
</sect1>
<sect1 id="example-weblog-mappings">
- <title>Hibernate�̃}�b�s���O
+ <title>Hibernateのマッピング
</title>
<para>
- XML�}�b�s���O�́A���ł͂ƂĂ�ȒP�Ȃ͂��ł��B
+ XMLマッピングは、今ではとても簡単なはずです。
</para>
<programlisting><![CDATA[<?xml version="1.0"?>
@@ -182,11 +184,11 @@
</sect1>
<sect1 id="example-weblog-code">
- <title>Hibernate�̃R�[�h</title>
+ <title>Hibernateのコード</title>
<para>
- �ȉ��̃N���X�́A
- Hibernate�ł����̃N���X��g���Ăł��邱�Ƃ����������Ă��܂��B
+ 以下のクラスは、
+ Hibernateでこれらのクラスを使ってできることをいくつか示しています。
</para>
<programlisting><![CDATA[package eg;
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/filters.xml
===================================================================
--- core/trunk/documentation/manual/ja-JP/src/main/docbook/content/filters.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++ core/trunk/documentation/manual/ja-JP/src/main/docbook/content/filters.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,32 +1,34 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="filters">
- <title>�f�[�^�̃t�B���^�����O</title>
+ <title>データのフィルタリング</title>
<para>
- Hibernate3�ł́u�����v���[���Ɋ�Â��ăf�[�^�������߂̉���I�ȕ��@��p�ӂ��Ă��܂��B
- <emphasis>Hibernate filter</emphasis>
�̓O���[�o���ŁA���O�t���ŁA�p�����[�^�����ꂽ�t�B���^�ł��B
- �����Hibernate�Z�b�V�������ƂɗL���������ւ����܂��B
+ Hibernate3では「可視性」ルールに基づいてデータを扱うための画期的な方法を用意しています。
+ <emphasis>Hibernate filter</emphasis> はグローバルで、名前付きで、パラメータ化されたフィルタです。
+ これはHibernateセッションごとに有効無効を切り替えられます。
</para>
<sect1 id="objectstate-filters">
- <title>Hibernate�̃t�B���^</title>
+ <title>Hibernateのフィルタ</title>
<para>
- Hibernate3�̓t�B���^�N���C�e���A���炩���ߒ�`���A
- �����̃t�B���^��N���X��R���N�V�������x���ɉ�����@�\������܂����B
- �t�B���^�N���C�e���A�͐���߂��`����@�\�ł��B
- �����̃t�B���^���̓p�����[�^���ł���Ƃ������Ƃ����A
- �N���X�₳�܂��܂ȃR���N�V�����v�f�ŗ��p�\�Ȣwhere���ɔ��ɂ悭���Ă��܂��B
- �A�v���P�[�V�����́A�^����ꂽ�t�B���^��\�ɂ��ׂ����A
- �����Ă��̃p�����[�^�l���ɂ��ׂ�������s���Ɍ��肷�邱�Ƃ��ł��܂��B
-
�t�B���^�̓f�[�^�x�[�X�r���[�̂悤�Ɏg�p����܂����A�A�v���P�[�V������ł̓p�����[�^������܂��B
+ Hibernate3はフィルタクライテリアをあらかじめ定義し、
+ これらのフィルタをクラスやコレクションレベルに加える機能を加えました。
+ フィルタクライテリアは制約節を定義する機能です。
+ これらのフィルタ条件はパラメータ化できるということを除き、
+ クラスやさまざまなコレクション要素で利用可能な「where」句に非常によく似ています。
+ アプリケーションは、与えられたフィルタを可能にすべきか、
+ そしてそのパラメータ値を何にすべきかを実行時に決定することができます。
+ フィルタはデータベースビューのように使用されますが、アプリケーション内ではパラメータ化されます。
</para>
<para>
- �t�B���^��g�����߂ɂ͂܂��A�K�ȃ}�b�s���O�v�f�ɒ�`�A�lj����Ȃ��Ă͂Ȃ�܂���B
- �t�B���^���`���邽�߂ɂ́A
- <literal><hibernate-mapping/></literal> �v�f���
<literal><filter-def/></literal> �v�f��g�p���܂��B�F
+ フィルタを使うためにはまず、適切なマッピング要素に定義、追加しなくてはなりません。
+ フィルタを定義するためには、
+ <literal><hibernate-mapping/></literal> 要素内で
<literal><filter-def/></literal> 要素を使用します。:
</para>
<programlisting><![CDATA[<filter-def name="myFilter">
@@ -34,7 +36,7 @@
</filter-def>]]></programlisting>
<para>
- �������ăt�B���^�̓N���X�ւƌ��ѕt�����܂��B�F
+ そうしてフィルタはクラスへと結び付けられます。:
</para>
<programlisting><![CDATA[<class name="myClass" ...>
@@ -43,7 +45,7 @@
</class>]]></programlisting>
<para>
- �܂��A�R���N�V�����ɑ��Ă͎��̂悤�ɂȂ�܂��B�F
+ また、コレクションに対しては次のようになります。:
</para>
<programlisting><![CDATA[<set ...>
@@ -51,27 +53,27 @@
</set>]]></programlisting>
<para>
- �ǂ���ɑ��Ă�(�܂��A���ꂼ���)�����ɐݒ肷�邱�Ƃ�ł��܂��B
+ どちらに対しても(また、それぞれを複数)同時に設定することもできます。
</para>
<para>
- <literal>Session</literal> ��̃��\�b�h��
<literal>enableFilter(String filterName)</literal>,
- <literal>getEnabledFilter(String filterName)</literal>,
<literal>disableFilter(String filterName)</literal> �ł��B
- �f�t�H���g�ł́A�t�B���^�͗^����ꂽ�Z�b�V�����ɑ��Ďg�p
<emphasis>�ł��܂���</emphasis> �B
- <literal>Filter</literal> �C���X�^���X��Ԃ�l�Ƃ���
<literal>Session.enabledFilter()</literal> ���\�b�h��g�����ƂŁA
- �t�B���^�͖����I�Ɏg�p�\�ƂȂ�܂��B
- ��Œ�`�����P���ȃt�B���^�̎g�p�́A���̂悤�ɂȂ�܂��B�F
+ <literal>Session</literal> 上のメソッドは
<literal>enableFilter(String filterName)</literal>,
+ <literal>getEnabledFilter(String filterName)</literal>,
<literal>disableFilter(String filterName)</literal> です。
+ デフォルトでは、フィルタは与えられたセッションに対して使用 <emphasis>できません</emphasis> 。
+ <literal>Filter</literal> インスタンスを返り値とする
<literal>Session.enabledFilter()</literal> メソッドを使うことで、
+ フィルタは明示的に使用可能となります。
+ 上で定義した単純なフィルタの使用は、このようになります。:
</para>
<programlisting><![CDATA[session.enableFilter("myFilter").setParameter("myFilterParam",
"some-value");]]></programlisting>
<para>
- org.hibernate.Filter�C���^�[�t�F�C�X�̃��\�b�h�́A
- Hibernate�̑����ɋ��ʂ��Ă��郁�\�b�h�A�������Ă��邱�Ƃɒ��ӂ��Ă��������B
+ org.hibernate.Filterインターフェイスのメソッドは、
+ Hibernateの多くに共通しているメソッド連鎖を許していることに注意してください。
</para>
<para>
- �L���ȃ��R�[�h�f�[�^�p�^�[�����ꎞ�f�[�^��g�������S�ȗ�ł��F
+ 有効なレコードデータパターンを持つ一時データを使った完全な例です:
</para>
<programlisting><![CDATA[<filter-def
name="effectiveDate">
@@ -105,8 +107,8 @@
</class>]]></programlisting>
<para>
- ��Ɍ��݂̗L�����R�[�h��ԋp���邱�Ƃ�ۏ��邽�߂ɁA
- �P���ɁA�Ј��f�[�^�̌������O�ɃZ�b�V������̃t�B���^��L���ɂ��܂��B
+ 常に現在の有効レコードを返却することを保証するために、
+ 単純に、社員データの検索より前にセッション上のフィルタを有効にします。
</para>
@@ -119,16 +121,16 @@
]]></programlisting>
<para>
- ��L��HQL�ł́A���ʂ̋����̐���ɂ��Ė����I�ɐG�ꂽ�����ł����A
-
�L���ɂȂ��Ă���t�B���^�̂������ŁA���̃N�G���͋�����100���h���ȏ�̌���̎Ј�������Ԃ��܂��B
+ 上記のHQLでは、結果の給料の制約について明示的に触れただけですが、
+ 有効になっているフィルタのおかげで、このクエリは給料が100万ドル以上の現役の社員だけを返します。
</para>
<para>
- (HQL�����[�h�t�F�b�`�Łj�O���������t�B���^��g�����Ȃ�A
- �����̕����ɒ��ӂ��Ă��������B
+ (HQLかロードフェッチで)外部結合を持つフィルタを使うつもりなら、
+ 条件式の方向に注意してください。
- ����͍��O�������̂��߂ɐݒ肷��̂��ł���S�ł��B
- ��ʓI�ɁA���Z�q�̌�J�������ɑ����čŏ��̃p�����[�^��z�u���Ă��������B
+ これは左外部結合のために設定するのが最も安全です。
+ 一般的に、演算子の後カラム名に続けて最初のパラメータを配置してください。
</para>
</sect1>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/inheritance_mapping.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/inheritance_mapping.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/inheritance_mapping.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,67 +1,69 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="inheritance">
- <title>�p���}�b�s���O</title>
+ <title>継承マッピング</title>
<sect1 id="inheritance-strategies" revision="3">
- <title>3�̐헪</title>
+ <title>3つの戦略</title>
<para>
- Hibernate��3�̊�{�I�Ȍp���̃}�b�s���O�헪��T�|�[�g���܂��B
+ Hibernateは3つの基本的な継承のマッピング戦略をサポートします。
</para>
<itemizedlist>
<listitem>
<para>
- �N���X�K�w���Ƃ̃e�[�u���itable-per-class-hierarchy�j
+ クラス階層ごとのテーブル(table-per-class-hierarchy)
</para>
</listitem>
<listitem>
<para>
- �T�u�N���X���Ƃ̃e�[�u���itable-per-subclass�j
+ サブクラスごとのテーブル(table-per-subclass)
</para>
</listitem>
<listitem>
<para>
- ��ۃN���X���Ƃ̃e�[�u���itable-per-concrete-class�j
+ 具象クラスごとのテーブル(table-per-concrete-class)
</para>
</listitem>
</itemizedlist>
<para>
- ������4�ڂɁAHibernate�͂킸���ɈقȂ鐫���������|�����[�t�B�Y����T�|�[�g���܂��B
+ 加えて4つ目に、Hibernateはわずかに異なる性質を持ったポリモーフィズムをサポートします。
</para>
<itemizedlist>
<listitem>
<para>
- �ÖٓI�|�����[�t�B�Y��
+ 暗黙的ポリモーフィズム
</para>
</listitem>
</itemizedlist>
<para>
- ����̌p���K�w�̈قȂ�u�����`�ɑ��ĈقȂ�}�b�s���O�헪��g�����Ƃ��ł��܂��B
-
���̏ꍇ�ɂ͑S�̂̊K�w�ɓn��|�����[�t�B�Y����������邽�߂ɈÖٓI�|�����[�t�B�Y����g�p���܂��B
- �������AHibernate�͓������[�g
<literal><class></literal> �v�f���
- <literal><subclass></literal>
�}�b�s���O�A<literal><joined-subclass></literal> �}�b�s���O�A
- <literal><union-subclass></literal>
�}�b�s���O�̓����g�p��T�|�[�g���Ă��܂���B
- <literal><subclass></literal> �v�f��
<literal><join></literal> �v�f��g�ݍ��킹�邱�ƂŁA
- ���� <literal><class></literal> �v�f��ł�
table-per-hierarchy �헪��
- table-per-subclass �헪�̓����g�p�͉\�ł��B���̗���Ă��������B
+ 同一の継承階層の異なるブランチに対して異なるマッピング戦略を使うことができます。
+ その場合には全体の階層に渡るポリモーフィズムを実現するために暗黙的ポリモーフィズムを使用します。
+ しかし、Hibernateは同じルート <literal><class></literal>
要素内で
+ <literal><subclass></literal>
マッピング、<literal><joined-subclass></literal> マッピング、
+ <literal><union-subclass></literal>
マッピングの同時使用をサポートしていません。
+ <literal><subclass></literal> 要素と
<literal><join></literal> 要素を組み合わせることで、
+ 同一 <literal><class></literal> 要素内での
table-per-hierarchy 戦略と
+ table-per-subclass 戦略の同時使用は可能です。次の例を見てください。
</para>
<para>
- <literal>subclass</literal>,
<literal>union-subclass</literal> ��
- <literal>joined-subclass</literal>
�}�b�s���O���̃}�b�s���O�h�L�������g�ɒ�`���邱�Ƃ��o���A
- <literal>hibernate-mapping</literal> �̒����ɔz�u���܂��B
- ����͐V�����}�b�s���O�t�@�C����lj����邾���ŁA�N���X�K�w��g���ł���Ƃ������Ƃł��B
- ���炩���߃}�b�v�����X�[�p�[�N���X��w�肵�āA�T�u�N���X�}�b�s���O��
<literal>extends</literal>
- ������L�q���Ȃ���Ȃ�܂���B
- ���ӁF���̓����ɂ��A�ȑO�̓}�b�s���O�E�h�L�������g�̏��Ԃ��d�v�ł����B
-
Hibernate3����́Aextends�L�[���[�h��g���ꍇ�A�}�b�s���O�h�L�������g�̏��Ԃ͖��ɂȂ�܂���B
+ <literal>subclass</literal>,
<literal>union-subclass</literal> と
+ <literal>joined-subclass</literal>
マッピングを複数のマッピングドキュメントに定義することが出来、
+ <literal>hibernate-mapping</literal> の直下に配置します。
+ これは新しいマッピングファイルを追加するだけで、クラス階層を拡張できるということです。
+ あらかじめマップしたスーパークラスを指定して、サブクラスマッピングに <literal>extends</literal>
+ 属性を記述しなければなりません。
+ 注意:この特徴により、以前はマッピング・ドキュメントの順番が重要でした。
+ Hibernate3からは、extendsキーワードを使う場合、マッピングドキュメントの順番は問題になりません。
- �P�̃}�b�s���O�t�@�C����ŏ��ԕt����s���Ƃ��́A
- �ˑR�Ƃ��āA�T�u�N���X���`����O�ɃX�[�p�[�N���X���`����K�v������܂��B)
+ 1つのマッピングファイル内で順番付けを行うときは、
+ 依然として、サブクラスを定義する前にスーパークラスを定義する必要があります。)
</para>
<programlisting><![CDATA[
@@ -73,13 +75,13 @@
<sect2 id="inheritance-tableperclass" >
- <title>�N���X�K�w���Ƃ̃e�[�u���itable-per-class-hierarchy�j</title>
+ <title>クラス階層ごとのテーブル(table-per-class-hierarchy)</title>
<para>
- �Ⴆ�A�C���^�[�t�F�C�X <literal>Payment</literal> �ƁA������������
-
<literal>CreditCardPayment</literal>�A<literal>CashPayment</literal>�A
- <literal>ChequePayment</literal>
������Ƃ��܂��B�K�w���Ƃ̃e�[�u���}�b�s���O��
- �ȉ��̂悤�ɂȂ�܂��B
+ 例えば、インターフェイス <literal>Payment</literal> と、それを実装した
+
<literal>CreditCardPayment</literal>、<literal>CashPayment</literal>、
+ <literal>ChequePayment</literal> があるとします。階層ごとのテーブルマッピングは
+ 以下のようになります。
</para>
<programlisting><![CDATA[<class name="Payment"
table="PAYMENT">
@@ -102,19 +104,19 @@
</class>]]></programlisting>
<para>
- ���傤�Lj�̃e�[�u�����K�v�ł��B
- ���̃}�b�s���O�헪�ɂ͈�傫�Ȑ���������܂��B
- <literal>CCTYPE</literal> �̂悤�ȁA�T�u�N���X�Ő錾���ꂽ�J������
<literal>NOT NULL</literal>
- ������Ă܂���B
+ ちょうど一つのテーブルが必要です。
+ このマッピング戦略には一つ大きな制限があります。
+ <literal>CCTYPE</literal> のような、サブクラスで宣言されたカラムは <literal>NOT
NULL</literal>
+ 制約を持てません。
</para>
</sect2>
<sect2 id="inheritance-tablepersubclass">
- <title>�T�u�N���X���Ƃ̃e�[�u���itable-per-subclass�j</title>
+ <title>サブクラスごとのテーブル(table-per-subclass)</title>
<para>
- table-per-subclass �}�b�s���O�͈ȉ��̂悤�ɂȂ�܂��B
+ table-per-subclass マッピングは以下のようになります。
</para>
<programlisting><![CDATA[<class name="Payment"
table="PAYMENT">
@@ -139,24 +141,24 @@
</class>]]></programlisting>
<para>
- ���̃}�b�s���O�ɂ�4�̃e�[�u�����K�v�ł��B3�̃T�u�N���X�e�[�u����
- �X�[�p�[�N���X�e�[�u���Ƃ̊֘A������L�[�����Ă��܂�
- �i���ہA�W���f����͈�Έ�֘A�ł��j�B
+ このマッピングには4つのテーブルが必要です。3つのサブクラステーブルは
+ スーパークラステーブルとの関連を示す主キーを持っています
+ (実際、関係モデル上は一対一関連です)。
</para>
</sect2>
<sect2 id="inheritance-tablepersubclass-discriminator"
revision="2">
- <title>�ٕʎq��p���� table-per-subclass</title>
+ <title>弁別子を用いた table-per-subclass</title>
<para>
- Hibernate�� table-per-subclass
�����́Adiscriminator�J������K�v�Ƃ��Ȃ����Ƃ�o���Ă����Ă��������B
- Hibernate�ȊO��O/R�}�b�p�[�́Atable-per-subclass �ɈقȂ������p���܂��B
- ����́A�X�[�p�[�N���X�̃e�[�u���Ƀ^�C�vdiscriminator�J������K�v�Ƃ��܂��B
- ���̃A�v���[�`�͎���������ɂȂ�܂����A�W�̎��_���猩��ƁA��萳�m�Ȃ�̂ł��B
- table-per-subclass �헪��discriminator�J������g��������A
- <literal><subclass></literal> ��
<literal><join></literal>
- ��ȉ��̂悤�ɑg�ݍ��킹�Ďg���Ă��������B
+ Hibernateの table-per-subclass 実装は、discriminatorカラムを必要としないことを覚えておいてください。
+ Hibernate以外のO/Rマッパーは、table-per-subclass に異なる実装を用います。
+ それは、スーパークラスのテーブルにタイプdiscriminatorカラムを必要とします。
+ このアプローチは実装が困難になりますが、関係の視点から見ると、より正確なものです。
+ table-per-subclass 戦略でdiscriminatorカラムを使いたければ、
+ <literal><subclass></literal> と
<literal><join></literal>
+ を以下のように組み合わせて使ってください。
</para>
<programlisting><![CDATA[<class name="Payment"
table="PAYMENT">
@@ -188,19 +190,19 @@
</class>]]></programlisting>
<para>
- �I�v�V������ <literal>fetch="select"</literal> �錾�́A
- �X�[�p�[�N���X�̃N�G�����s���ɊO��������g���āA
- �T�u�N���X�� <literal>ChequePayment</literal>
�f�[�^��擾���Ȃ��悤�Ɏw�肷�邽�߂̂�̂ł��B
+ オプションの <literal>fetch="select"</literal> 宣言は、
+ スーパークラスのクエリ実行時に外部結合を使って、
+ サブクラスの <literal>ChequePayment</literal> データを取得しないように指定するためのものです。
</para>
</sect2>
<sect2 id="inheritance-mixing-tableperclass-tablepersubclass">
- <title>table-per-subclass �� table-per-class-hierarchy �̍���</title>
+ <title>table-per-subclass と table-per-class-hierarchy の混合</title>
<para>
- ���̃A�v���[�`��g�p����ƁAtable-per-hierarchy �� table-per-subclass �헪��
- �g�ݍ��킹�鎖��\�ł��B
+ このアプローチを使用すると、table-per-hierarchy と table-per-subclass 戦略を
+ 組み合わせる事も可能です。
</para>
<programlisting><![CDATA[<class name="Payment"
table="PAYMENT">
@@ -225,8 +227,8 @@
</class>]]></programlisting>
<para>
- ������̃}�b�s���O�헪�ł����Ă�A���[�g�ł��� <literal>Payment</literal>
�N���X�ւ�
- �|�����[�t�B�b�N�Ȋ֘A��
<literal><many-to-one></literal> ��g���ă}�b�s���O���܂��B
+ いずれのマッピング戦略であっても、ルートである <literal>Payment</literal> クラスへの
+ ポリモーフィックな関連は <literal><many-to-one></literal>
を使ってマッピングします。
</para>
<programlisting><![CDATA[<many-to-one name="payment"
column="PAYMENT_ID" class="Payment"/>]]></programlisting>
@@ -234,11 +236,11 @@
</sect2>
<sect2 id="inheritance-tableperconcrete" revision="2">
- <title>��ۃN���X���Ƃ̃e�[�u���itable-per-concrete-class�j</title>
+ <title>具象クラスごとのテーブル(table-per-concrete-class)</title>
<para>
- table-per-concrete-class �헪�̃}�b�s���O�ɑ���A�v���[�`�́A2����܂��B
- 1�ڂ� <literal><union-subclass></literal>
�𗘗p������@�ł��B
+ table-per-concrete-class 戦略のマッピングに対するアプローチは、2つあります。
+ 1つ目は <literal><union-subclass></literal>
を利用する方法です。
</para>
<programlisting><![CDATA[<class name="Payment">
@@ -260,32 +262,32 @@
</class>]]></programlisting>
<para>
- �T�u�N���X���Ƃ�3�̃e�[�u�����K�v�ł��B���ꂼ��̃e�[�u���́A�p���v���p�e�B��܂A
- �N���X�̑S�Ẵv���p�e�B�ɑ���J�������`���܂��B
+ サブクラスごとに3つのテーブルが必要です。それぞれのテーブルは、継承プロパティを含んだ、
+ クラスの全てのプロパティに対するカラムを定義します。
</para>
<para>
- ���̃A�v���[�`�ɂ͐���������܂��B
- ����́A�v���p�e�B���X�[�p�[�N���X�Ƀ}�b�s���O����Ă����ꍇ�A
- �S�ẴT�u�N���X�ɂ����ăJ�������������łȂ���Ȃ�Ȃ��Ƃ�����̂ł��B
- �iHibernate�̍���̃����[�X�Ŋɘa����邩�����܂���j�B
- <union-subclass> ��g���� table-per-concrete-class
�헪�ł͎��ʎq�����헪��g�p�ł��܂���B
- ��L�[�����邽�߂̃V�[�h�́A�S�Ă� union subclass �̊K�w��ŋ��L����K�v�����邩��ł��B
+ このアプローチには制限があります。
+ それは、プロパティがスーパークラスにマッピングされていた場合、
+ 全てのサブクラスにおいてカラム名が同じでなければならないというものです。
+ (Hibernateの今後のリリースで緩和されるかもしれません)。
+ <union-subclass> を使った table-per-concrete-class
戦略では識別子生成戦略を使用できません。
+ 主キーを生成するためのシードは、全ての union subclass の階層内で共有する必要があるからです。
</para>
<para>
-
����X�[�p�[�N���X�����ۃN���X�Ȃ�A<literal>abstract="true"</literal>�ƃ}�b�s���O���܂��B
- ������A�X�[�p�[�N���X�����ۃN���X�łȂ��Ȃ�A�X�[�p�[�N���X�̃C���X�^���X��
- �ێ����邽�߂̃e�[�u���̒lj����K�v�ƂȂ�܂�(��̗�ł̃f�t�H���g��
<literal>PAYMENT</literal> )�B
+
もしスーパークラスが抽象クラスなら、<literal>abstract="true"</literal>とマッピングします。
+ もちろん、スーパークラスが抽象クラスでないなら、スーパークラスのインスタンスを
+ 保持するためのテーブルの追加が必要となります(上の例でのデフォルトは <literal>PAYMENT</literal> )。
</para>
</sect2>
<sect2 id="inheritance-tableperconcreate-polymorphism">
- <title>�ÖٓI�|�����[�t�B�Y����p���� table-per-concrete-class</title>
+ <title>暗黙的ポリモーフィズムを用いた table-per-concrete-class</title>
<para>
- �����̃A�v���[�`�͈ÖٓI�|�����[�t�B�Y���̎g�p�ł��B
+ もう一つのアプローチは暗黙的ポリモーフィズムの使用です。
</para>
<programlisting><![CDATA[<class name="CreditCardPayment"
table="CREDIT_PAYMENT">
@@ -313,21 +315,21 @@
</class>]]></programlisting>
<para>
- <literal>Payment</literal>
�C���^�[�t�F�C�X���ǂ��ɂ�����I�Ɏ�����Ă��Ȃ����Ƃɒ��ӂ��Ă��������B
- �����āA<literal>Payment</literal>
�v���p�e�B�����ꂼ��̃T�u�N���X�Ƀ}�b�s���O����Ă��邱�Ƃɂ���ӂ��Ă��������B
- ����d����������̂ł���AXML�G���e�B�e�B�̗��p��l���Ă��������B
- �i��F <literal>DOCTYPE</literal> �錾�ɂ����� <literal>[
<!ENTITY allproperties SYSTEM "allproperties.xml">
]</literal>
- �ƁA�}�b�s���O�ɂ�����
<literal>&allproperties;</literal>�j
+ <literal>Payment</literal> インターフェイスがどこにも明示的に示されていないことに注意してください。
+ そして、<literal>Payment</literal>
プロパティがそれぞれのサブクラスにマッピングされていることにも注意してください。
+ もし重複を避けたいのであれば、XMLエンティティの利用を考えてください。
+ (例: <literal>DOCTYPE</literal> 宣言における <literal>[
<!ENTITY allproperties SYSTEM "allproperties.xml">
]</literal>
+ と、マッピングにおける <literal>&allproperties;</literal>)
</para>
<para>
- ���̃A�v���[�`�̌��_�́AHibernate���|�����[�t�B�b�N�ȃN�G���̎��s����SQL
<literal>UNION</literal>
- �����Ȃ��_�ł��B
+ このアプローチの欠点は、Hibernateがポリモーフィックなクエリの実行時にSQL
<literal>UNION</literal>
+ を生成しない点です。
</para>
<para>
- ���̃}�b�s���O�헪�ɑ��ẮA<literal>Payment</literal>
�ւ̃|�����[�t�B�b�N�Ȋ֘A��
- �ʏ�A<literal><any></literal>
��g���ă}�b�s���O����܂��B
+ このマッピング戦略に対しては、<literal>Payment</literal> へのポリモーフィックな関連は
+ 通常、<literal><any></literal> を使ってマッピングされます。
</para>
<programlisting><![CDATA[<any name="payment"
meta-type="string" id-type="long">
@@ -341,15 +343,15 @@
</sect2>
<sect2 id="inheritace-mixingpolymorphism">
- <title>���̌p���}�b�s���O�ƈÖٓI�|�����[�t�B�Y���̑g�ݍ��킹</title>
+ <title>他の継承マッピングと暗黙的ポリモーフィズムの組み合わせ</title>
<para>
- ���̃}�b�s���O�ɂ��Ă̍X�Ȃ钍�ӓ_������܂��B
- �T�u�N���X�����g�� <literal><class></literal>
�v�f�Ƃ��ă}�b�s���O���Ă���̂ŁA
- �i���� <literal>Payment</literal> �͒P�Ȃ�C���^�[�t�F�C�X�Ȃ̂Łj�A
- ���ꂼ��̃T�u�N���X�͊ȒP�ɂ��̑��̌p���K�w�̈ꕔ�ƂȂ�܂��B
- �i������A���܂łǂ��� <literal>Payment</literal>
�C���^�[�t�F�C�X�ɑ���|�����[�t�B�b�N�ȃN�G��
- ��g�p���邱�Ƃ��ł��܂��j
+ このマッピングについての更なる注意点があります。
+ サブクラスが自身を <literal><class></literal>
要素としてマッピングしているので、
+ (かつ <literal>Payment</literal> は単なるインターフェイスなので)、
+ それぞれのサブクラスは簡単にその他の継承階層の一部となります。
+ (しかも、今までどおり <literal>Payment</literal> インターフェイスに対するポリモーフィックなクエリ
+ を使用することができます)
</para>
<programlisting><![CDATA[<class name="CreditCardPayment"
table="CREDIT_PAYMENT">
@@ -381,14 +383,14 @@
</class>]]></programlisting>
<para>
- �����x�q�ׂ܂����A<literal>Payment</literal> �͖����I�ɒ�`����܂���B
- ����A<literal>Payment</literal>
�C���^�[�t�F�C�X�ɑ��ăN�G������s����Ȃ�
- �i�Ⴆ�� <literal>from Payment</literal> �߂�g���āj�A
- Hibernate�͎����I�� <literal>CreditCardPayment</literal>
- �i��CreditCardPayment�̃T�u�N���X�A<literal>Payment</literal>
�̎����ł��邽�߁j�A
- ����сA<literal>CashPayment</literal>
�A<literal>ChequePayment</literal>
- �̃C���X�^���X��Ԃ��܂��B
- <literal>NonelectronicTransaction</literal>
�C���X�^���X�͕Ԃ��܂���B
+ もう一度述べますが、<literal>Payment</literal> は明示的に定義されません。
+ もし、<literal>Payment</literal> インターフェイスに対してクエリを実行するなら
+ (例えば <literal>from Payment</literal> 節を使って)、
+ Hibernateは自動的に <literal>CreditCardPayment</literal>
+ (とCreditCardPaymentのサブクラス、<literal>Payment</literal> の実装であるため)、
+ および、<literal>CashPayment</literal>
、<literal>ChequePayment</literal>
+ のインスタンスを返します。
+ <literal>NonelectronicTransaction</literal> インスタンスは返しません。
</para>
</sect2>
@@ -396,21 +398,21 @@
</sect1>
<sect1 id="inheritance-limitations">
- <title>����</title>
+ <title>制限</title>
<para>
- table-per-concrete-class �}�b�s���O�헪�ւ́u�ÖٓI�|�����[�t�B�Y���v�A�v���[�`�ɂ�
-
�������̐���������܂��B<literal><union-subclass></literal>
�}�b�s���O�ɑ��Ă�
- ������߂̐���������܂��B
+ table-per-concrete-class マッピング戦略への「暗黙的ポリモーフィズム」アプローチには
+ いくつかの制限があります。<literal><union-subclass></literal>
マッピングに対しても
+ 少し弱めの制限があります。
</para>
<para>
- ���̃e�[�u���ɁAHibernate�ɂ�����table-per-concrete-class�}�b�s���O��
- ������ÖٓI�|�����[�t�B�Y���̐��������܂��B
+ 次のテーブルに、Hibernateにおけるtable-per-concrete-classマッピングの
+ 制限や暗黙的ポリモーフィズムの制限を示します。
</para>
<table frame="topbot">
- <title>�p���}�b�s���O�̋@�\</title>
+ <title>継承マッピングの機能</title>
<tgroup cols='8' align='left' colsep='1'
rowsep='1'>
<colspec colname='c1' colwidth="1*"/>
<colspec colname='c2' colwidth="1*"/>
@@ -422,15 +424,15 @@
<colspec colname='c8' colwidth="1*"/>
<thead>
<row>
- <entry>�p���헪</entry>
- <entry>���Έ�̃|�����[�t�B�Y��</entry>
- <entry>��Έ�̃|�����[�t�B�Y��</entry>
- <entry>��Α��̃|�����[�t�B�Y��</entry>
- <entry>���Α��̃|�����[�t�B�Y��</entry>
-
<entry>�|�����[�t�B�Y����g����<literal>load()/get()</literal></entry>
- <entry>�|�����[�t�B�Y����g�����N�G��</entry>
- <entry>�|�����[�t�B�Y����g��������</entry>
- <entry>�O�������ɂ��t�F�b�`</entry>
+ <entry>継承戦略</entry>
+ <entry>多対一のポリモーフィズム</entry>
+ <entry>一対一のポリモーフィズム</entry>
+ <entry>一対多のポリモーフィズム</entry>
+ <entry>多対多のポリモーフィズム</entry>
+
<entry>ポリモーフィズムを使った<literal>load()/get()</literal></entry>
+ <entry>ポリモーフィズムを使ったクエリ</entry>
+ <entry>ポリモーフィズムを使った結合</entry>
+ <entry>外部結合によるフェッチ</entry>
</row>
</thead>
<tbody>
@@ -443,7 +445,7 @@
<entry><literal>s.get(Payment.class,
id)</literal></entry>
<entry><literal>from Payment p</literal></entry>
<entry><literal>from Order o join o.payment
p</literal></entry>
- <entry><emphasis>�T�|�[�g</emphasis></entry>
+ <entry><emphasis>サポート</emphasis></entry>
</row>
<row>
<entry>table per subclass</entry>
@@ -454,7 +456,7 @@
<entry><literal>s.get(Payment.class,
id)</literal></entry>
<entry><literal>from Payment p</literal></entry>
<entry><literal>from Order o join o.payment
p</literal></entry>
- <entry><emphasis>�T�|�[�g</emphasis></entry>
+ <entry><emphasis>サポート</emphasis></entry>
</row>
<row>
<entry>table per concrete-class (union-subclass)</entry>
@@ -465,18 +467,18 @@
<entry><literal>s.get(Payment.class,
id)</literal></entry>
<entry><literal>from Payment p</literal></entry>
<entry><literal>from Order o join o.payment
p</literal></entry>
- <entry><emphasis>�T�|�[�g</emphasis></entry>
+ <entry><emphasis>サポート</emphasis></entry>
</row>
<row>
<entry>table per concrete class (implicit
polymorphism)</entry>
<entry><literal><any></literal></entry>
-
<entry><emphasis>�T�|�[�g���Ă��܂���</emphasis></entry>
-
<entry><emphasis>�T�|�[�g���Ă��܂���</emphasis></entry>
+ <entry><emphasis>サポートしていません</emphasis></entry>
+ <entry><emphasis>サポートしていません</emphasis></entry>
<entry><literal><many-to-any></literal></entry>
<entry><literal>s.createCriteria(Payment.class).add(
Restrictions.idEq(id) ).uniqueResult()</literal></entry>
<entry><literal>from Payment p</literal></entry>
-
<entry><emphasis>�T�|�[�g���Ă��܂���</emphasis></entry>
-
<entry><emphasis>�T�|�[�g���Ă��܂���</emphasis></entry>
+ <entry><emphasis>サポートしていません</emphasis></entry>
+ <entry><emphasis>サポートしていません</emphasis></entry>
</row>
</tbody>
</tgroup>
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/performance.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/performance.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/performance.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,133 +1,135 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="performance">
- <title>�p�t�H�[�}���X�̉��P</title>
+ <title>パフォーマンスの改善</title>
<sect1 id="performance-fetching" revision="2">
- <title>�t�F�b�`�헪</title>
+ <title>フェッチ戦略</title>
<para>
- <emphasis>�t�F�b�`�헪</emphasis>
�́A�A�v���P�[�V�������֘A��i�r�Q�[�g����K�v������
-
�Ƃ��ɁAHibernate���֘A�I�u�W�F�N�g�����邽�߂Ɏg�p����헪�ł��B�t�F�b�`�헪��O/R�}�b�s���O��
- ���^�f�[�^�ɐ錾���邩�A�����HQL�A <literal>Criteria</literal>
�N�G���ŃI�[�o�[���C�h���܂��B
+ <emphasis>フェッチ戦略</emphasis> は、アプリケーションが関連をナビゲートする必要がある
+ ときに、Hibernateが関連オブジェクトを復元するために使用する戦略です。フェッチ戦略はO/Rマッピングの
+ メタデータに宣言するか、特定のHQL、 <literal>Criteria</literal> クエリでオーバーライドします。
</para>
<para>
- Hibernate3�͎��Ɏ����t�F�b�`�헪���`���Ă��܂��B
+ Hibernate3は次に示すフェッチ戦略を定義しています。
</para>
<itemizedlist>
<listitem>
<para>
- <emphasis>�����t�F�b�`</emphasis> - Hibernate��
<literal>OUTER JOIN</literal> ��g���āA
- �֘A����C���X�^���X��R���N�V������P��
<literal>SELECT</literal>
- �ŕ������܂��B
+ <emphasis>結合フェッチ</emphasis> - Hibernateは
<literal>OUTER JOIN</literal> を使って、
+ 関連するインスタンスやコレクションを1つの <literal>SELECT</literal>
+ で復元します。
</para>
</listitem>
<listitem>
<para>
- <emphasis>�Z���N�g�t�F�b�`</emphasis> - 2��ڂ�
<literal>SELECT</literal>
- �Ŋ֘A����G���e�B�e�B��R���N�V���������܂��B
<literal>lazy="false"</literal>
- �Ŗ����I�ɒx���t�F�b�`���ɂ��Ȃ���A����2��ڂ�select�͎��ۂ�
- �֘A�ɃA�N�Z�X�����Ƃ��̂ݎ��s�����ł��傤�B
+ <emphasis>セレクトフェッチ</emphasis> - 2回目の
<literal>SELECT</literal>
+ で関連するエンティティやコレクションを復元します。
<literal>lazy="false"</literal>
+ で明示的に遅延フェッチを無効にしなければ、この2回目のselectは実際に
+ 関連にアクセスしたときのみ実行されるでしょう。
</para>
</listitem>
<listitem>
<para>
- <emphasis>�T�u�Z���N�g�t�F�b�`</emphasis> - 2��ڂ�
<literal>SELECT</literal>
- �ŁA���O�̃N�G����t�F�b�`�ŕ����������ׂĂ̗v�f�Ɋ֘A����R���N�V������
- �������܂��B <literal>lazy="false"</literal>
- �Ŗ����I�ɒx���t�F�b�`���ɂ��Ȃ���A����2��ڂ�select�͎��ۂ�
- �֘A�ɃA�N�Z�X�����Ƃ��̂ݎ��s�����ł��傤�B
+ <emphasis>サブセレクトフェッチ</emphasis> - 2回目の
<literal>SELECT</literal>
+ で、直前のクエリやフェッチで復元したすべての要素に関連するコレクションを
+ 復元します。 <literal>lazy="false"</literal>
+ で明示的に遅延フェッチを無効にしなければ、この2回目のselectは実際に
+ 関連にアクセスしたときのみ実行されるでしょう。
</para>
</listitem>
<listitem>
<para>
- <emphasis>�o�b�`�t�F�b�`</emphasis> -
�Z���N�g�t�F�b�`�̂��߂̍œK�����ꂽ�헪
- - Hibernate�̓G���e�B�e�B�̃C���X�^���X��R���N�V�����̈�Q��1���
- <literal>SELECT</literal>
�ŕ������܂��B����͎�L�[��O���L�[�̃��X�g��w�肷�邱�Ƃ�
- �ɂ��s���܂��B
+ <emphasis>バッチフェッチ</emphasis> - セレクトフェッチのための最適化された戦略
+ - Hibernateはエンティティのインスタンスやコレクションの一群を1回の
+ <literal>SELECT</literal> で復元します。これは主キーや外部キーのリストを指定することに
+ により行います。
</para>
</listitem>
</itemizedlist>
<para>
- Hibernate�͎��Ɏ����헪�Ƃ��ʂ��܂��B
+ Hibernateは次に示す戦略とも区別をします。
</para>
<itemizedlist>
<listitem>
<para>
- <emphasis>�����t�F�b�`</emphasis> -
���L�҂̃I�u�W�F�N�g�����[�h���ꂽ�Ƃ��ɁA
- �֘A�A�R���N�V�����͑����Ƀt�F�b�`����܂��B
+ <emphasis>即時フェッチ</emphasis> - 所有者のオブジェクトがロードされたときに、
+ 関連、コレクションは即時にフェッチされます。
</para>
</listitem>
<listitem>
<para>
- <emphasis>�x���R���N�V�����t�F�b�`</emphasis> -
�A�v���P�[�V�������R���N�V������
- ���đ����s�����Ƃ��ɃR���N�V������t�F�b�`���܂��B
- (����̓R���N�V�����ɑ���f�t�H���g�̓���ł�)
+ <emphasis>遅延コレクションフェッチ</emphasis> - アプリケーションがコレクションに
+ 対して操作を行ったときにコレクションをフェッチします。
+ (これはコレクションに対するデフォルトの動作です)
</para>
</listitem>
<listitem>
<para>
-
<emphasis>"���ʂȒx��"�R���N�V�����t�F�b�`</emphasis> -
�R���N�V�����̗v�f
- �P�P���Ɨ����āA�K�v�ȂƂ��Ƀf�[�^�x�[�X����擾����܂��B
- Hibernate�͕K�v�Ȃ��Ȃ�A�R���N�V�����S�̂������Ƀt�F�b�`���邱�Ƃ�
- ���܂��i�ƂĂ�傫�ȃR���N�V�����ɓK���Ă��܂��j�B
+ <emphasis>"特別な遅延"コレクションフェッチ</emphasis> -
コレクションの要素
+ 1つ1つが独立して、必要なときにデータベースから取得されます。
+ Hibernateは必要ないならば、コレクション全体をメモリにフェッチすることは
+ 避けます(とても大きなコレクションに適しています)。
</para>
</listitem>
<listitem>
<para>
- <emphasis>�v���L�V�t�F�b�`</emphasis> -
�P��l�֘A�́A���ʎq��getter�ȊO��
- ���\�b�h���֘A�I�u�W�F�N�g�ŌĂяo�����Ƃ��Ƀt�F�b�`����܂��B
+ <emphasis>プロキシフェッチ</emphasis> - 単一値関連は、識別子のgetter以外の
+ メソッドが関連オブジェクトで呼び出されるときにフェッチされます。
</para>
</listitem>
<listitem>
<para>
- <emphasis>"�v���L�V�Ȃ�"�t�F�b�`</emphasis> -
�P��l�֘A�́A�C���X�^���X�ϐ���
- �A�N�Z�X���ꂽ�Ƃ��Ƀt�F�b�`����܂��B�v���L�V�t�F�b�`�Ɣ�r����ƁA���̕��@��
- �x���̓x���������Ȃ��i�֘A�͎��ʎq�ɃA�N�Z�X���������ł�t�F�b�`����܂��j
- �ł����A��蓧�ߓI�ŁA�A�v���P�[�V�����Ƀv���L�V�����݂��Ȃ��悤�Ɍ����܂��B
- ���̕��@�̓r���h���̃o�C�g�R�[�h�g�ݍ��݂��K�v�ɂȂ�A�g����ʂ͂܂�ł��B
+ <emphasis>"プロキシなし"フェッチ</emphasis> -
単一値関連は、インスタンス変数に
+ アクセスされたときにフェッチされます。プロキシフェッチと比較すると、この方法は
+ 遅延の度合いが少ない(関連は識別子にアクセスしただけでもフェッチされます)
+ ですが、より透過的で、アプリケーションにプロキシが存在しないように見せます。
+ この方法はビルド時のバイトコード組み込みが必要になり、使う場面はまれです。
</para>
</listitem>
<listitem>
<para>
- <emphasis>�x�������t�F�b�`</emphasis> -
������P��l�֘A�́A�C���X�^���X�ϐ��ɃA�N�Z�X����
- �Ƃ��Ƀt�F�b�`����܂��B���̕��@�̓r���h���̃o�C�g�R�[�h�g�ݍ��݂��K�v�ɂȂ�A
- �g����ʂ͂܂�ł��B
+ <emphasis>遅延属性フェッチ</emphasis> -
属性や単一値関連は、インスタンス変数にアクセスした
+ ときにフェッチされます。この方法はビルド時のバイトコード組み込みが必要になり、
+ 使う場面はまれです。
</para>
</listitem>
</itemizedlist>
<para>
- ��̒��s����T�O������܂�: <emphasis>����</emphasis>
�֘A��t�F�b�`���邩�A
- �����āA <emphasis>�ǂ������</emphasis>
�t�F�b�`���邩�i�ǂ��SQL��g���āj�B
- �����������Ȃ��ł��������I <literal>fetch</literal>
�̓p�t�H�[�}���X�`���[�j���O�Ɏg���܂��B
- <literal>lazy</literal>
�͂���N���X�̕������ꂽ�C���X�^���X�̂����A�ǂ̃f�[�^����
- �g�p�\�ɂ��邩�̎�茈�߂��`���܂��B
+ 二つの直行する概念があります: <emphasis>いつ</emphasis> 関連をフェッチするか、
+ そして、 <emphasis>どうやって</emphasis> フェッチするか(どんなSQLを使って)。
+ これらを混同しないでください! <literal>fetch</literal> はパフォーマンスチューニングに使います。
+ <literal>lazy</literal> はあるクラスの分離されたインスタンスのうち、どのデータを常に
+ 使用可能にするかの取り決めを定義します。
</para>
<sect2 id="performance-fetching-lazy">
- <title>�x���֘A�̓���</title>
+ <title>遅延関連の働き</title>
<para>
- �f�t�H���g�ł́AHibernate3�̓R���N�V�����ɑ��Ă͒x���Z���N�g�t�F�b�`��g���A
- �P��l�֘A�ɂ͒x���v���L�V�t�F�b�`��g���܂��B�����̃f�t�H���g����͂قڂ��ׂĂ�
- �A�v���P�[�V�����̂قڂ��ׂĂ̊֘A�ňӖ�������܂��B
+ デフォルトでは、Hibernate3はコレクションに対しては遅延セレクトフェッチを使い、
+ 単一値関連には遅延プロキシフェッチを使います。これらのデフォルト動作はほぼすべての
+ アプリケーションのほぼすべての関連で意味があります。
</para>
<para>
- <emphasis>��:</emphasis>
- <literal>hibernate.default_batch_fetch_size</literal>
��Z�b�g�����Ƃ��́AHibernate��
- �x���t�F�b�`�̂��߂̃o�b�`�t�F�b�`�œK����g���ł��傤
- �i���̍œK���͂��ׂ������x���ŗL���ɂ��邱�Ƃ�o���܂��j�B
+ <emphasis>注:</emphasis>
+ <literal>hibernate.default_batch_fetch_size</literal>
をセットしたときは、Hibernateは
+ 遅延フェッチのためのバッチフェッチ最適化を使うでしょう
+ (この最適化はより細かいレベルで有効にすることも出来ます)。
</para>
<para>
- �������A�x���t�F�b�`�͒m���Ă����Ȃ���Ȃ�Ȃ���̖�肪����܂��B
-
Hibernate��session��I�[�v�����Ă���R���e�L�X�g�̊O����x���֘A�ɃA�N�Z�X����ƁA
- ��O���������܂��B��F
+ しかし、遅延フェッチは知っておかなければならない一つの問題があります。
+ Hibernateのsessionをオープンしているコンテキストの外から遅延関連にアクセスすると、
+ 例外が発生します。例:
</para>
<programlisting><![CDATA[s = sessions.openSession();
@@ -143,38 +145,38 @@
Integer accessLevel = (Integer) permissions.get("accounts"); //
Error!]]></programlisting>
<para>
- <literal>Session</literal>
���N���[�Y���ꂽ�Ƃ��Apermissions�R���N�V������
- ����������Ă��Ȃ����߁A���̃R���N�V�����͎��g�̏�Ԃ��[�h�ł��܂���B
- <emphasis>Hibernate�͐藣���ꂽ�I�u�W�F�N�g�̒x���������̓T�|�[�g
- ���Ă��܂���</emphasis>
�B�C�����@�Ƃ��āA�R���N�V��������ǂݍ��݂�s���R�[�h��
- �g�����U�N�V������R�~�b�g���钼�O�Ɉړ������܂��B
+ <literal>Session</literal> がクローズされたとき、permissionsコレクションは
+ 初期化されていないため、このコレクションは自身の状態をロードできません。
+ <emphasis>Hibernateは切り離されたオブジェクトの遅延初期化はサポート
+ していません</emphasis> 。修正方法として、コレクションから読み込みを行うコードを
+ トランザクションをコミットする直前に移動させます。
</para>
<para>
- ����ŁA <literal>lazy="false"</literal>
��֘A�}�b�s���O�Ɏw�肷�邱�ƂŁA
- �x���������Ȃ��R���N�V������֘A��g�����Ƃ��o���܂��B
- �������Ȃ���A�x���������͂قڂ��ׂẴR���N�V������֘A�Ŏg���邱�Ƃ�
- �Ӑ}���Ă��܂��B������Ȃ��̃I�u�W�F�N�g���f���̒��ɒx���������Ȃ��֘A��
- ������`���Ă��܂��ƁAHibernate�͍ŏI�I�ɂ̓g�����U�N�V��������
- �قڊ��S�ȃf�[�^�x�[�X�������̒��Ƀt�F�b�`���邱�ƂɂȂ�ł��傤�I
+ 一方で、 <literal>lazy="false"</literal>
を関連マッピングに指定することで、
+ 遅延処理をしないコレクションや関連を使うことが出来ます。
+ しかしながら、遅延初期化はほぼすべてのコレクションや関連で使われることを
+ 意図しています。もしあなたのオブジェクトモデルの中に遅延処理をしない関連を
+ 多く定義してしまうと、Hibernateは最終的にはトランザクション毎に
+ ほぼ完全なデータベースをメモリの中にフェッチすることになるでしょう!
</para>
<para>
- �����ł́A����̃g�����U�N�V�����ɂ����ăZ���N�g�t�F�b�`�̑����
- �����t�F�b�`�i���R����͒x�������ł͂Ȃ��Ȃ�܂��j��I���������Ƃ�
- ���X����܂��B���ꂩ��t�F�b�`�헪��J�X�^�}�C�Y������@���������܂��B
- Hibernate3�ł́A�t�F�b�`�헪��I����d�g�݂͒P��l�֘A�ƃR���N�V������
- �ς��͂���܂���B
+ 他方では、特定のトランザクションにおいてセレクトフェッチの代わりに
+ 結合フェッチ(当然これは遅延処理ではなくなります)を選択したいことが
+ 時々あります。これからフェッチ戦略をカスタマイズする方法をお見せします。
+ Hibernate3では、フェッチ戦略を選択する仕組みは単一値関連とコレクションで
+ 変わりはありません。
</para>
</sect2>
<sect2 id="performance-fetching-custom" revision="4">
- <title>�t�F�b�`�헪�̃`���[�j���O</title>
+ <title>フェッチ戦略のチューニング</title>
<para>
- �Z���N�g�t�F�b�`�i�f�t�H���g�j��N+1�Z���N�g���Ƃ����傫�Ȏ�_�����邽�߁A
- �}�b�s���O��`�Ō����t�F�b�`��L���ɂ��邱�Ƃ��ł��܂��B
+ セレクトフェッチ(デフォルト)はN+1セレクト問題という大きな弱点があるため、
+ マッピング定義で結合フェッチを有効にすることができます。
</para>
<programlisting><![CDATA[<set name="permissions"
@@ -186,52 +188,52 @@
<programlisting><![CDATA[<many-to-one name="mother"
class="Cat" fetch="join"/>]]></programlisting>
<para>
- �}�b�s���O��`�Œ�`���� <literal>�t�F�b�`</literal>
�헪�͎��̂�̂ɉe�����܂��B
+ マッピング定義で定義した <literal>フェッチ</literal> 戦略は次のものに影響します。
</para>
<itemizedlist>
<listitem>
<para>
- <literal>get()</literal> ��
<literal>load()</literal> �ɂ�镜��
+ <literal>get()</literal> や
<literal>load()</literal> による復元
</para>
</listitem>
<listitem>
<para>
- �֘A�Ƀi�r�Q�[�g�����Ƃ��ɔ�������ÖٓI�ȕ���
+ 関連にナビゲートしたときに発生する暗黙的な復元
</para>
</listitem>
<listitem>
<para>
- <literal>Criteria</literal> �N�G��
+ <literal>Criteria</literal> クエリ
</para>
</listitem>
<listitem>
<para>
- <literal>�T�u�Z���N�g</literal> �t�F�b�`��g��HQL�N�G��
+ <literal>サブセレクト</literal> フェッチを使うHQLクエリ
</para>
</listitem>
</itemizedlist>
<para>
- ���Ƃ��ǂ�ȃt�F�b�`�헪��g�����Ƃ��Ă�A�x���ł͂Ȃ��O���t�̓������ɓǂݍ��܂�邱�Ƃ�
- �ۏ���܂��B�܂�A�����HQL�N�G������s���邽�߂ɂ�������SELECT�����������s�����
- ���Ƃ�����̂Œ��ӂ��Ă��������B
+ たとえどんなフェッチ戦略を使ったとしても、遅延ではないグラフはメモリに読み込まれることが
+ 保証されます。つまり、特定のHQLクエリを実行するためにいくつかのSELECT文が即時実行される
+ ことがあるので注意してください。
</para>
<para>
- �ʏ�́A�}�b�s���O��`�Ńt�F�b�`�̃J�X�^�}�C�Y�͍s���܂���B
- ����ɁA�f�t�H���g�̓���̂܂܂ɂ��Ă����āAHQL�� <literal>left join
fetch</literal> ��
- �w�肷�邱�Ƃœ���̃g�����U�N�V�����œ����I�[�o�[���C�h���܂��B
-
�����Hibernate�ɏ���̃Z���N�g�ŊO��������g���Ċ֘A���Ƀt�F�b�`����悤�Ɏw�肵�Ă��܂��B
- <literal>Criteria</literal> �N�G����API�ł́A
- <literal>setFetchMode(FetchMode.JOIN)</literal>
��g�����Ƃ��o���܂��B
+ 通常は、マッピング定義でフェッチのカスタマイズは行いません。
+ 代わりに、デフォルトの動作のままにしておいて、HQLで <literal>left join
fetch</literal> を
+ 指定することで特定のトランザクションで動作をオーバーライドします。
+ これはHibernateに初回のセレクトで外部結合を使って関連を先にフェッチするように指定しています。
+ <literal>Criteria</literal> クエリのAPIでは、
+ <literal>setFetchMode(FetchMode.JOIN)</literal> を使うことが出来ます。
</para>
<para>
- ��� <literal>get()</literal> ��
<literal>load()</literal> �Ŏg����
- �t�F�b�`�헪��ς������Ɗ������Ƃ��ɂ́A�P����
- <literal>Criteria</literal> �N�G����g�����������B��F
+ もし <literal>get()</literal> や
<literal>load()</literal> で使われる
+ フェッチ戦略を変えたいと感じたときには、単純に
+ <literal>Criteria</literal> クエリを使ってください。例:
</para>
<programlisting><![CDATA[User user = (User)
session.createCriteria(User.class)
@@ -240,42 +242,42 @@
.uniqueResult();]]></programlisting>
<para>
- �i����͂�������ORM�\�����[�V������"fetch
plan"�ƌĂ�ł����̂Ɠ����ł��B�j
+ (これはいくつかのORMソリューションが"fetch plan"と呼んでいるものと同じです。)
</para>
<para>
- N+1�Z���N�g������邽�߂̂܂������Ⴄ���@�́A��2���x���L���b�V����g�����Ƃł��B
+ N+1セレクト問題を避けるためのまったく違う方法は、第2レベルキャッシュを使うことです。
</para>
</sect2>
<sect2 id="performance-fetching-proxies" revision="2">
- <title>�P��[�֘A�v���L�V</title>
+ <title>単一端関連プロキシ</title>
<para>
- �R���N�V�����̒x���t�F�b�`�́AHibernate���g�̎����ɂ��i���R���N�V������g����
- �������Ă��܂��B�������A�P��[�֘A�ɂ�����x�������ł́A�Ⴄ�d�g�݂�
- �K�v�ł��B�Ώۂ̊֘A�G���e�B�e�B�̓v���L�V�łȂ���Ȃ�܂���BHibernate��
- �i���炵��CGLIB���C�u�����ɂ��j���s���̃o�C�g�R�[�h�g����
- �g���ĉi���I�u�W�F�N�g�̒x���������v���L�V��������Ă��܂��B
+ コレクションの遅延フェッチは、Hibernate自身の実装による永続コレクションを使って
+ 実現しています。しかし、単一端関連における遅延処理では、違う仕組みが
+ 必要です。対象の関連エンティティはプロキシでなければなりません。Hibernateは
+ (すばらしいCGLIBライブラリによる)実行時のバイトコード拡張を
+ 使って永続オブジェクトの遅延初期化プロキシを実現しています。
</para>
<para>
- �f�t�H���g�ł́AHibernate3�́i�J�n���Ɂj���ׂẲi���N���X�̃v���L�V�����A
- ������g���āA <literal>many-to-one</literal> ��
<literal>one-to-one</literal> �֘A��
- �x���t�F�b�`��\�ɂ��Ă��܂��B
+ デフォルトでは、Hibernate3は(開始時に)すべての永続クラスのプロキシを生成し、
+ それらを使って、 <literal>many-to-one</literal> や
<literal>one-to-one</literal> 関連の
+ 遅延フェッチを可能にしています。
</para>
<para>
- �}�b�s���O�t�@�C���� <literal>proxy</literal>
�����ɂ���āA�N���X�̃v���L�V�C���^�[�t�F�C�X�Ƃ���
-
�g���C���^�[�t�F�C�X��錾�ł��܂��B�f�t�H���g�ł́AHibernate�͂��̃N���X�̃T�u�N���X��g���܂��B
-
<emphasis>�v���L�V�N���X�͏��Ȃ��Ƃ�p�b�P�[�W���Ńf�t�H���g�R���X�g���N�^��������Ȃ����
-
�Ȃ�Ȃ����Ƃɒ��ӂ��Ă��������B���ׂẲi���N���X�ɂ��̃R���X�g���N�^�𐄏����܂��I</emphasis>
+ マッピングファイルで <literal>proxy</literal>
属性によって、クラスのプロキシインターフェイスとして
+ 使うインターフェイスを宣言できます。デフォルトでは、Hibernateはそのクラスのサブクラスを使います。
+ <emphasis>プロキシクラスは少なくともパッケージ可視でデフォルトコンストラクタを実装しなければ
+ ならないことに注意してください。すべての永続クラスにこのコンストラクタを推奨します!</emphasis>
</para>
<para>
-
�|�����[�t�B�Y���̃N���X�ɑ��Ă��̕��@��K�p����Ƃ��ɂ������l�����邱�Ƃ�����܂��B
- ��F
+ ポリモーフィズムのクラスに対してこの方法を適用するときにいくつか考慮することがあります。
+ 例:
</para>
<programlisting><![CDATA[<class name="Cat"
proxy="Cat">
@@ -286,9 +288,9 @@
</class>]]></programlisting>
<para>
- ���ɁA <literal>Cat</literal> �̃C���X�^���X��
<literal>DomesticCat</literal>
- �ɃL���X�g�ł��܂���B���Ƃ���ƂȂ�C���X�^���X��
<literal>DomesticCat</literal>
- �ł������Ƃ��Ă�ł��B
+ 第一に、 <literal>Cat</literal> のインスタンスは
<literal>DomesticCat</literal>
+ にキャストできません。たとえ基となるインスタンスが <literal>DomesticCat</literal>
+ であったとしてもです。
</para>
<programlisting><![CDATA[Cat cat = (Cat) session.load(Cat.class,
id); // instantiate a proxy (does not hit the db)
@@ -298,7 +300,7 @@
}]]></programlisting>
<para>
- ���ɁA�v���L�V�� <literal>==</literal>
�͐������Ȃ����Ƃ�����܂��B
+ 第二に、プロキシの <literal>==</literal> は成立しないことがあります。
</para>
<programlisting><![CDATA[Cat cat = (Cat) session.load(Cat.class,
id); // instantiate a Cat proxy
@@ -307,28 +309,28 @@
System.out.println(cat==dc); //
false]]></programlisting>
<para>
-
�������A����͌������قLj����Ƃ����킯�ł͂���܂���B���Ƃ��قȂ����v���L�V�I�u�W�F�N�g�ւ�
- ��̎Q�Ƃ��������Ƃ��Ă�A��ƂȂ�C���X�^���X�͓����I�u�W�F�N�g�ł��B
+ しかし、これは見かけほど悪い状況というわけではありません。たとえ異なったプロキシオブジェクトへの
+ 二つの参照があったとしても、基となるインスタンスは同じオブジェクトです。
</para>
<programlisting><![CDATA[cat.setWeight(11.0); // hit the db to
initialize the proxy
System.out.println( dc.getWeight() ); // 11.0]]></programlisting>
<para>
- ��O�ɁA <literal>final</literal> �N���X��
<literal>final</literal> ���\�b�h���N���X��
- CGLIB�v���L�V��g���܂���B
+ 第三に、 <literal>final</literal> クラスや
<literal>final</literal> メソッドを持つクラスに
+ CGLIBプロキシを使えません。
</para>
<para>
-
�Ō�ɁA����i���I�u�W�F�N�g�̃C���X�^���X����(�Ⴆ�A������������f�t�H���g�R���X�g���N�^�̒���)
- �ɂȂ�炩�̃��\�[�X���K�v�ƂȂ�Ȃ�A���̃��\�[�X��܂��v���L�V��ʂ��Ď擾����܂��B
- ���ۂɂ́A�v���L�V�N���X�͉i���N���X�̃T�u�N���X�ł��B
+ 最後に、もし永続オブジェクトのインスタンス化時(例えば、初期化処理やデフォルトコンストラクタの中で)
+ になんらかのリソースが必要となるなら、そのリソースもまたプロキシを通して取得されます。
+ 実際には、プロキシクラスは永続クラスのサブクラスです。
</para>
<para>
- �����̖���Java�̒P��p�����f���̌�����̐����̂��߂ł��B��������̖���������̂Ȃ�A
-
�r�W�l�X���\�b�h��錾�����C���^�[�t�F�C�X���ꂼ��i���N���X�Ŏ������Ȃ���Ȃ�܂���B
- �}�b�s���O�t�@�C���ł����̃C���^�[�t�F�C�X��w�肷��K�v������܂��B��F
+ これらの問題はJavaの単一継承モデルの原理上の制限のためです。もしこれらの問題を避けたいのなら、
+ ビジネスメソッドを宣言したインターフェイスをそれぞれ永続クラスで実装しなければなりません。
+ マッピングファイルでこれらのインターフェイスを指定する必要があります。例:
</para>
<programlisting><![CDATA[<class name="CatImpl"
proxy="Cat">
@@ -339,11 +341,11 @@
</class>]]></programlisting>
<para>
- <literal>CatImpl</literal> ��
<literal>Cat</literal> �C���^�[�t�F�C�X���������̂ɑ��A
- <literal>DomesticCatImpl</literal> ��
<literal>DomesticCat</literal> ��������܂��B
- ����ƁA <literal>load()</literal> ��
<literal>iterate()</literal> �́A
- <literal>Cat</literal> ��
<literal>DomesticCat</literal> �̃C���X�^���X�̃v���L�V��
- �Ԃ��܂��B�i <literal>list()</literal>
�͒ʏ�̓v���L�V��Ԃ��Ȃ����Ƃɒ��ӂ��Ă��������B�j
+ <literal>CatImpl</literal> は
<literal>Cat</literal> インターフェイスを実装するのに対し、
+ <literal>DomesticCatImpl</literal> は
<literal>DomesticCat</literal> を実装します。
+ すると、 <literal>load()</literal> や
<literal>iterate()</literal> は、
+ <literal>Cat</literal> や
<literal>DomesticCat</literal> のインスタンスのプロキシを
+ 返します。( <literal>list()</literal> は通常はプロキシを返さないことに注意してください。)
</para>
<programlisting><![CDATA[Cat cat = (Cat) session.load(CatImpl.class,
catid);
@@ -351,136 +353,136 @@
Cat fritz = (Cat) iter.next();]]></programlisting>
<para>
- �֘A��x������������܂��B����̓v���p�e�B�� <literal>Cat</literal>
�^�Ő錾���Ȃ����
- �Ȃ�Ȃ����Ƃ�Ӗ����܂��B <literal>CatImpl</literal> �ł͂���܂���B
+ 関連も遅延初期化されます。これはプロパティを <literal>Cat</literal> 型で宣言しなければ
+ ならないことを意味します。 <literal>CatImpl</literal> ではありません。
</para>
<para>
- �v���L�V�̏������� <emphasis>�K�v�Ƃ��Ȃ�</emphasis>
�������݂��܂��B
+ プロキシの初期化を <emphasis>必要としない</emphasis> 操作も存在します。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>equals()</literal> �i�i���N���X��
<literal>equals()</literal> ��
- �I�[�o�[���C�h���Ȃ��Ƃ��j
+ <literal>equals()</literal> (永続クラスが
<literal>equals()</literal> を
+ オーバーライドしないとき)
</para>
</listitem>
<listitem>
<para>
- <literal>hashCode()</literal> �i�i���N���X��
<literal>hashCode()</literal> ��
- �I�[�o�[���C�h���Ȃ��Ƃ��j
+ <literal>hashCode()</literal> (永続クラスが
<literal>hashCode()</literal> を
+ オーバーライドしないとき)
</para>
</listitem>
<listitem>
<para>
- ���ʎq��getter���\�b�h
+ 識別子のgetterメソッド
</para>
</listitem>
</itemizedlist>
<para>
- Hibernate�� <literal>equals()</literal> ��
<literal>hashCode()</literal> ��I�[�o�[���C�h����
- �i���N���X���o���܂��B
+ Hibernateは <literal>equals()</literal> や
<literal>hashCode()</literal> をオーバーライドした
+ 永続クラスを検出します。
</para>
<para>
- �f�t�H���g�� <literal>lazy="proxy"</literal>
�̑���ɁA <literal>lazy="no-proxy"</literal> ��
- �I���ƂŁA�^�ϊ��Ɋ֘A����������邱�Ƃ��o���܂��B
- �������A�r���h���̃o�C�g�R�[�h�g�ݍ��݂��K�v�ɂȂ�A�ǂ̂悤�ȑ���ł����Ă�A
- �������Ƀv���L�V�̏�������s�����ƂɂȂ�ł��傤�B
+ デフォルトの <literal>lazy="proxy"</literal> の代わりに、
<literal>lazy="no-proxy"</literal> を
+ 選んだことで、型変換に関連する問題を回避することが出来ます。
+ しかし、ビルド時のバイトコード組み込みが必要になり、どのような操作であっても、
+ ただちにプロキシの初期化を行うことになるでしょう。
</para>
</sect2>
<sect2 id="performance-fetching-initialization"
revision="1">
- <title>�R���N�V�����ƃv���L�V�̏�����</title>
+ <title>コレクションとプロキシの初期化</title>
<para>
- <literal>LazyInitializationException</literal> �́A
<literal>Session</literal> �̃X�R�[�v�O����
-
���������Ă��Ȃ��R���N�V������v���L�V�ɃA�N�Z�X���ꂽ�Ƃ��ɁAHibernate�ɂ���ăX���[����܂��B
- ���Ȃ킿�A�R���N�V������v���L�V�ւ̎Q�Ƃ��G���e�B�e�B���������ꂽ��Ԃ̎��ł��B
+ <literal>LazyInitializationException</literal> は、
<literal>Session</literal> のスコープ外から
+ 初期化していないコレクションやプロキシにアクセスされたときに、Hibernateによってスローされます。
+ すなわち、コレクションやプロキシへの参照を持つエンティティが分離された状態の時です。
</para>
<para>
- <literal>Session</literal>
��N���[�Y����O�Ƀv���L�V��R���N�V�����̏�������m����
- �s�������Ƃ�������܂��B������A <literal>cat.getSex()</literal>
- �� <literal>cat.getKittens().size()</literal>
�Ȃǂ��ɌĂяo�����Ƃŏ������������邱�Ƃ͂ł��܂��B
- ����������̓R�[�h��ǂސl���������A�ėp�I�ȃR�[�h�Ƃ����_�����s�ւł��B
+ <literal>Session</literal> をクローズする前にプロキシやコレクションの初期化を確実に
+ 行いたいときがあります。もちろん、 <literal>cat.getSex()</literal>
+ や <literal>cat.getKittens().size()</literal>
などを常に呼び出すことで初期化を強制することはできます。
+ しかしこれはコードを読む人を混乱させ、汎用的なコードという点からも不便です。
</para>
<para>
- static���\�b�h�� <literal>Hibernate.initialize()</literal> ��
<literal>Hibernate.isInitialized()</literal>
-
�͒x���������̃R���N�V������v���L�V�����Ƃ��ɕ֗��ȕ��@��A�v���P�[�V�����ɒ��܂��B
- <literal>Hibernate.initialize(cat)</literal> �́A
<literal>Session</literal> ���I�[�v������������
- <literal>cat</literal> �v���L�V�����I�ɏ��������܂��B
- <literal>Hibernate.initialize( cat.getKittens() )</literal>
��kittens�R���N�V�����ɑ��ē��l��
- ���ʂ�����܂��B
+ staticメソッドの <literal>Hibernate.initialize()</literal> や
<literal>Hibernate.isInitialized()</literal>
+ は遅延初期化のコレクションやプロキシを扱うときに便利な方法をアプリケーションに提供します。
+ <literal>Hibernate.initialize(cat)</literal> は、
<literal>Session</literal> がオープンしている限りは
+ <literal>cat</literal> プロキシを強制的に初期化します。
+ <literal>Hibernate.initialize( cat.getKittens() )</literal>
はkittensコレクションに対して同様の
+ 効果があります。
</para>
<para>
- �ʂ̑I���Ƃ��āA�K�v�Ȃ��ׂẴR���N�V������v���L�V�����[�h�����܂�
- <literal>Session</literal>
��I�[�v���ɂ��Ă������@������܂��B�������̃A�v���P�[�V������
- �A�[�L�e�N�`���ł́A����Hibernate�ɂ��f�[�^�A�N�Z�X��s���R�[�h�ƁA�����g��
- �R�[�h���قȂ�A�v���P�[�V�����̃��C���[��A�����I�ɈقȂ�v���Z�b�T�̂Ƃ��ɂ́A
- �R���N�V�����������������Ƃ��� <literal>Session</literal>
���I�[�v�����Ă��邱�Ƃ�
- �ۏ����肪����܂��B���̖��ɑ��Ă�2�̊�{�I�ȕ��@������܂��B
+ 別の選択肢として、必要なすべてのコレクションやプロキシがロードされるまで
+ <literal>Session</literal> をオープンにしておく方法があります。いくつかのアプリケーションの
+ アーキテクチャでは、特にHibernateによるデータアクセスを行うコードと、それを使う
+ コードが異なるアプリケーションのレイヤーや、物理的に異なるプロセッサのときには、
+ コレクションが初期化されるときに <literal>Session</literal> がオープンしていることを
+ 保証する問題があります。この問題に対しては2つの基本的な方法があります。
</para>
<itemizedlist>
<listitem>
<para>
- Web�x�[�X�̃A�v���P�[�V�����ł́A
- �r���[�̃����_�����O���������A���N�G�X�g���I����ԍŌ��
<literal>Session</literal>
- ��N���[�Y���邽�߂ɁA�T�[�u���b�g�t�B���^��g�����Ƃ��ł��܂��i
<emphasis>Open Session in View</emphasis>
-
�p�^�[���ł��j�B������A�A�v���P�[�V������Ղ̗�O�����̐��m�������ɏd�v�ɂȂ�܂��B
- �r���[�̃����_�����O���ɗ�O�����������Ƃ��ł����A���[�U�ɏ������߂�O��
- <literal>Session</literal>
�̃N���[�Y�ƃg�����U�N�V�����̏I����s��
- ���Ƃ��s���ɂȂ�܂��B
- Hibernate��Wiki�ɍڂ��Ă���"Open Session in
View"�p�^�[���̗��Q�Ƃ��Ă��������B
+ Webベースのアプリケーションでは、
+ ビューのレンダリングが完了し、リクエストが終わる一番最後で
<literal>Session</literal>
+ をクローズするために、サーブレットフィルタを使うことができます( <emphasis>Open Session in
View</emphasis>
+ パターンです)。もちろん、アプリケーション基盤の例外処理の正確性が非常に重要になります。
+ ビューのレンダリング中に例外が発生したときでさえ、ユーザに処理が戻る前に
+ <literal>Session</literal> のクローズとトランザクションの終了を行う
+ ことが不可欠になります。
+ HibernateのWikiに載っている"Open Session in
View"パターンの例を参照してください。
</para>
</listitem>
<listitem>
<para>
- �r�W�l�X�w���������Ă���A�v���P�[�V�����ł́A�r�W�l�X���W�b�N��
-
Web�w�ŕK�v�ɂȂ邷�ׂẴR���N�V�������O��"����"����K�v������܂��B
- ����͓���̃��[�X�P�[�X�ŕK�v�ƂȂ�v���[���e�[�V����/Web�w�ɑ��A
- �r�W�l�X�w�����ׂẴf�[�^���[�h���A���ׂẴf�[�^���������ĕԂ��ׂ���
-
�������Ƃ�Ӗ����Ă��܂��B�ʏ�́A�A�v���P�[�V������Web�w�ŕK�v�ȃR���N�V����
- ���ꂼ��ɑ��� <literal>Hibernate.initialize()</literal>
��Ăяo����
- �i���̌Ăяo���̓Z�b�V������N���[�Y����O�ɍs���K�v������܂��j�A
- Hibernate�N�G���� <literal>FETCH</literal> �߂�
<literal>Criteria</literal>
- �� <literal>FetchMode.JOIN</literal>
��g���ăR���N�V�������ɕ������܂��B
- ���ʂ� <emphasis>Session Facade</emphasis>
�p�^�[���̑����
- <emphasis>Command</emphasis>
�p�^�[����̗p����ق������ȒP�ł��B
+ ビジネス層が分離しているアプリケーションでは、ビジネスロジックは
+ Web層で必要になるすべてのコレクションを事前に"準備"する必要があります。
+ これは特定のユースケースで必要となるプレゼンテーション/Web層に対し、
+ ビジネス層がすべてのデータをロードし、すべてのデータを初期化して返すべきと
+ いうことを意味しています。通常は、アプリケーションはWeb層で必要なコレクション
+ それぞれに対して <literal>Hibernate.initialize()</literal>
を呼び出すか
+ (この呼び出しはセッションをクローズする前に行う必要があります)、
+ Hibernateクエリの <literal>FETCH</literal> 節や
<literal>Criteria</literal>
+ の <literal>FetchMode.JOIN</literal>
を使ってコレクションを先に復元します。
+ 普通は <emphasis>Session Facade</emphasis> パターンの代わりに
+ <emphasis>Command</emphasis> パターンを採用するほうがより簡単です。
</para>
</listitem>
<listitem>
<para>
-
����������Ă��Ȃ��R���N�V�����i������͑��̃v���L�V�j�ɃA�N�Z�X����O�ɁA
- <literal>merge()</literal> ��
<literal>lock()</literal> ��g���ĐV����
- <literal>Session</literal>
�ɈȑO�Ƀ��[�h���ꂽ�I�u�W�F�N�g��lj����邱�Ƃ�o���܂��B
- �A�h�z�b�N�ȃg�����U�N�V�����̃Z�}���e�B�N�X�������̂ŁAHibernate��
- ��������I�ɍs�킸�A
<emphasis>�s���ׂ��ł����܂���</emphasis> �I
+ 初期化されていないコレクション(もしくは他のプロキシ)にアクセスする前に、
+ <literal>merge()</literal> や
<literal>lock()</literal> を使って新しい
+ <literal>Session</literal>
に以前にロードされたオブジェクトを追加することも出来ます。
+ アドホックなトランザクションのセマンティクスを導入したので、Hibernateは
+ これを自動的に行わず、 <emphasis>行うべきでもありません</emphasis> !
</para>
</listitem>
</itemizedlist>
<para>
-
�傫�ȃR���N�V�����������������͂Ȃ����A�R���N�V�����ɂ��Ă̂Ȃ�炩�̏��i�T�C�Y�̂悤�ȁj
- ��f�[�^�̃T�u�Z�b�g��K�v�Ƃ��邱�Ƃ�����܂��B
+ 大きなコレクションを初期化したくはないが、コレクションについてのなんらかの情報(サイズのような)
+ やデータのサブセットを必要とすることがあります。
</para>
<para>
-
�R���N�V�����t�B���^��g�����ƂŁA�����������ɃR���N�V�����̃T�C�Y��擾���邱�Ƃ��o���܂��B
+ コレクションフィルタを使うことで、初期化せずにコレクションのサイズを取得することが出来ます。
</para>
<programlisting><![CDATA[( (Integer) s.createFilter( collection,
"select count(*)" ).list().get(0) ).intValue()]]></programlisting>
<para>
- <literal>createFilter()</literal>
���\�b�h�́A�R���N�V�����S�̂���������K�v�Ȃ��ɁA�R���N�V������
- �T�u�Z�b�g�����邽�߂Ɍ��ʓI�Ɏg���܂��B
+ <literal>createFilter()</literal>
メソッドは、コレクション全体を初期化する必要なしに、コレクションの
+ サブセットを復元するために効果的に使えます。
</para>
<programlisting><![CDATA[s.createFilter( lazyCollection,
"").setFirstResult(0).setMaxResults(10).list();]]></programlisting>
@@ -488,39 +490,39 @@
</sect2>
<sect2 id="performance-fetching-batch">
- <title>�o�b�`�t�F�b�`�̎g�p</title>
+ <title>バッチフェッチの使用</title>
<para>
-
Hibernate�̓o�b�`�t�F�b�`������I�Ɏg�p�ł��܂��B��̃v���L�V�i������̓R���N�V�����j���A�N�Z�X
-
�����ƁAHibernate�͂������̏��������Ă��Ȃ��v���L�V���[�h���邱�Ƃ��ł��܂��B�o�b�`�t�F�b�`��
-
�x���Z���N�g�t�F�b�`�헪�ɑ���œK���ł��B�o�b�`�t�F�b�`�̒����ɂ͂Q�̕��@������܂��B
- �N���X���x���ƃR���N�V�������x���ł��B
+ Hibernateはバッチフェッチを効率的に使用できます。一つのプロキシ(もしくはコレクション)がアクセス
+ されると、Hibernateはいくつかの初期化していないプロキシをロードすることができます。バッチフェッチは
+ 遅延セレクトフェッチ戦略に対する最適化です。バッチフェッチの調整には2つの方法があります。
+ クラスレベルとコレクションレベルです。
</para>
<para>
- �N���X�A�v�f�̃o�b�`�t�F�b�`�͗����ȒP�ł��B���s���̎��̏�ʂ�z�����Ă��������B
- <literal>Session</literal> �Ƀ��[�h���ꂽ25��
<literal>Cat</literal> �C���X�^���X�����݂��A
- ���ꂼ��� <literal>Cat</literal> ��
<literal>owner</literal> �ł��� <literal>Person</literal>
�ւ̊֘A�����܂��B
- <literal>Person</literal> �N���X��
<literal>lazy="true"</literal> �̃v���L�V�Ń}�b�s���O����Ă��܂��B
- ��������ׂĂ�Cat�ɑ��ČJ��Ԃ� <literal>getOwner()</literal>
��Ăяo���ƁAHibernate��
- �f�t�H���g�ł�25��� <literal>SELECT</literal>
����s���Aowner�v���L�V�̕������܂��B
- ���̐U�镑���� <literal>Person</literal> �̃}�b�s���O��
<literal>batch-size</literal>
- �̎w��Œ����ł��܂��B
+ クラス、要素のバッチフェッチは理解が簡単です。実行時の次の場面を想像してください。
+ <literal>Session</literal> にロードされた25個の
<literal>Cat</literal> インスタンスが存在し、
+ それぞれの <literal>Cat</literal> は
<literal>owner</literal> である <literal>Person</literal> への関連を持ちます。
+ <literal>Person</literal> クラスは
<literal>lazy="true"</literal> のプロキシでマッピングされています。
+ もし今すべてのCatに対して繰り返し <literal>getOwner()</literal>
を呼び出すと、Hibernateは
+ デフォルトでは25回の <literal>SELECT</literal> を実行し、ownerプロキシの復元をします。
+ この振る舞いを <literal>Person</literal> のマッピングの
<literal>batch-size</literal>
+ の指定で調整できます。
</para>
<programlisting><![CDATA[<class name="Person"
batch-size="10">...</class>]]></programlisting>
<para>
- Hibernate�̓N�G����R������s����悤�ɂȂ�܂��B�p�^�[����10, 10, 5�ł��B
+ Hibernateはクエリを3回だけを実行するようになります。パターンは10, 10, 5です。
</para>
<para>
- �R���N�V�����̃o�b�`�t�F�b�`��L���ɂ��邱�Ƃ��o���܂��B��Ƃ��āA���ꂼ���
- <literal>Person</literal> ��
<literal>Cat</literal> �̒x���R���N�V���������Ă���A
- 10��Person�� <literal>Sesssion</literal>
�Ƀ��[�h���ꂽ�Ƃ���ƁA���ׂĂ�Person��
- ���ČJ��Ԃ� <literal>getCats()</literal> ��Ăяo�����ƂŁA�v10���
<literal>SELECT</literal>
- ���������܂��B��� <literal>Person</literal> �̃}�b�s���O��
<literal>cats</literal>
-
�R���N�V�����̃o�b�`�t�F�b�`��L���ɂ���AHibernate�̓R���N�V�����̎��O�t�F�b�`���o���܂��B
+ コレクションのバッチフェッチも有効にすることが出来ます。例として、それぞれの
+ <literal>Person</literal> が
<literal>Cat</literal> の遅延コレクションを持っており、
+ 10個のPersonが <literal>Sesssion</literal>
にロードされたとすると、すべてのPersonに
+ 対して繰り返し <literal>getCats()</literal> を呼び出すことで、計10回の
<literal>SELECT</literal>
+ が発生します。もし <literal>Person</literal> のマッピングで
<literal>cats</literal>
+ コレクションのバッチフェッチを有効にすれば、Hibernateはコレクションの事前フェッチが出来ます。
</para>
<programlisting><![CDATA[<class name="Person">
@@ -530,47 +532,47 @@
</class>]]></programlisting>
<para>
- <literal>batch-size</literal> ��3�Ȃ̂ŁAHibernate��4���
<literal>SELECT</literal>
- ��3�A3�A3�A1���[�h���܂��B�J��Ԃ��ƁA�����̒l�͓����
<literal>Session</literal>
- �̒��̏���������Ă��Ȃ��R���N�V�����̊��Ґ��Ɉˑ����܂��B
+ <literal>batch-size</literal> が3なので、Hibernateは4回の
<literal>SELECT</literal>
+ で3個、3個、3個、1個をロードします。繰り返すと、属性の値は特定の <literal>Session</literal>
+ の中の初期化されていないコレクションの期待数に依存します。
</para>
<para>
- �R���N�V�����̃o�b�`�t�F�b�`�̓A�C�e���̃l�X�g�����c���[�A
���Ȃ킿�A��\�I�ȕ��i�\�̃p�^�[����
- ����ꍇ�ɓ��ɗL�p�ł��B�i�������A�ǂݍ��݂������c���[�ł�
<emphasis>�l�X�g����set</emphasis>
- �� <emphasis>��̉������p�X</emphasis> �����悢�I��ɂȂ�܂��B�j
+ コレクションのバッチフェッチはアイテムのネストしたツリー、 すなわち、代表的な部品表のパターンが
+ ある場合に特に有用です。(しかし、読み込みが多いツリーでは <emphasis>ネストしたset</emphasis>
+ や <emphasis>具体化したパス</emphasis> がよりよい選択になります。)
</para>
</sect2>
<sect2 id="performance-fetching-subselect">
- <title>�T�u�Z���N�g�t�F�b�`�̎g�p</title>
+ <title>サブセレクトフェッチの使用</title>
<para>
-
��̒x���R���N�V������P��l�v���L�V���t�F�b�`����Ȃ�������Ȃ��Ƃ��AHibernate��
- ����炷�ׂĂ��[�h���A�T�u�Z���N�g�̃I���W�i���N�G�����ēx���s����܂��B�����
- �o�b�`�t�F�b�`�Ɠ������@�œ����A�������̃��[�h�͍s���܂���B
+ 一つの遅延コレクションや単一値プロキシがフェッチされなければいけないとき、Hibernateは
+ それらすべてをロードし、サブセレクトのオリジナルクエリが再度実行されます。これは
+ バッチフェッチと同じ方法で動き、少しずつのロードは行いません。
</para>
<!-- TODO: Write more about this -->
- <!-- ���������� -->
+ <!-- 早く書けよ -->
</sect2>
<sect2 id="performance-fetching-lazyproperties">
- <title>�x���v���p�e�B�t�F�b�`�̎g�p</title>
+ <title>遅延プロパティフェッチの使用</title>
<para>
- Hibernate3�̓v���p�e�B���Ƃ̒x���t�F�b�`��T�|�[�g���Ă��܂��B���̍œK����@��
- <emphasis>�O���[�v�̃t�F�b�`</emphasis>
�Ƃ��Ă�m���Ă��܂��B����͂قƂ��
- �v�]����o���@�\�ł��邱�Ƃɒ��ӂ��Ă��������B���ۂɂ͗�ǂݍ��݂̍œK������A
- �s�ǂݍ��݂̍œK�������ɏd�v�ł��B
-
�������A�N���X�̂������̃v���p�e�B������ǂݍ��ނ��Ƃ́A�����̃e�[�u�������S��̗�����A
- �f�[�^���f������P�ł��Ȃ��Ȃǂ̋ɒ[�ȏꍇ�ɂ͗L�p�ł��B
+ Hibernate3はプロパティごとの遅延フェッチをサポートしています。この最適化手法は
+ <emphasis>グループのフェッチ</emphasis> としても知られています。これはほとんど
+ 要望から出た機能であることに注意してください。実際には列読み込みの最適化よりも、
+ 行読み込みの最適化が非常に重要です。
+ しかし、クラスのいくつかのプロパティだけを読み込むことは、既存のテーブルが何百もの列を持ち、
+ データモデルを改善できないなどの極端な場合には有用です。
</para>
<para>
- �x���v���p�e�B�ǂݍ��݂�L���ɂ���ɂ́A�Ώۂ̃v���p�e�B�̃}�b�s���O��
<literal>lazy</literal>
- ������Z�b�g�����������B
+ 遅延プロパティ読み込みを有効にするには、対象のプロパティのマッピングで <literal>lazy</literal>
+ 属性をセットしてください。
</para>
<programlisting><![CDATA[<class name="Document">
@@ -583,13 +585,13 @@
</class>]]></programlisting>
<para>
- �x���v���p�e�B�ǂݍ��݂̓r���h���̃o�C�g�R�[�h�g�ݍ��݂�K�v�Ƃ��܂��I���
- �i���N���X�ɑg�ݍ��݂�����Ă��Ȃ��Ȃ�AHibernate�͖ق��Ēx���v���p�e�B�̐ݒ�����āA
- �����t�F�b�`�ɖ߂��܂��B
+ 遅延プロパティ読み込みはビルド時のバイトコード組み込みを必要とします!もし
+ 永続クラスに組み込みがされていないなら、Hibernateは黙って遅延プロパティの設定を無視して、
+ 即時フェッチに戻します。
</para>
<para>
- �o�C�g�R�[�h�g�ݍ��݂͈ȉ���Ant�^�X�N��g���Ă��������B
+ バイトコード組み込みは以下のAntタスクを使ってください。
</para>
<programlisting><![CDATA[<target name="instrument"
depends="compile">
@@ -607,15 +609,15 @@
</target>]]></programlisting>
<para>
- �s�v�ȗ��ǂݍ��܂Ȃ����߂́A�ʂ́i���悢�H�j���@�́A���Ȃ��Ƃ�
- �ǂݍ��݂݂̂̃g�����U�N�V�����ɂ����ẮAHQL��Criteria�N�G���̎ˉe
- �@�\��g�����Ƃł��B���̕��@�̓r���h���̃o�C�g�R�[�h�g�ݍ��݂��s�v�ɂȂ�A
- ���ǂ������@�ł��B
+ 不要な列を読み込まないための、別の(よりよい?)方法は、少なくとも
+ 読み込みのみのトランザクションにおいては、HQLやCriteriaクエリの射影
+ 機能を使うことです。この方法はビルド時のバイトコード組み込みが不要になり、
+ より良い解決方法です。
</para>
<para>
- HQL�� <literal>fetch all properties</literal>
��g�����ƂŁA���ʂǂ����
- �v���p�e�B�̑����t�F�b�`���O�������邱�Ƃ��o���܂��B
+ HQLで <literal>fetch all properties</literal> を使うことで、普通どおりの
+ プロパティの即時フェッチングを強制することが出来ます。
</para>
</sect2>
@@ -623,28 +625,28 @@
</sect1>
<sect1 id="performance-cache" revision="1">
- <title>��2���x���L���b�V��</title>
+ <title>第2レベルキャッシュ</title>
<para>
- Hibernate�� <literal>Session</literal>
�͉i���f�[�^�̃g�����U�N�V�������x���̃L���b�V���ł��B
- class-by-class��collection-by-collection���Ƃ́A�N���X�^���x����JVM���x��
- �i <literal>SessionFactory</literal>
���x���j�̃L���b�V����ݒ肷�邱�Ƃ��o���܂��B
- �N���X�^�����ꂽ�L���b�V���ɂȂ����Ƃ����o���܂��B���������ӂ��Ă��������B
- �L���b�V���͑��̃A�v���P�[�V�����ɂ��i���w�̕ύX��
- �l�����܂���i�L���b�V���f�[�^�����I�Ɋ�����ɂ���ݒ�͏o���܂��j�B
+ Hibernateの <literal>Session</literal>
は永続データのトランザクションレベルのキャッシュです。
+ class-by-classとcollection-by-collectionごとの、クラスタレベルやJVMレベル
+ ( <literal>SessionFactory</literal> レベル)のキャッシュを設定することが出来ます。
+ クラスタ化されたキャッシュにつなぐことさえ出来ます。しかし注意してください。
+ キャッシュは他のアプリケーションによる永続層の変更を
+ 考慮しません(キャッシュデータを定期的に期限切れにする設定は出来ます)。
</para>
<para revision="1">
-
Hibernate���g�p����L���b�V�������́A<literal>hibernate.cache.provider_class</literal>
�v���p�e�B��
- <literal>org.hibernate.cache.CacheProvider</literal>
����������N���X����w�肷�邱�ƂŕύX�ł��܂��B
-
Hibernate�͑����̃I�[�v���\�[�X�̃L���b�V���v���o�C�_��r���g�C�������Ŏ����Ă��܂��i��Ƀ��X�g������܂��j�B
- �����āA�O�ɐ�������悤�ɁA���Ȃ����g���Ǝ��̎������āA�����g�ݍ��ނ��Ƃ�o���܂��B
-
�o�[�W����3.2���O�ł�EhCache���f�t�H���g�̃L���b�V���v���o�C�_�ł��邱�Ƃɒ��ӂ��Ă��������B
- �o�[�W����3.2�ł͂���͓��Ă͂܂�܂���B
+
Hibernateが使用するキャッシュ実装は、<literal>hibernate.cache.provider_class</literal>
プロパティに
+ <literal>org.hibernate.cache.CacheProvider</literal>
を実装したクラス名を指定することで変更できます。
+ Hibernateは多くのオープンソースのキャッシュプロバイダをビルトイン実装で持っています(後にリストがあります)。
+ 加えて、前に説明したように、あなた自身が独自の実装をして、それを組み込むことも出来ます。
+ バージョン3.2より前ではEhCacheがデフォルトのキャッシュプロバイダであることに注意してください。
+ バージョン3.2ではこれは当てはまりません。
</para>
<table frame="topbot" id="cacheproviders"
revision="1">
- <title>�L���b�V���v���o�C�_</title>
+ <title>キャッシュプロバイダ</title>
<tgroup cols='5' align='left' colsep='1'
rowsep='1'>
<colspec colname='c1' colwidth="1*"/>
<colspec colname='c2' colwidth="3*"/>
@@ -653,58 +655,58 @@
<colspec colname='c5' colwidth="1*"/>
<thead>
<row>
- <entry>�L���b�V��</entry>
- <entry>�v���o�C�_�N���X</entry>
- <entry>�^�C�v</entry>
- <entry>�N���X�^�Z�[�t</entry>
- <entry>�N�G���L���b�V���̃T�|�[�g</entry>
+ <entry>キャッシュ</entry>
+ <entry>プロバイダクラス</entry>
+ <entry>タイプ</entry>
+ <entry>クラスタセーフ</entry>
+ <entry>クエリキャッシュのサポート</entry>
</row>
</thead>
<tbody>
<row>
- <entry>Hashtable�i���i�p�Ƃ��ĈӐ}���Ă��܂���j</entry>
+ <entry>Hashtable(製品用として意図していません)</entry>
<entry><literal>org.hibernate.cache.HashtableCacheProvider</literal></entry>
- <entry>������</entry>
+ <entry>メモリ</entry>
<entry></entry>
<entry>yes</entry>
</row>
<row>
<entry>EHCache</entry>
<entry><literal>org.hibernate.cache.EhCacheProvider</literal></entry>
- <entry>�������A�f�B�X�N</entry>
+ <entry>メモリ、ディスク</entry>
<entry></entry>
<entry>yes</entry>
</row>
<row>
<entry>OSCache</entry>
<entry><literal>org.hibernate.cache.OSCacheProvider</literal></entry>
- <entry>�������A�f�B�X�N</entry>
- <entry>yes�i�N���X�^�������j</entry>
+ <entry>メモリ、ディスク</entry>
+ <entry>yes(クラスタ無効化)</entry>
<entry>yes</entry>
</row>
<row>
<entry>SwarmCache</entry>
<entry><literal>org.hibernate.cache.SwarmCacheProvider</literal></entry>
- <entry>�N���X�^�iip�}���`�L���X�g�j</entry>
- <entry>yes�i�N���X�^�������j</entry>
+ <entry>クラスタ(ipマルチキャスト)</entry>
+ <entry>yes(クラスタ無効化)</entry>
<entry></entry>
</row>
<row>
<entry>JBoss TreeCache</entry>
<entry><literal>org.hibernate.cache.TreeCacheProvider</literal></entry>
-
<entry>�N���X�^�iip�}���`�L���X�g�j�A�g�����U�N�V���i��</entry>
- <entry>yes�i�����j</entry>
- <entry>yes�i�����������K�v�j</entry>
+ <entry>クラスタ(ipマルチキャスト)、トランザクショナル</entry>
+ <entry>yes(複製)</entry>
+ <entry>yes(時刻同期が必要)</entry>
</row>
</tbody>
</tgroup>
</table>
<sect2 id="performance-cache-mapping" revision="2">
- <title>�L���b�V���̃}�b�s���O</title>
+ <title>キャッシュのマッピング</title>
<para>
- �N���X��R���N�V�����̃}�b�s���O��
<literal><cache></literal> �v�f�͈ȉ��̌`���ł��B
+ クラスやコレクションのマッピングの <literal><cache></literal>
要素は以下の形式です。
</para>
<programlistingco>
@@ -747,23 +749,23 @@
</programlistingco>
<para>
- �܂��́i���悢���@�Ƃ��āH�j�A <literal>hibernate.cfg.xml</literal>
�� <literal><class-cache></literal>
- �� <literal><collection-cache></literal>
�v�f��w�肷�邱�Ƃ�o���܂��B
+ または(よりよい方法として?)、 <literal>hibernate.cfg.xml</literal> に
<literal><class-cache></literal>
+ と <literal><collection-cache></literal>
要素を指定することも出来ます。
</para>
<para>
- <literal>usage</literal> ������
<emphasis>�L���b�V���̕��헪</emphasis> ��w�肵�܂��B
+ <literal>usage</literal> 属性は
<emphasis>キャッシュの並列性戦略</emphasis> を指定します。
</para>
</sect2>
<sect2 id="performance-cache-readonly">
- <title>read only�헪</title>
+ <title>read only戦略</title>
<para>
- ����A�v���P�[�V�������ǂݍ��݂̂ݕK�v�ŁA�i���N���X�̃C���X�^���X��ύX���Ȃ��Ȃ�A
- <literal>read-only</literal>
�L���b�V����g�����Ƃ��o���܂��B����͂���Ƃ�P����
- ����Ƃ�p�t�H�[�}���X�̗ǂ��헪�ł��B�N���X�^�ł̎g�p����S�Ɉ��S�ł��B
+ もしアプリケーションが読み込みのみ必要で、永続クラスのインスタンスを変更しないなら、
+ <literal>read-only</literal> キャッシュを使うことが出来ます。これはもっとも単純で
+ もっともパフォーマンスの良い戦略です。クラスタでの使用も完全に安全です。
</para>
<programlisting><![CDATA[<class name="eg.Immutable"
mutable="false">
@@ -775,19 +777,19 @@
<sect2 id="performance-cache-readwrite">
- <title>read/write�헪</title>
+ <title>read/write戦略</title>
<para>
- �A�v���P�[�V�������f�[�^��X�V����K�v������Ȃ�A
<literal>read-write</literal> �L���b�V�����K������
-
����܂���B���̃L���b�V���헪�́A�V���A���C�U�u���ȃg�����U�N�V�����������x�����v�������Ȃ�A
- �����Ďg���ׂ��ł͂���܂���B����L���b�V����JTA���Ŏg����Ȃ�AJTA
<literal>TransactionManager</literal>
- ��擾���邽�߂̕��@����
<literal>hibernate.transaction.manager_lookup_class</literal>
- �v���p�e�B��w�肵�Ȃ���Ȃ�܂���B���̊��ł́A
<literal>Session.close()</literal>
- �� <literal>Session.disconnect()</literal>
���Ăꂽ�Ƃ��ɁA�m���Ƀg�����U�N�V����������
- ���Ă��Ȃ���Ȃ�܂���B
- ����N���X�^�ł��̐헪��g�������Ȃ�A��ƂȂ�L���b�V���̎��������b�N��T�|�[�g
- ���Ă��邱�Ƃ�ۏ��Ȃ���Ȃ�܂���B
- �g�ݍ��݂̃L���b�V���v���o�C�_��
<emphasis>�T�|�[�g���Ă��܂���</emphasis> �B
+ アプリケーションがデータを更新する必要があるなら、 <literal>read-write</literal>
キャッシュが適当かも
+ しれません。このキャッシュ戦略は、シリアライザブルなトランザクション分離レベルが要求されるなら、
+ 決して使うべきではありません。もしキャッシュがJTA環境で使われるなら、JTA
<literal>TransactionManager</literal>
+ を取得するための方法を示す
<literal>hibernate.transaction.manager_lookup_class</literal>
+ プロパティを指定しなければなりません。他の環境では、 <literal>Session.close()</literal>
+ や <literal>Session.disconnect()</literal>
が呼ばれたときに、確実にトランザクションが完了
+ していなければなりません。
+ もしクラスタでこの戦略を使いたいなら、基となるキャッシュの実装がロックをサポート
+ していることを保証しなければなりません。
+ 組み込みのキャッシュプロバイダは <emphasis>サポートしていません</emphasis> 。
</para>
<programlisting><![CDATA[<class name="eg.Cat" ....
>
@@ -802,39 +804,39 @@
</sect2>
<sect2 id="performance-cache-nonstrict">
- <title>�����ł͂Ȃ�read/write�헪</title>
+ <title>厳密ではないread/write戦略</title>
<para>
-
�A�v���P�[�V���������܂ɂ����f�[�^��X�V����K�v�͂Ȃ��i���Ȃ킿��̃g�����U�N�V������
-
�����ɓ����A�C�e����X�V���悤�Ƃ��邱�Ƃ͂قƂ�NjN����Ȃ��j�A�����ȃg�����U�N�V����������
- �v������Ȃ��Ȃ�A <literal>nonstrict-read-write</literal>
�L���b�V�����K���������܂���B
- ����L���b�V����JTA���Ŏg����Ȃ�A
<literal>hibernate.transaction.manager_lookup_class</literal>
- ��w�肵�Ȃ���Ȃ�܂���B���̊��ł́A
<literal>Session.close()</literal>
- �� <literal>Session.disconnect()</literal>
���Ăꂽ�Ƃ��ɁA�m���Ƀg�����U�N�V����������
- ���Ă��Ȃ���Ȃ�܂���B
+ アプリケーションがたまにしかデータを更新する必要はなく(すなわち二つのトランザクションが
+ 同時に同じアイテムを更新しようとすることはほとんど起こらない)、厳密なトランザクション分離が
+ 要求されないなら、 <literal>nonstrict-read-write</literal>
キャッシュが適当かもしれません。
+ もしキャッシュがJTA環境で使われるなら、
<literal>hibernate.transaction.manager_lookup_class</literal>
+ を指定しなければなりません。他の環境では、 <literal>Session.close()</literal>
+ や <literal>Session.disconnect()</literal>
が呼ばれたときに、確実にトランザクションが完了
+ していなければなりません。
</para>
</sect2>
<sect2 id="performance-cache-transactional">
- <title>transactional�헪</title>
+ <title>transactional戦略</title>
<para>
- <literal>transactional</literal> �L���b�V���헪��JBoss
TreeCache�̂悤�Ȋ��S�ȃg�����U�N�V���i��
- �L���b�V���v���o�C�_�̃T�|�[�g����܂��B
- ���̂悤�ȃL���b�V����JTA���ł̂ݎg�p�\�ŁA
<literal>hibernate.transaction.manager_lookup_class</literal>
- ��w�肵�Ȃ���Ȃ�܂���B
+ <literal>transactional</literal> キャッシュ戦略はJBoss
TreeCacheのような完全なトランザクショナル
+ キャッシュプロバイダのサポートを提供します。
+ このようなキャッシュはJTA環境でのみ使用可能で、
<literal>hibernate.transaction.manager_lookup_class</literal>
+ を指定しなければなりません。
</para>
</sect2>
<para>
- ���ׂĂ̓������s���L���b�V���헪��T�|�[�g���Ă���L���b�V���v���o�C�_�͂���܂���B
- �ȉ��̕\�͂ǂ̃v���o�C�_���ǂ̓������헪�ɑΉ����邩��\���Ă��܂��B
+ すべての同時並行性キャッシュ戦略をサポートしているキャッシュプロバイダはありません。
+ 以下の表はどのプロバイダがどの同時並列性戦略に対応するかを表しています。
</para>
<table frame="topbot">
- <title>�������s���L���b�V���헪�̃T�|�[�g</title>
+ <title>同時並行性キャッシュ戦略のサポート</title>
<tgroup cols='5' align='left' colsep='1'
rowsep='1'>
<colspec colname='c1' colwidth="1*"/>
<colspec colname='c2' colwidth="1*"/>
@@ -843,16 +845,16 @@
<colspec colname='c5' colwidth="1*"/>
<thead>
<row>
- <entry>�L���b�V��</entry>
+ <entry>キャッシュ</entry>
<entry>read-only</entry>
- <entry>�����ł͂Ȃ�read-write</entry>
+ <entry>厳密ではないread-write</entry>
<entry>read-write</entry>
<entry>transactional</entry>
</row>
</thead>
<tbody>
<row>
- <entry>Hashtable�i���i�p�Ƃ��ĈӐ}���Ă��܂���j</entry>
+ <entry>Hashtable(製品用として意図していません)</entry>
<entry>yes</entry>
<entry>yes</entry>
<entry>yes</entry>
@@ -893,19 +895,19 @@
</sect1>
<sect1 id="performance-sessioncache" revision="2">
- <title>�L���b�V���̊Ǘ�</title>
+ <title>キャッシュの管理</title>
<para>
- �I�u�W�F�N�g�� <literal>save()</literal> �A
<literal>update()</literal> �A <literal>saveOrUpdate()</literal>
- �ɓn���Ƃ��A������ <literal>load()</literal> �A
<literal>get()</literal> �A <literal>list()</literal> �A
- <literal>iterate()</literal> �A
<literal>scroll()</literal> ��g���ăI�u�W�F�N�g������Ƃ��ɂ͏�ɁA
- ���̃I�u�W�F�N�g�� <literal>Session</literal>
�̓���L���b�V���ɒlj�����܂��B
+ オブジェクトを <literal>save()</literal> 、
<literal>update()</literal> 、 <literal>saveOrUpdate()</literal>
+ に渡すとき、そして <literal>load()</literal> 、
<literal>get()</literal> 、 <literal>list()</literal> 、
+ <literal>iterate()</literal> 、
<literal>scroll()</literal> を使ってオブジェクトを復元するときには常に、
+ そのオブジェクトは <literal>Session</literal> の内部キャッシュに追加されます。
</para>
<para>
- ���� <literal>flush()</literal>
���Ă��ƁA�I�u�W�F�N�g�̏�Ԃ̓f�[�^�x�[�X�Ɠ���������܂��B
- ������̓������N���邱�Ƃ�]�܂Ȃ��Ƃ���A�c��Ȑ��̃I�u�W�F�N�g�������Ă��ă�����������I��
- �����K�v������Ƃ��́A <literal>evict()</literal>
���\�b�h��g���Ĉꎟ�L���b�V������
- �I�u�W�F�N�g��R���N�V������폜���邱�Ƃ��o���܂��B
+ 次に <literal>flush()</literal> が呼ばれると、オブジェクトの状態はデータベースと同期化されます。
+ もしこの同期が起こることを望まないときや、膨大な数のオブジェクトを処理していてメモリを効率的に
+ 扱う必要があるときは、 <literal>evict()</literal> メソッドを使って一次キャッシュから
+ オブジェクトやコレクションを削除することが出来ます。
</para>
<programlisting><![CDATA[ScrollableResult cats =
sess.createQuery("from Cat as cat").scroll(); //a huge result set
@@ -916,19 +918,19 @@
}]]></programlisting>
<para>
- <literal>Session</literal>
�̓C���X�^���X���Z�b�V�����L���b�V���Ɋ܂܂�邩�ǂ����f���邽�߂�
- <literal>contains()</literal> ���\�b�h����܂��B
+ <literal>Session</literal> はインスタンスがセッションキャッシュに含まれるかどうかを判断するための
+ <literal>contains()</literal> メソッドも提供します。
</para>
<para>
-
���ׂẴI�u�W�F�N�g��Z�b�V�����L���b�V�����犮�S�Ɏ�菜���ɂ́A<literal>Session.clear()</literal>
- ��Ăяo���Ă��������B
+
すべてのオブジェクトをセッションキャッシュから完全に取り除くには、<literal>Session.clear()</literal>
+ を呼び出してください。
</para>
<para>
- �L���b�V���̂��߂ɁA <literal>SessionFactory</literal> �ɂ�
-
�C���X�^���X�A�N���X�S�́A�R���N�V�����̃C���X�^���X�A�R���N�V�����S�̂�L���b�V������
- �폜���邽�߂̃��\�b�h�����ꂼ���`����Ă��܂��B
+ 二次キャッシュのために、 <literal>SessionFactory</literal> には
+ インスタンス、クラス全体、コレクションのインスタンス、コレクション全体をキャッシュから
+ 削除するためのメソッドがそれぞれ定義されています。
</para>
<programlisting><![CDATA[sessionFactory.evict(Cat.class, catId); //evict
a particular Cat
@@ -937,40 +939,40 @@
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten
collections]]></programlisting>
<para>
- <literal>CacheMode</literal>
�͓���̃Z�b�V�������L���b�V���Ƃǂ̂悤�ɑ��ݍ�p���邩��
- �w�肵�܂��B
+ <literal>CacheMode</literal> は特定のセッションが二次キャッシュとどのように相互作用するかを
+ 指定します。
</para>
<itemizedlist>
<listitem>
<para>
- <literal>CacheMode.NORMAL</literal> -
�A�C�e���̓ǂݍ��݂Ə������݂œL���b�V����g���܂�
+ <literal>CacheMode.NORMAL</literal> -
アイテムの読み込みと書き込みで二次キャッシュを使います
</para>
</listitem>
<listitem>
<para>
- <literal>CacheMode.GET</literal> -
�ǂݍ��݂͓L���b�V������s���܂����A�f�[�^��
- �X�V�����ꍇ�����ēL���b�V���ɏ������݂��܂���B
+ <literal>CacheMode.GET</literal> - 読み込みは二次キャッシュから行いますが、データを
+ 更新した場合を除いて二次キャッシュに書き込みをしません。
</para>
</listitem>
<listitem>
<para>
- <literal>CacheMode.PUT</literal> -
�L���b�V���ɃA�C�e���������݂܂����A�ǂݍ��݂ɂ�
- �L���b�V����g���܂���B
+ <literal>CacheMode.PUT</literal> - 二次キャッシュにアイテムを書き込みますが、読み込みには
+ 二次キャッシュを使いません。
</para>
</listitem>
<listitem>
<para>
- <literal>CacheMode.REFRESH</literal> -
�L���b�V���ɃA�C�e���������݂܂����A�ǂݍ��݂ɂ�
- �L���b�V����g�킸�A
<literal>hibernate.cache.use_minimal_puts</literal>
-
�̉e������ɁA�f�[�^�x�[�X����ǂݍ��ނ��ׂẴA�C�e���̓L���b�V�������I�Ƀ��t���b�V�����܂��B
+ <literal>CacheMode.REFRESH</literal> -
二次キャッシュにアイテムを書き込みますが、読み込みには
+ 二次キャッシュを使わず、 <literal>hibernate.cache.use_minimal_puts</literal>
+ の影響を受けずに、データベースから読み込むすべてのアイテムの二次キャッシュを強制的にリフレッシュします。
</para>
</listitem>
</itemizedlist>
<para>
- �L���b�V���̓�e��N�G���L���b�V���̈���邽�߂ɁA
<literal>Statistics</literal> API��
- �g�����������B
+ 二次キャッシュの内容やクエリキャッシュ領域を見るために、 <literal>Statistics</literal> APIを
+ 使ってください。
</para>
<programlisting><![CDATA[Map cacheEntries =
sessionFactory.getStatistics()
@@ -978,8 +980,8 @@
.getEntries();]]></programlisting>
<para>
- ���v����L���ɂ��āA����ɃI�v�V�����Ƃ��āA�L���b�V���G���g����
- �l����藝��\�Ȍ`���ŕێ����邱�Ƃ�Hibernate�ɋ������܂��B
+ 統計情報を有効にして、さらにオプションとして、キャッシュエントリを
+ 人がより理解可能な形式で保持することをHibernateに強制します。
</para>
<programlisting><![CDATA[hibernate.generate_statistics true
@@ -988,35 +990,35 @@
</sect1>
<sect1 id="performance-querycache" revision="1">
- <title>�N�G���L���b�V��</title>
+ <title>クエリキャッシュ</title>
<para>
- �N�G���̃��U���g�Z�b�g��L���b�V���o���܂��B����͓����p�����[�^�ʼn��x����s�����
- �N�G���ɑ��Ă̂ݗL�p�ł��B�N�G���L���b�V����g���ɂ́A�܂��ݒ�ŗL���ɂ��Ȃ��Ă͂Ȃ�܂���B
+ クエリのリザルトセットもキャッシュ出来ます。これは同じパラメータで何度も実行される
+ クエリに対してのみ有用です。クエリキャッシュを使うには、まず設定で有効にしなくてはなりません。
</para>
<programlisting><![CDATA[hibernate.cache.use_query_cache
true]]></programlisting>
<para>
- ���̐ݒ�͐V���ɓ�̃L���b�V���̈�̍쐬��s���܂��B��̓N�G���̃��U���g�Z�b�g��
- �L���b�V���i
<literal>org.hibernate.cache.StandardQueryCache</literal> �j��ێ����A
- ���1�̓N�G���\�ȃe�[�u���ւ̍ŐV�̍X�V�^�C���X�^���v
- �i <literal>org.hibernate.cache.UpdateTimestampsCache</literal>
�j��ێ����܂��B
- �N�G���L���b�V���̓��U���g�Z�b�g�̎��ۂ̗v�f�̏�Ԃ̓L���b�V�����Ȃ����Ƃ�
- ���ӂ��Ă��������B�L���b�V������͎̂��ʎq�̒l�ƁA�l�^�̌��ʂ݂̂ł��B
- ���̂��߁A�N�G���L���b�V���͏�ɓL���b�V���ƈꏏ�Ɏg���ׂ��ł��B
+ この設定は新たに二つのキャッシュ領域の作成を行います。一つはクエリのリザルトセットの
+ キャッシュ( <literal>org.hibernate.cache.StandardQueryCache</literal>
)を保持し、
+ もう1つはクエリ可能なテーブルへの最新の更新タイムスタンプ
+ ( <literal>org.hibernate.cache.UpdateTimestampsCache</literal>
)を保持します。
+ クエリキャッシュはリザルトセットの実際の要素の状態はキャッシュしないことに
+ 注意してください。キャッシュするのは識別子の値と、値型の結果のみです。
+ そのため、クエリキャッシュは常に二次キャッシュと一緒に使うべきです。
</para>
<para>
- �قƂ�ǂ̃N�G���̓L���b�V���̉��b��Ȃ��̂ŁA�f�t�H���g�ł̓N�G���̓L���b�V������܂���B
- �L���b�V����L���ɂ���ɂ́A
<literal>Query.setCacheable(true)</literal> ��Ăяo���Ă��������B
-
��������N�G���������̃L���b�V�����ʂ�T���A�N�G�����s���ɂ��̌��ʂ�L���b�V���ɒlj�����
- �悤�ɂȂ�܂��B
+ ほとんどのクエリはキャッシュの恩恵を受けないので、デフォルトではクエリはキャッシュされません。
+ キャッシュを有効にするには、 <literal>Query.setCacheable(true)</literal>
を呼び出してください。
+ そうすればクエリが既存のキャッシュ結果を探し、クエリ実行時にその結果をキャッシュに追加する
+ ようになります。
</para>
<para>
- �N�G���L���b�V���̔j���|���V�[��ׂ������䂵�����Ƃ��́A
<literal>Query.setCacheRegion()</literal>
- ��Ăяo���ē���̃N�G���ɑ���L���b�V���̈��w�肷�邱�Ƃ��o���܂��B
+ クエリキャッシュの破棄ポリシーを細かく制御したいときは、
<literal>Query.setCacheRegion()</literal>
+ を呼び出して特定のクエリに対するキャッシュ領域を指定することが出来ます。
</para>
<programlisting><![CDATA[List blogs = sess.createQuery("from Blog
blog where blog.blogger = :blogger")
@@ -1027,52 +1029,52 @@
.list();]]></programlisting>
<para>
- �N�G�������g�̃N�G���L���b�V���̈�̃��t���b�V���������Ȃ���Ȃ�Ȃ��Ȃ�A
- <literal>Query.setCacheMode(CacheMode.REFRESH)</literal>
��Ăяo���ׂ��ł��B�����
- ���ƂȂ�f�[�^���ʂ̃v���Z�X�ɂ���čX�V���ꂽ��i���Ȃ킿Hibernate��ʂ��čX�V����Ȃ��j�A
-
�A�v���P�[�V�����ɓ���̃N�G�����U���g�Z�b�g��I���ă��t���b�V��������ꍇ�ɓ��ɗL�p�ł��B
- ����ɗL�p�Ȃ����̕��@�́A
<literal>SessionFactory.evictQueries()</literal>
- �ɂ���ăN�G���L���b�V���̈��������邱�Ƃł��B
+ クエリが自身のクエリキャッシュ領域のリフレッシュを強制しなければならないなら、
+ <literal>Query.setCacheMode(CacheMode.REFRESH)</literal>
を呼び出すべきです。これは
+ 元となるデータが別のプロセスによって更新されたり(すなわちHibernateを通じて更新されない)、
+ アプリケーションに特定のクエリリザルトセットを選択してリフレッシュさせる場合に特に有用です。
+ さらに有用なもう一つの方法は、 <literal>SessionFactory.evictQueries()</literal>
+ によってクエリキャッシュ領域を消去することです。
</para>
</sect1>
-��14.1
+☆14.1
<sect1 id="performance-collections">
- <title>�R���N�V�����̃p�t�H�[�}���X�̗���</title>
+ <title>コレクションのパフォーマンスの理解</title>
<para>
- �R���N�V�����̘b��ɂ͂��łɑ����̎��Ԃ�g���܂����B���̐߂ł�
- �R���N�V���������s���ɂǂ̂悤�ɐU�������ɂ��Ă̘b���2�A3���グ�܂��B
+ コレクションの話題にはすでに多くの時間を使いました。この節では
+ コレクションが実行時にどのように振舞うかについての話題を2、3取り上げます。
</para>
<sect2 id="performance-collections-taxonomy">
- <title>����</title>
+ <title>分類</title>
- <para>Hibernate��3�̊�{�I�ȃR���N�V�����̎�ނ��`���Ă��܂��B
+ <para>Hibernateは3つの基本的なコレクションの種類を定義しています。
</para>
<itemizedlist>
<listitem>
- <para>�l�̃R���N�V����</para>
+ <para>値のコレクション</para>
</listitem>
<listitem>
- <para>��Α��֘A</para>
+ <para>一対多関連</para>
</listitem>
<listitem>
- <para>���Α��֘A</para>
+ <para>多対多関連</para>
</listitem>
</itemizedlist>
<para>
- ���̕��ނ͂��܂��܂ȃe�[�u����O���L�[�֘A���ʂ��܂����A���������m��K�v�̂���
- �֘A���f���ɂ��ĂقƂ�ǂȂɂ�����Ă���܂���B�֘A�\����p�t�H�[�}���X�̓�����
- ���S�ɗ�����ɂ́AHibernate���R���N�V�����̍s��X�V�A�폜���邽�߂Ɏg����L�[��
- �\����܂��l���Ȃ���Ȃ�܂���B����͈ȉ��̕��ނ���܂��B
+ この分類はさまざまなテーブルや外部キー関連を区別しますが、私たちが知る必要のある
+ 関連モデルについてほとんどなにも教えてくれません。関連構造やパフォーマンスの特徴を
+ 完全に理解するには、Hibernateがコレクションの行を更新、削除するために使う主キーの
+ 構造もまた考えなければなりません。これは以下の分類を提示します。
</para>
<itemizedlist>
<listitem>
- <para>�C���f�b�N�X�t���R���N�V����</para>
+ <para>インデックス付きコレクション</para>
</listitem>
<listitem>
<para>set</para>
@@ -1083,86 +1085,86 @@
</itemizedlist>
<para>
- ���ׂẴC���f�b�N�X�t���R���N�V�����imap�Alist�A�z��j��
<literal><key></literal>
- �� <literal><index></literal>
�J��������Ȃ��L�[�����Ă��܂��B���̏ꍇ��
- �R���N�V�����̍X�V�͔��Ɍ����I�ł��B��L�[�͗L�p�ȃC���f�b�N�X�ɂȂ�AHibernate��
- ����̍s��X�V�܂��͍폜����Ƃ��ɁA���̍s������I�Ɍ����邱�Ƃ��ł��܂��B
+ すべてのインデックス付きコレクション(map、list、配列)は
<literal><key></literal>
+ と <literal><index></literal>
カラムからなる主キーを持っています。この場合は
+ コレクションの更新は非常に効率的です。主キーは有用なインデックスになり、Hibernateが
+ 特定の行を更新または削除するときに、その行を効率的に見つけることができます。
</para>
<para>
- set�� <literal><key></literal>
����Ȃ��L�[�Ɨv�f�̃J���������Ă��܂��B
- ����̓R���N�V�����v�f�̂������̌^�ɂ��Ă͌����I�ł͂Ȃ��������܂���B
- ���ɕ����v�f�A�傫�ȃe�L�X�g�A�o�C�i���t�B�[���h�ł͔�����ł��B�f�[�^�x�[�X��
-
������L�[�Ɍ����I�ɃC���f�b�N�X��t���邱�Ƃ��ł��Ȃ�����ł��B����A1�Α��⑽�Α��֘A�ɂ����āA
- ���ɐl�H���ʎq�̏ꍇ�͓������炢�����I�ł��B�i�]�k�F
<literal>SchemaExport</literal>
- �Ŏ��ۂ� <literal><set></literal>
�̎�L�[���肽���Ȃ�A���ׂẴJ������
- <literal>not-null="true"</literal>
��錾���Ȃ���Ȃ�܂���B�j
+ setは <literal><key></literal>
からなる主キーと要素のカラムを持っています。
+ これはコレクション要素のいくつかの型については効率的ではないかもしれません。
+ 特に複合要素、大きなテキスト、バイナリフィールドでは非効率です。データベースは
+ 複合主キーに効率的にインデックスを付けることができないからです。一方、1対多や多対多関連において、
+ 特に人工識別子の場合は同じぐらい効率的です。(余談: <literal>SchemaExport</literal>
+ で実際に <literal><set></literal>
の主キーを作りたいなら、すべてのカラムで
+ <literal>not-null="true"</literal>
を宣言しなければなりません。)
</para>
<para>
- <literal><idbag></literal>
�}�b�s���O�͑㗝�L�[���`���܂��B���̂���
- �X�V�͏�ɔ��Ɍ����I�ł��B������A����͍őP�̃P�[�X�ł��B
+ <literal><idbag></literal>
マッピングは代理キーを定義します。そのため
+ 更新は常に非常に効率的です。事実上、これは最善のケースです。
</para>
<para>
-
bag�͍ň��̃P�[�X�ł��Bbag�͗v�f�̒l�̏d�����\�ŁA�C���f�b�N�X�J���������Ȃ����߁A
- ��L�[�͒�`����Ȃ��������܂���BHibernate�ɂ͏d�������s���ʂ�����@������܂���B
- Hibernate�͂��̖��̉��̂��߂ɁA�ύX���������Ƃ��ɂ͏�Ɋ��S�ȍ폜
- �i��� <literal>DELETE</literal>
�ɂ��j��s���A�R���N�V�����̍č쐬��s���܂��B
- ����͔��ɔ�����I�������܂���B
+ bagは最悪のケースです。bagは要素の値の重複が可能で、インデックスカラムを持たないため、
+ 主キーは定義されないかもしれません。Hibernateには重複した行を区別する方法がありません。
+ Hibernateはこの問題の解決のために、変更があったときには常に完全な削除
+ (一つの <literal>DELETE</literal> による)を行い、コレクションの再作成を行います。
+ これは非常に非効率的かもしれません。
</para>
<para>
- 1�Α��֘A�ł́A�u��L�[�v�̓f�[�^�x�[�X�̃e�[�u���̕����I��
-
��L�[�ł͂Ȃ��������Ȃ����Ƃɒ��ӂ��Ă��������B���������̏ꍇ�ł����A��L�̕��ނ͂܂��L�p�ł��B
- �iHibernate���R���N�V�����̌X�̍s��ǂ�����āu�����邩�v��\���Ă��܂��B�j
+ 1対多関連では、「主キー」はデータベースのテーブルの物理的な
+ 主キーではないかもしれないことに注意してください。しかしこの場合でさえ、上記の分類はまだ有用です。
+ (Hibernateがコレクションの個々の行をどうやって「見つけるか」を表しています。)
</para>
</sect2>
<sect2 id="performance-collections-mostefficientupdate">
- <title>�X�V�ɂ���Ƃ�����I�ȃR���N�V����
list�Amap�Aidbag�Aset</title>
+ <title>更新にもっとも効率的なコレクション list、map、idbag、set</title>
<para>
- ��ł̋c�_����A�C���f�b�N�X�t���R���N�V�����Ɓi���ʂ́jset�͗v�f�̒lj��A�폜�A
- �X�V�ł���Ƃ�����I�ȑ��삪�o���邱�Ƃ͖��炩�ł��B
+ 上での議論から、インデックス付きコレクションと(普通の)setは要素の追加、削除、
+ 更新でもっとも効率的な操作が出来ることは明らかです。
</para>
<para>
- �قڊԈႢ�Ȃ��A���Α��֘A��l�̃R���N�V�����ɂ����āA�C���f�b�N�X�t���R���N�V������
- set����D��Ă���_����ȏ゠��܂��B <literal>Set</literal> �͂���
- �\���̂��߂ɁAHibernate�͗v�f���u�ύX�v���ꂽ�Ƃ��ɍs������
<literal>UPDATE</literal>
- ���܂���B <literal>Set</literal>
�ւ̕ύX�͏�Ɂi�X�̍s�́j<literal>INSERT</literal>
- �� <literal>DELETE</literal>
�ɂ���čs���܂��B�J��Ԃ��܂����A����͈�Α��֘A�ɂ�
- ���Ă͂܂�܂���B
+ ほぼ間違いなく、多対多関連や値のコレクションにおいて、インデックス付きコレクションが
+ setよりも優れている点が一つ以上あります。 <literal>Set</literal> はその
+ 構造のために、Hibernateは要素が「変更」されたときに行を決して <literal>UPDATE</literal>
+ しません。 <literal>Set</literal>
への変更は常に(個々の行の)<literal>INSERT</literal>
+ と <literal>DELETE</literal> によって行います。繰り返しますが、これは一対多関連には
+ 当てはまりません。
</para>
<para>
- �z��͒x���������ł��Ȃ��Ƃ������܂�Ȃ̂ŁA���_�Ƃ��āAlist�Amap�Aidbag������Ƃ�
- �p�t�H�[�}���X�̗ǂ��iinverse�ł͂Ȃ��j�R���N�V�����^�C�v�ƂȂ�܂��Bset��
- ����قLjႢ�͂���܂���BHibernate�̃A�v���P�[�V�����ł́Aset�̓R���N�V�����̂���Ƃ�
- ���ʂ̎�ނƂ��Ċ��҂���܂��Bset�̕\���͊֘A���f���ł͂���Ƃ���R������ł��B
+ 配列は遅延処理ができないという決まりなので、結論として、list、map、idbagがもっとも
+ パフォーマンスの良い(inverseではない)コレクションタイプとなります。setも
+ それほど違いはありません。Hibernateのアプリケーションでは、setはコレクションのもっとも
+ 共通の種類として期待されます。setの表現は関連モデルではもっとも自然だからです。
</para>
<para>
-
�������A�悭�f�U�C�����ꂽHibernate�̃h���C�����f���ł́A�ʏ����Ƃ�����R���N�V������
- ������ <literal>inverse="true"</literal>
��w�肵��1�Α��֘A�ł��B�����̊֘A�ł́A
- �X�V�͑��Έ�̊֘A�[�ň����A�R���N�V�����̍X�V�p�t�H�[�}���X�̖��͓��Ă͂܂�܂���B
+ しかし、よくデザインされたHibernateのドメインモデルでは、通常もっとも多いコレクションは
+ 事実上 <literal>inverse="true"</literal>
を指定した1対多関連です。これらの関連では、
+ 更新は多対一の関連端で扱われ、コレクションの更新パフォーマンスの問題は当てはまりません。
</para>
</sect2>
<sect2 id="performance-collections-mostefficentinverse">
- <title>inverse�R���N�V�����ɂ���Ƃ�œK��bag��list</title>
+ <title>inverseコレクションにもっとも最適なbagとlist</title>
<para>
-
bag�������Ă��܂��O�ɁAbag�i������list��j��set��������ƃp�t�H�[�}���X���ǂ����ʂȃP�[�X��
- �Љ�܂��B <literal>inverse="true"</literal>
�̃R���N�V�����i��ʓI��1�Α��֘A�̎g�����Ȃǁj�ŁA
- bag�̗v�f�������i�t�F�b�`�j����K�v�Ȃ�bag��list�ɗv�f��lj��ł��܂��I
- ����� <literal>Collection.add()</literal> ��
<literal>Collection.addAll()</literal>
- ��bag�� <literal>List</literal>
�ł͏��true��Ԃ��Ȃ���Ȃ�Ȃ�����ł�
- �i <literal>Set</literal> �Ƃ͈قȂ�܂��j�B
- ����͈ȉ��̋��ʏ������葬�����邱�Ƃ��ł��܂��B
+ bagを見放してしまう前に、bag(そしてlistも)がsetよりもずっとパフォーマンスが良い特別なケースを
+ 紹介します。 <literal>inverse="true"</literal>
のコレクション(一般的な1対多関連の使い方など)で、
+ bagの要素を初期化(フェッチ)する必要なくbagやlistに要素を追加できます!
+ これは <literal>Collection.add()</literal> や
<literal>Collection.addAll()</literal>
+ はbagや <literal>List</literal> では常にtrueを返さなければならないからです
+ ( <literal>Set</literal> とは異なります)。
+ これは以下の共通処理をより速くすることができます。
</para>
<programlisting><![CDATA[Parent p = (Parent) sess.load(Parent.class,
id);
@@ -1174,54 +1176,54 @@
</sect2>
<sect2 id="performance-collections-oneshotdelete">
- <title>�ꊇ�폜</title>
+ <title>一括削除</title>
<para>
- ���X�A�R���N�V�����̗v�f����폜���邱�Ƃ͋ɂ߂Ĕ�����I�ɂȂ邱�Ƃ�����܂��B
- Hibernate�͋��ł͂Ȃ��̂ŁA�V������̃R���N�V�����̏ꍇ�i
<literal>list.clear()</literal>
- ��Ăяo�����ꍇ�Ȃǁj�ł͂�����ׂ��łȂ����Ƃ�m���Ă��܂��B���̏ꍇ�́AHibernate��
- <literal>DELETE</literal> ���s���āA����ł��ׂďI���܂��I
+ 時々、コレクションの要素を一つ一つ削除することは極めて非効率的になることがあります。
+ Hibernateは愚かではないので、新しい空のコレクションの場合(
<literal>list.clear()</literal>
+ を呼び出した場合など)ではこれをすべきでないことを知っています。この場合は、Hibernateは
+ <literal>DELETE</literal> を一回発行して、それですべて終わります!
</para>
<para>
- �T�C�Y20�̃R���N�V�����Ɉ�̗v�f��lj����A���ꂩ���̗v�f��폜����Ƃ��܂��B
- Hibernate�͈�� <literal>INSERT</literal> ���Ɠ��
<literal>DELETE</literal> ���s���܂�
- �i�R���N�V������bag�łȂ���j�B����͊m���ɖ]�܂�������ł��B
+ サイズ20のコレクションに一つの要素を追加し、それから二つの要素を削除するとします。
+ Hibernateは一つの <literal>INSERT</literal> 文と二つの
<literal>DELETE</literal> 文を発行します
+ (コレクションがbagでなければ)。これは確かに望ましい動作です。
</para>
<para>
- �������A18�̗v�f��폜����2��c���A���ꂩ��3�V�����v�f��lj�����Ƃ��܂��B
- ���̂Ƃ���̕��@������܂��B
+ しかし、18個の要素を削除して2つを残し、それから3つ新しい要素を追加するとします。
+ このとき二つの方法があります。
</para>
<itemizedlist>
<listitem>
<para>
- 18�s����폜���āA3�s��lj�����
+ 18行を一つ一つ削除して、3行を追加する
</para>
</listitem>
<listitem>
<para>
- �R���N�V�����S�̂�폜�i <literal>DELETE</literal>
��SQL����j���A������5�̗v�f���ׂĂ�
- �i����j�lj�����
+ コレクション全体を削除( <literal>DELETE</literal>
のSQLを一回)し、そして5つの要素すべてを
+ (一つずつ)追加する
</para>
</listitem>
</itemizedlist>
<para>
- Hibernate�͂��̏ꍇ��2�Ԗڂ̕��@����葬�����낤�Ƃ킩��قnj����͂���܂���B
- �i������Hibernate�����̂悤�Ɍ������Ƃ�]�܂����Ȃ��ł��傤�B���̂悤�ȐU�镑����
- �f�[�^�x�[�X�̃g���K�Ȃǂ��������邩�����܂���B�j
+ Hibernateはこの場合に2番目の方法がより速いだろうとわかるほど賢くはありません。
+ (そしてHibernateがこのように賢いことも望ましくないでしょう。このような振る舞いは
+ データベースのトリガなどを混乱させるかもしれません。)
</para>
<para>
-
�K���ɂ�A���̃R���N�V������̂āi�܂�Q�Ƃ��߂āj�A���݂̗v�f���ׂĎ��V�����R���N�V������
- �C���X�^���X��Ԃ����ƂŁA���ł���̐U�镑���i2�Ԗڂ̐헪�j�������邱�Ƃ��o���܂��B
- ���ɂ���͂ƂĂ�֗��ŋ��͂ł��B
+ 幸いにも、元のコレクションを捨て(つまり参照をやめて)、現在の要素をすべて持つ新しいコレクションの
+ インスタンスを返すことで、いつでもこの振る舞い(2番目の戦略)を強制することが出来ます。
+ 時にこれはとても便利で強力です。
</para>
<para>
- ������A�ꊇ�폜�� <literal>inverse="true"</literal>
��w�肵���R���N�V�����ɂ͍s���܂���B
+ もちろん、一括削除は <literal>inverse="true"</literal>
を指定したコレクションには行いません。
</para>
</sect2>
@@ -1229,28 +1231,28 @@
</sect1>
<sect1 id="performance-monitoring" revision="1">
- <title>�p�t�H�[�}���X�̃��j�^�����O</title>
+ <title>パフォーマンスのモニタリング</title>
<para>
- �œK���̓��j�^�����O��p�t�H�[�}���X�������l���Ȃ���Ώ\���ɍs���܂���B
- Hibernate�͓�������̂��ׂĂ͈̔͂̐��l����܂��B
- Hibernate�̓��v���� <literal>SessionFactory</literal>
�P�ʂŎ擾�\�ł��B
+ 最適化はモニタリングやパフォーマンスを示す数値がなければ十分に行えません。
+ Hibernateは内部処理のすべての範囲の数値を提供します。
+ Hibernateの統計情報は <literal>SessionFactory</literal> 単位で取得可能です。
</para>
<sect2 id="performance-monitoring-sf" revision="2">
- <title>SessionFactory�̃��j�^�����O</title>
+ <title>SessionFactoryのモニタリング</title>
<para>
- <literal>SessionFactory</literal>
�̃��g���N�X�ɃA�N�Z�X����ɂ�2�̕��@������܂��B
- �ŏ��̕��@�́A <literal>sessionFactory.getStatistics()</literal>
��Ăяo���A
- ������ <literal>Statistics</literal> �̓ǂݍ��݂�\����s���܂��B
+ <literal>SessionFactory</literal> のメトリクスにアクセスするには2つの方法があります。
+ 最初の方法は、 <literal>sessionFactory.getStatistics()</literal>
を呼び出し、
+ 自分で <literal>Statistics</literal> の読み込みや表示を行います。
</para>
<para>
- <literal>StatisticsService</literal>
MBean��L���ɂ��Ă���AHibernate��JMX��g����
- ���g���N�X�s���邱�Ƃ�ł��܂��B1��MBean���ׂĂ�
<literal>SessionFactory</literal>
- �ɑ��ėL���ɂ��邩�ASessionFactory���ƂɈ��MBean��L���ɂ��邱�Ƃ��o���܂��B
- �ŏ����̐ݒ��ł���ȉ��̃R�[�h���Ă��������B
+ <literal>StatisticsService</literal>
MBeanを有効にしていれば、HibernateはJMXを使って
+ メトリクスを発行することもできます。1つのMBeanをすべての
<literal>SessionFactory</literal>
+ に対して有効にするか、SessionFactoryごとに一つのMBeanを有効にすることが出来ます。
+ 最小限の設定例である以下のコードを見てください。
</para>
<programlisting><![CDATA[// MBean service registration for a
specific SessionFactory
@@ -1274,77 +1276,77 @@
server.registerMBean(stats, on); // Register the MBean on the
server]]></programlisting>
<para>
- TODO:
����͈Ӗ�������܂���B�ŏ��̃P�[�X�́AMBean�ڕ������Ďg�p���܂��B2�Ԗڂ̃P�[�X�́A
- �g���O��session factory�������Ă���JNDI����n���Ȃ���Ȃ�܂���B
-
<literal>hibernateStatsBean.setSessionFactoryJNDIName("my/JNDI/Name")</literal>
��g�����������B
+ TODO: これは意味がありません。最初のケースは、MBeanを直接復元して使用します。2番目のケースは、
+ 使う前にsession factoryが持っているJNDI名を渡さなければなりません。
+
<literal>hibernateStatsBean.setSessionFactoryJNDIName("my/JNDI/Name")</literal>
を使ってください。
</para>
<para>
- <literal>SessionFactory</literal>
�ɑ��ă��j�^�����O�̊J�n�i�I���j��s�����Ƃ��o���܂��B
+ <literal>SessionFactory</literal>
に対してモニタリングの開始(終了)を行うことが出来ます。
</para>
<itemizedlist>
<listitem>
<para>
- �ݒ莞�ɂ́A
<literal>hibernate.generate_statistics</literal> ��
<literal>false</literal> �ɂ��܂�
+ 設定時には、
<literal>hibernate.generate_statistics</literal> を
<literal>false</literal> にします
</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para>
- ���s���ɁA
<literal>sf.getStatistics().setStatisticsEnabled(true)</literal> �܂���
-
<literal>hibernateStatsBean.setStatisticsEnabled(true)</literal> ��Ăяo���܂�
+ 実行時に、
<literal>sf.getStatistics().setStatisticsEnabled(true)</literal> または
+
<literal>hibernateStatsBean.setStatisticsEnabled(true)</literal> を呼び出します
</para>
</listitem>
</itemizedlist>
<para>
- ���v�� <literal>clear()</literal>
���\�b�h��g���Ď蓮�Ń��Z�b�g���邱�Ƃ��o���܂��B
- �T�}���� <literal>logSummary()</literal>
���\�b�h��g����logger�ɑ��邱�Ƃ��o���܂�
- �iinfo���x���ł��j�B
+ 統計は <literal>clear()</literal> メソッドを使って手動でリセットすることが出来ます。
+ サマリは <literal>logSummary()</literal>
メソッドを使ってloggerに送ることが出来ます
+ (infoレベルです)。
</para>
</sect2>
<sect2 id="performance-monitoring-metrics"
revision="1">
- <title>���g���N�X</title>
+ <title>メトリクス</title>
<para>
- �����̂�̂�����܂��B���ׂĂ̎g�p�\�ȃJ�E���^��
<literal>Statistics</literal>
- �C���^�[�t�F�C�X��API�ɏ�����Ă���A3�̕��ނ�����܂��B
+ 多くのものがあります。すべての使用可能なカウンタは <literal>Statistics</literal>
+ インターフェイスのAPIに書かれており、3つの分類があります。
</para>
<itemizedlist>
<listitem>
<para>
- ���g���N�X�͈�ʓI�� <literal>Session</literal>
�̎g�����ƊW���Ă��܂��B
- �I�[�v�������Z�b�V�����̐���JDBC�R�l�N�V�����Ɗ֘A���Ă���̂Ɠ����ł��B
+ メトリクスは一般的な <literal>Session</literal> の使い方と関係しています。
+ オープンしたセッションの数がJDBCコネクションと関連しているのと同じです。
</para>
</listitem>
<listitem>
<para>
- ���g���N�X�͗v�f�A�R���N�V�����A�N�G����L���b�V���ȂǑS�̂�
- �W���Ă��܂��i�ʖ��̓O���[�o�����g���N�X�ł��j�B
+ メトリクスは要素、コレクション、クエリやキャッシュなど全体に
+ 関係しています(別名はグローバルメトリクスです)。
</para>
</listitem>
<listitem>
<para>
-
���g���N�X�̏ڍׂ͓���̃G���e�B�e�B�A�R���N�V�����A�N�G���A�L���b�V���̈�ɊW���Ă��܂��B
+ メトリクスの詳細は特定のエンティティ、コレクション、クエリ、キャッシュ領域に関係しています。
</para>
</listitem>
</itemizedlist>
<para>
-
��Ƃ��āA�L���b�V���̃q�b�g�A�q�b�g�~�X��A�v�f�A�R���N�V�����A�N�G���̊����A�N�G���̎��s��
- �K�v�ȕ��ώ��Ԃ�m�F�ł��܂��B�~���b�̐��l��Java�̋ߎ���邱�Ƃɒ��ӂ��Ă��������B
-
Hibernate��JVM�̐��x�ɐ�������A�v���b�g�t�H�[���ɂ���Ă�10�b�P�ʂł������m�łȂ��������܂���B
+ 例として、キャッシュのヒット、ヒットミスや、要素、コレクション、クエリの割合、クエリの実行に
+ 必要な平均時間を確認できます。ミリ秒の数値はJavaの近似を受けることに注意してください。
+ HibernateはJVMの精度に制限され、プラットフォームによっては10秒単位でしか正確でないかもしれません。
</para>
<para>
-
�P����getter�̓O���[�o�����g���N�X�i���Ȃ킿����̃G���e�B�e�B�A�R���N�V�����A�L���b�V���̈�Ȃǂɔ����Ȃ��j
-
�ɃA�N�Z�X���邽�߂Ɏg���܂��B����̃G���e�B�e�B�A�R���N�V�����A�L���b�V���̈�̃��g���N�X�́A
-
�����̖��O��A�N�G����HQL�ASQL�\���ɂ���ăA�N�Z�X���邱�Ƃ��o���܂��B����ɏڂ������́A
- <literal>Statistics</literal> �A
<literal>EntityStatistics</literal> �A
<literal>CollectionStatistics</literal>
- �A <literal>SecondLevelCacheStatistics</literal> �A
<literal>QueryStatistics</literal> API��javadoc��
- �Q�Ƃ��Ă��������B�ȉ��̃R�[�h�͊ȒP�ȗ�ł��B
+ 単純なgetterはグローバルメトリクス(すなわち特定のエンティティ、コレクション、キャッシュ領域などに縛られない)
+ にアクセスするために使います。特定のエンティティ、コレクション、キャッシュ領域のメトリクスは、
+ それらの名前や、クエリのHQL、SQL表現によってアクセスすることが出来ます。さらに詳しい情報は、
+ <literal>Statistics</literal> 、
<literal>EntityStatistics</literal> 、
<literal>CollectionStatistics</literal>
+ 、 <literal>SecondLevelCacheStatistics</literal> 、
<literal>QueryStatistics</literal> APIのjavadocを
+ 参照してください。以下のコードは簡単な例です。
</para>
<programlisting><![CDATA[Statistics stats =
HibernateUtil.sessionFactory.getStatistics();
@@ -1365,14 +1367,14 @@
log.info(Cat.class.getName() + " changed " + changes + "times"
);]]></programlisting>
<para>
- ���ׂẴG���e�B�e�B�A�R���N�V�����A�N�G���A�L���b�V���̈�ɑ��čs���ꍇ�́A
- <literal>getQueries()</literal> �A
<literal>getEntityNames()</literal>�A
- <literal>getCollectionRoleNames()</literal> �A
<literal>getSecondLevelCacheRegionNames()</literal> ���\�b�h��
- ���ꂼ��̖��O�̃��X�g��擾���邱�Ƃ��o���܂��B
+ すべてのエンティティ、コレクション、クエリ、キャッシュ領域に対して行う場合は、
+ <literal>getQueries()</literal> 、
<literal>getEntityNames()</literal>、
+ <literal>getCollectionRoleNames()</literal> 、
<literal>getSecondLevelCacheRegionNames()</literal> メソッドで
+ それぞれの名前のリストを取得することが出来ます。
</para>
</sect2>
</sect1>
-</chapter>
\ No newline at end of file
+</chapter>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/persistent_classes.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/persistent_classes.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/persistent_classes.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,28 +1,30 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="persistent-classes" revision="2">
- <title>�i���N���X</title>
+ <title>永続クラス</title>
<para>
- �i���N���X�̓r�W�l�X��̖��̃G���e�B�e�B�i�Ⴆ�AE�R�}�[�X�A�v���P�[�V�����̌ڋq�⒍���j
- ���������A�v���P�[�V�����̃N���X�ł��B
- �i���N���X�̂��ׂẴC���X�^���X���i����Ԃł���ƌ��Ȃ����킯�ł͂���܂���B
-
�C���X�^���X�͋t�Ɉꎞ�I�itransient�j�ł�������A������ԁidetached�j�ł������肷�邩�����܂���B
+ 永続クラスはビジネス上の問題のエンティティ(例えば、Eコマースアプリケーションの顧客や注文)
+ を実装するアプリケーションのクラスです。
+ 永続クラスのすべてのインスタンスが永続状態であると見なされるわけではありません。
+ インスタンスは逆に一時的(transient)であったり、分離状態(detached)であったりするかもしれません。
</para>
<para>
- Plain Old Java Object (POJO)�v���O���~���O���f���Ƃ��Ă�m����
- �������̒P���ȃ��[���ɏ]���Ȃ�AHibernate�͍ł�悭�����܂��B
- �����������̃��[���͓����̂ł͂���܂���B
- ����Hibernate3�͉i���I�u�W�F�N�g�̐����ɂقƂ�lj��̑O���u���Ă��܂���B
- �h���C�����f���͑��̕��@�ŕ\�����邱�Ƃ�ł��܂��B
- �Ⴆ�� <literal>Map</literal> �C���X�^���X�̃c���[��g�����@������܂��B
+ Plain Old Java Object (POJO)プログラミングモデルとしても知られる
+ いくつかの単純なルールに従うなら、Hibernateは最もよく働きます。
+ しかしこれらのルールは難しいものではありません。
+ 実際Hibernate3は永続オブジェクトの性質にほとんど何の前提も置いていません。
+ ドメインモデルは他の方法で表現することもできます。
+ 例えば <literal>Map</literal> インスタンスのツリーを使う方法があります。
</para>
<sect1 id="persistent-classes-pojo">
- <title>�P����POJO�̗�</title>
+ <title>単純なPOJOの例</title>
<para>
- �قƂ�ǂ�Java�A�v���P�[�V�����ɂ̓l�R�Ȃ̓�����\������i���N���X���K�v�ł��B
+ ほとんどのJavaアプリケーションにはネコ科の動物を表現する永続クラスが必要です。
</para>
<programlisting><![CDATA[package eg;
@@ -105,51 +107,51 @@
}]]></programlisting>
<para>
- �]���ׂ�4�̃��[��������܂��F
+ 従うべき4つのルールがあります:
</para>
<sect2 id="persistent-classes-pojo-constructor"
revision="1">
- <title>�����̂Ȃ��R���X�g���N�^���������</title>
+ <title>引数のないコンストラクタを実装する</title>
<para>
- <literal>Cat</literal> �ɂ͈����̂Ȃ��R���X�g���N�^������܂��B
- Hibernate�� <literal>Constructor.newInstance()</literal>
��g���ĉi���N���X��
- �C���X�^���X����s����悤�ɁA���ׂẲi���N���X�ɂ̓f�t�H���g�R���X�g���N�^
- �ipublic�łȂ��Ă�\���܂���j���Ȃ���Ȃ�܂���B
- Hibernate�̎��s���v���L�V�����̂��߂ɁA���Ȃ��Ƃ�
<emphasis>package</emphasis>
- �̉������f�t�H���g�R���X�g���N�^���������߂��܂��B
+ <literal>Cat</literal> には引数のないコンストラクタがあります。
+ Hibernateが <literal>Constructor.newInstance()</literal>
を使って永続クラスの
+ インスタンス化を行えるように、すべての永続クラスにはデフォルトコンストラクタ
+ (publicでなくても構いません)がなければなりません。
+ Hibernateの実行時プロキシ生成のために、少なくとも <emphasis>package</emphasis>
+ の可視性を持つデフォルトコンストラクタを強くお勧めします。
</para>
</sect2>
<sect2 id="persistent-classes-pojo-identifier"
revision="2">
- <title>���ʎq�v���p�e�B��p�ӂ���i�I�v�V�����j</title>
+ <title>識別子プロパティを用意する(オプション)</title>
<para>
- <literal>Cat</literal> �ɂ� <literal>id</literal>
�Ƃ����v���p�e�B������܂��B
- ���̃v���p�e�B�̓f�[�^�x�[�X�e�[�u���̎�L�[�J�����փ}�b�s���O����܂��B
- ���̃v���p�e�B�̖��O�͉��ł�\���܂��A�^�͂ǂ̂悤�ȃv���~�e�B�u�^�ł�A
-
�v���~�e�B�u�́u���b�p�[�v�^�ł�A<literal>java.lang.String</literal> ��
- <literal>java.util.Date</literal> �ł�\���܂���B
- �i������K�V�[�f�[�^�x�[�X�e�[�u���������L�[���Ȃ�A
- ���q�ׂ��悤�Ȍ^�̃v���p�e�B�����[�U��`�̃N���X��g�����Ƃ����\�ł��B
- ��ŕ������ʎq�̐߂��Ă��������B�j
+ <literal>Cat</literal> には <literal>id</literal>
というプロパティがあります。
+ このプロパティはデータベーステーブルの主キーカラムへマッピングされます。
+ このプロパティの名前は何でも構いませんし、型はどのようなプリミティブ型でも、
+ プリミティブの「ラッパー」型でも、<literal>java.lang.String</literal> や
+ <literal>java.util.Date</literal> でも構いません。
+ (もしレガシーデータベーステーブルが複合キーを持つならば、
+ 今述べたような型のプロパティを持つユーザ定義のクラスを使うことさえ可能です。
+ 後で複合識別子の節を見てください。)
</para>
<para>
- ���ʎq�v���p�e�B�͌����ɂ̓I�v�V�����ł��B
- �����ȗ����āAHibernate�ɓ���I�ɃI�u�W�F�N�g�̎��ʎq��ǐՂ����邱�Ƃ͉\�ł��B
- �������������߂͂��܂���B
+ 識別子プロパティは厳密にはオプションです。
+ これを省略して、Hibernateに内部的にオブジェクトの識別子を追跡させることは可能です。
+ しかしおすすめはしません。
</para>
<para>
- ���ۂɁA���ʎq�v���p�e�B��錾����N���X���������p�\�ȋ@�\������������܂��F
+ 実際に、識別子プロパティを宣言するクラスだけが利用可能な機能がいくつかあります:
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
-
�����I�u�W�F�N�g�̘A���I�ȍĒlj��i�J�X�P�[�h�X�V��J�X�P�[�h�}�[�W�j�B
- <xref linkend="objectstate-transitive"/>
��Q�Ƃ��Ă��������B
+ 分離オブジェクトの連鎖的な再追加(カスケード更新やカスケードマージ)。
+ <xref linkend="objectstate-transitive"/>
を参照してください。
</para>
</listitem>
<listitem>
@@ -165,47 +167,47 @@
</itemizedlist>
<para>
- �i���N���X�ɂ́A��т������O�̎��ʎq�v���p�e�B���`���邱�Ƃ����߂��܂��B
- �����null�l�����(�܂�v���~�e�B�u�ł͂Ȃ�)�^��g���������悢�ł��傤�B
+ 永続クラスには、一貫した名前の識別子プロパティを定義することをお勧めします。
+ さらにnull値を取れる(つまりプリミティブではない)型を使った方がよいでしょう。
</para>
</sect2>
<sect2 id="persistent-classes-pojo-final">
- <title>final�N���X�ɂ��Ȃ��i�I�v�V�����j</title>
+ <title>finalクラスにしない(オプション)</title>
<para>
- Hibernate�̒��S�I�ȓ����ł��� <emphasis>�v���L�V</emphasis> �́A
- �i���N���X��final�łȂ����ƁA�܂��̓��\�b�h��S��public�Ő錾���Ă���
- �C���^�[�t�F�C�X����������Ă��邩�Ɉˑ����Ă��܂��B
+ Hibernateの中心的な特徴である <emphasis>プロキシ</emphasis> は、
+ 永続クラスがfinalでないこと、またはメソッドを全部publicで宣言している
+ インターフェイスが実装されているかに依存しています。
</para>
<para>
- Hibernate�ŃC���^�[�t�F�C�X��������Ă��Ȃ�
<literal>final</literal> �N���X��i�������邱�Ƃ͂ł��܂����A
- �x���֘A�t�F�b�`�ɑ��ăv���L�V��g�����Ƃ͂ł��Ȃ��Ȃ�܂��B
- ����̓p�t�H�[�}���X�`���[�j���O�ւ̑I�����߂邱�ƂɂȂ�܂��B
+ Hibernateでインターフェイスを実装していない <literal>final</literal>
クラスを永続化することはできますが、
+ 遅延関連フェッチに対してプロキシを使うことはできなくなります。
+ これはパフォーマンスチューニングへの選択肢を狭めることになります。
</para>
<para>
- final�ł͂Ȃ��N���X�� <literal>public final</literal>
���\�b�h���`���邱�Ƃ����ׂ��ł��B
- <literal>public final</literal>
���\�b�h���N���X��g��������A
- <literal>lazy="false"</literal>
�Ɛݒ肵�Ė����I�Ƀv���L�V���ɂ��Ȃ���Ȃ�܂���B
+ finalではないクラスで <literal>public final</literal>
メソッドを定義することも避けるべきです。
+ <literal>public final</literal> メソッドを持つクラスを使いたければ、
+ <literal>lazy="false"</literal>
と設定して明示的にプロキシを無効にしなければなりません。
</para>
</sect2>
<sect2 id="persistent-classes-pojo-accessors"
revision="2">
-
<title>�i���t�B�[���h�ɑ���A�N�Z�T�ƃ~���[�e�[�^���`����i�I�v�V�����j</title>
+ <title>永続フィールドに対するアクセサとミューテータを定義する(オプション)</title>
<para>
- <literal>Cat</literal>
�ł͂��ׂẲi���t�B�[���h�ɑ��ăA�N�Z�T���\�b�h���`���Ă��܂��B
- ���̑�����ORM�c�[���́A�i���C���X�^���X�ϐ��ډi�������܂��B
- �������̓����[�V���i���X�L�[�}�ƃN���X�̓���\������������ǂ��ƐM���Ă��܂��B
- �f�t�H���g�ł́AHibernate��JavaBean�X�^�C���̃v���p�e�B��i�������A
+ <literal>Cat</literal> ではすべての永続フィールドに対してアクセサメソッドを定義しています。
+ 他の多くのORMツールは、永続インスタンス変数を直接永続化します。
+ 私たちはリレーショナルスキーマとクラスの内部構造を分離する方が良いと信じています。
+ デフォルトでは、HibernateはJavaBeanスタイルのプロパティを永続化し、
<literal>getFoo</literal>,
<literal>isFoo</literal>, <literal>setFoo</literal>
- �`���̃��\�b�h����F�����܂��B
-
�������K�v�Ȃ�A����̃v���p�e�B�ɑ��āA���ڂ̃t�B�[���h�A�N�Z�X�ɐ�ւ��邱�Ƃ͉\�ł��B
+ 形式のメソッド名を認識します。
+ しかし必要なら、特定のプロパティに対して、直接のフィールドアクセスに切り替えることは可能です。
</para>
<para>
- �v���p�e�B��public�Ő錾����K�v�� <emphasis>����܂���</emphasis>
�B
- Hibernate�̓f�t�H���g�A<literal>protected</literal> �������
<literal>private</literal>
- ��get / set�̃y�A���v���p�e�B��i�������邱�Ƃ��ł��܂��B
+ プロパティはpublicで宣言する必要は <emphasis>ありません</emphasis> 。
+ Hibernateはデフォルト、<literal>protected</literal> もしくは
<literal>private</literal>
+ のget / setのペアを持つプロパティを永続化することができます。
</para>
</sect2>
@@ -213,11 +215,11 @@
</sect1>
<sect1 id="persistent-classes-inheritance">
- <title>�p���̎���</title>
+ <title>継承の実装</title>
<para>
- �T�u�N���X��1�Ԗڂ�2�Ԗڂ̃��[������Ȃ���Ȃ�܂���B
- �T�u�N���X�̓X�[�p�[�N���X <literal>Cat</literal>
���环�ʎq�v���p�e�B��p�����܂��B
+ サブクラスも1番目と2番目のルールを守らなければなりません。
+ サブクラスはスーパークラス <literal>Cat</literal> から識別子プロパティを継承します。
</para>
<programlisting><![CDATA[package eg;
@@ -235,60 +237,60 @@
</sect1>
<sect1 id="persistent-classes-equalshashcode"
revision="1">
- <title><literal>equals()</literal> ��
<literal>hashCode()</literal> �̎���</title>
+ <title><literal>equals()</literal> と
<literal>hashCode()</literal> の実装</title>
<para>
- �ȉ��̏��̏ꍇ�A
- <literal>equals()</literal> ��
<literal>hashCode()</literal> ���\�b�h��I�[�o�[���C�h���Ȃ���Ȃ�܂���A
+ 以下の条件の場合、
+ <literal>equals()</literal> と
<literal>hashCode()</literal> メソッドをオーバーライドしなければなりません、
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- �i���N���X�̃C���X�^���X�� <literal>Set</literal>
�ɒu���ꍇ�B
- �i����͑��l�̊֘A��\�����邨�����߂̕��@�ł��j
- <emphasis>�����ē�����</emphasis>
+ 永続クラスのインスタンスを <literal>Set</literal> に置く場合。
+ (これは多値の関連を表現するおすすめの方法です)
+ <emphasis>そして同時に</emphasis>
</para>
</listitem>
<listitem>
<para>
- �����C���X�^���X��Z�b�V�����֍Ēlj�����ꍇ�B
+ 分離インスタンスをセッションへ再追加する場合。
</para>
</listitem>
</itemizedlist>
<para>
- Hibernate�́A�i��ID�i�f�[�^�x�[�X�̍s�j�ƁA����̃Z�b�V�����X�R�[�v���
- ����ł���JavaID�Ƃ������ł��邱�Ƃ�ۏ��܂��B
- �ł�����قȂ�Z�b�V�����Ō��������C���X�^���X��g�ݍ��킹��ꍇ�A
- <literal>Set</literal>
�ɈӖ��̂���Z�}���e�B�N�X�������悤�Ǝv���Ă���Ȃ�
- ������<literal>equals()</literal> ��
<literal>hashCode()</literal>
- ��������Ȃ���Ȃ�܂���B
+ Hibernateは、永続ID(データベースの行)と、特定のセッションスコープ内に
+ 限定ですがJavaIDとが等価であることを保証します。
+ ですから異なるセッションで検索したインスタンスを組み合わせる場合、
+ <literal>Set</literal> に意味のあるセマンティクスを持たせようと思っているなら
+ すぐに<literal>equals()</literal> と
<literal>hashCode()</literal>
+ を実装しなければなりません。
</para>
<para>
- �ł�����ȕ��@�́A�����̃I�u�W�F�N�g�̎��ʎq�̒l�̔�r�ɂ����
<literal>equals()</literal>��
- <literal>hashCode()</literal> �����������@�ł��B
- �l�������Ȃ�A���҂̓f�[�^�x�[�X�̓����s�łȂ���Ȃ�Ȃ����ߓ������Ȃ�܂��B
- �i���҂� <literal>Set</literal> �ɒlj�����Ă�A
- <literal>Set</literal> �ɂ�1�̗v�f�����Ȃ����ƂɂȂ�܂��j
- �c�O�Ȃ��ƂɁA�������ꂽ���ʎq�ɂ͂��̃A�v���[�`��g�����Ƃ��ł��܂���B
- Hibernate�͉i�������ꂽ�I�u�W�F�N�g�֎��ʎq�̒l�������邾���ł���A
- �V�����쐬���ꂽ�C���X�^���X�͂ǂ̂悤�Ȏ��ʎq�̒l������Ă��܂���B
- ����ɁA�C���X�^���X���Z�[�u����Ă��炸�A���� <literal>Set</literal>
�̒��ɂ���A
- �Z�[�u����ƃI�u�W�F�N�g�֎��ʎq�̒l�������邱�ƂɂȂ�܂��B
- ��� <literal>equals()</literal> ��
<literal>hashCode()</literal> �����ʎq�̒l�Ɋ�Â��Ă���Ȃ�A
- �n�b�V���R�[�h���ύX������ <literal>Set</literal> �̋K�j���܂��B
- ���̖��ɂ��Ă̊��S�ȋc�_�́AHibernate�̃E�F�u�T�C�g���Ă��������B
- �����Hibernate�̖��ł͂Ȃ��A�I�u�W�F�N�g�̓��ꐫ�Ɠ������ɂ��ẮA
- �ʏ��Java�̃Z�}���e�B�N�X�ł��邱�Ƃɒ��ӂ��Ă��������B
+ 最も明白な方法は、両方のオブジェクトの識別子の値の比較によって <literal>equals()</literal>と
+ <literal>hashCode()</literal> を実装する方法です。
+ 値が同じなら、両者はデータベースの同じ行でなければならないため等しくなります。
+ (両者が <literal>Set</literal> に追加されても、
+ <literal>Set</literal> には1個の要素しかないことになります)
+ 残念なことに、生成された識別子にはこのアプローチを使うことができません。
+ Hibernateは永続化されたオブジェクトへ識別子の値を代入するだけであり、
+ 新しく作成されたインスタンスはどのような識別子の値も持っていません。
+ さらに、インスタンスがセーブされておらず、現在 <literal>Set</literal> の中にあれば、
+ セーブするとオブジェクトへ識別子の値を代入することになります。
+ もし <literal>equals()</literal> と
<literal>hashCode()</literal> が識別子の値に基づいているなら、
+ ハッシュコードが変更されると <literal>Set</literal> の規約が破られます。
+ この問題についての完全な議論は、Hibernateのウェブサイトを見てください。
+ これはHibernateの問題ではなく、オブジェクトの同一性と等価性についての、
+ 通常のJavaのセマンティクスであることに注意してください。
</para>
<para>
- <emphasis>�r�W�l�X�L�[�̓�����</emphasis> ��g���āA
- <literal>equals()</literal> ��
<literal>hashCode()</literal> ��������邱�Ƃ����߂��܂��B
- �r�W�l�X�L�[�̓������Ƃ́A<literal>equals()</literal>
���\�b�h���A�r�W�l�X�L�[�A
-
�܂茻���̐��E�ɂ����ăC���X�^���X����肷��L�[�i<emphasis>���R</emphasis> ���L�[�j
- ��`������v���p�e�B�������r���邱�Ƃ�Ӗ����܂��B
+ <emphasis>ビジネスキーの等価性</emphasis> を使って、
+ <literal>equals()</literal> と
<literal>hashCode()</literal> を実装することをお勧めします。
+ ビジネスキーの等価性とは、<literal>equals()</literal> メソッドが、ビジネスキー、
+ つまり現実の世界においてインスタンスを特定するキー(<emphasis>自然</emphasis> 候補キー)
+ を形成するプロパティだけを比較することを意味します。
</para>
<programlisting><![CDATA[public class Cat {
@@ -316,39 +318,39 @@
}]]></programlisting>
<para>
- �r�W�l�X�L�[�̓f�[�^�x�[�X�̎�L�[���قLj���ł���K�v�͂Ȃ����Ƃɒ��ӂ��Ă�������
- �i<xref linkend="transactions-basics-identity"/>
�����������j�B
- �X�V�s�ȃv���p�e�B��j�[�N�ȃv���p�e�B�́A�ʏ�r�W�l�X�L�[�̂悢���ł��B
+ ビジネスキーはデータベースの主キー候補ほど安定である必要はないことに注意してください
+ (<xref linkend="transactions-basics-identity"/> を見てください)。
+ 更新不可なプロパティやユニークなプロパティは、通常ビジネスキーのよい候補です。
</para>
</sect1>
<sect1 id="persistent-classes-dynamicmodels">
- <title>���I���f��</title>
+ <title>動的モデル</title>
<para>
- <emphasis>�ȉ��̋@�\�͌��ݎ����i�K�ɂ���ƌ��Ȃ���Ă���A
- �߂������ύX�����\�������邱�Ƃɒ��ӂ��Ă��������B</emphasis>
+ <emphasis>以下の機能は現在実験段階にあると見なされており、
+ 近い将来変更される可能性があることに注意してください。</emphasis>
</para>
<para>
-
�i���G���e�B�e�B�́A�K��������s����POJO�N���X��JavaBean�I�u�W�F�N�g�ŕ\������K�v�͂���܂���B
- Hibernate�́i���s���� <literal>Map</literal> ��
<literal>Map</literal> ��g���j���I���f���ƁA
- DOM4J�c���[�Ƃ��ẴG���e�B�e�B�̕\����T�|�[�g���܂��B
- ���̃A�v���[�`��g���Ɖi���N���X�������A�}�b�s���O�t�@�C�������������ƂɂȂ�܂��B
+ 永続エンティティは、必ずしも実行時にPOJOクラスやJavaBeanオブジェクトで表現する必要はありません。
+ Hibernateは(実行時に <literal>Map</literal> の
<literal>Map</literal> を使う)動的モデルと、
+ DOM4Jツリーとしてのエンティティの表現もサポートします。
+ このアプローチを使うと永続クラスを書かず、マッピングファイルだけを書くことになります。
</para>
<para>
- �f�t�H���g�ł́AHibernate�͒ʏ��POJO���[�h�œ��삵�܂��B
- <literal>default_entity_mode</literal> �ݒ�I�v�V������g���āA
- ����� <literal>SessionFactory</literal>
�ɑ���f�t�H���g�̃G���e�B�e�B�\�����[�h��ݒ肷�邱�Ƃ��ł��܂�
- �i<xref linkend="configuration-optional-properties"/>
�����������j�B
+ デフォルトでは、Hibernateは通常のPOJOモードで動作します。
+ <literal>default_entity_mode</literal> 設定オプションを使って、
+ 特定の <literal>SessionFactory</literal>
に対するデフォルトのエンティティ表現モードを設定することができます
+ (<xref linkend="configuration-optional-properties"/>
を見てください)。
</para>
<para>
- �ȉ��̗�ł� <literal>Map</literal> ��g�����\����Љ�܂��B
- �܂��}�b�s���O�t�@�C���ŁA�N���X���̑���Ɂi�܂��͂���ɉ����āj
- <literal>entity-name</literal> ���`���Ȃ���Ȃ�܂���F
+ 以下の例では <literal>Map</literal> を使った表現を紹介します。
+ まずマッピングファイルで、クラス名の代わりに(またはそれに加えて)
+ <literal>entity-name</literal> を定義しなければなりません:
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -386,14 +388,14 @@
</hibernate-mapping>]]></programlisting>
<para>
- �֘A���^�[�Q�b�g�̃N���X����g���Ē�`���Ă����Ƃ��Ă�A
- �֘A�̃^�[�Q�b�g�^��POJO�ł͂Ȃ����I�ȃG���e�B�e�B�ł�\��Ȃ����Ƃɒ��ӂ��Ă��������B
+ 関連がターゲットのクラス名を使って定義していたとしても、
+ 関連のターゲット型もPOJOではなく動的なエンティティでも構わないことに注意してください。
</para>
<para>
- <literal>SessionFactory</literal>
�ɑ��ăf�t�H���g�̃G���e�B�e�B���[�h��
- <literal>dynamic-map</literal> �ɐݒ肵����A
- ���s���� <literal>Map</literal> ��
<literal>Map</literal> ��g�����Ƃ��ł��܂��F
+ <literal>SessionFactory</literal> に対してデフォルトのエンティティモードを
+ <literal>dynamic-map</literal> に設定した後、
+ 実行時に <literal>Map</literal> の <literal>Map</literal>
を使うことができます:
</para>
<programlisting><![CDATA[Session s = openSession();
@@ -419,15 +421,15 @@
s.close();]]></programlisting>
<para>
- ���I�ȃ}�b�s���O�̗��_�́A�G���e�B�e�B�N���X�̎�����K�v�Ƃ��Ȃ����߁A
- �v���g�^�C�s���O�ɗv����^�[���A���E���h�^�C���������Ƃ������Ƃł��B
-
�������R���p�C�����̌^�`�F�b�N���Ȃ��̂ŁA���s���ɔ��ɑ����̗�O��������Ȃ���Ȃ�Ȃ��ł��傤�B
- Hibernate�}�b�s���O�̂������ŁA�f�[�^�x�[�X�X�L�[�}�͗e�Ղɐ��K���ł��A���S�ɂȂ�A
- ��œK�ȃh���C�����f���̎�����lj����邱�Ƃ��\�ɂȂ�܂��B
+ 動的なマッピングの利点は、エンティティクラスの実装を必要としないため、
+ プロトタイピングに要するターンアラウンドタイムが早いということです。
+ しかしコンパイル時の型チェックがないので、実行時に非常に多くの例外処理を扱わなければならないでしょう。
+ Hibernateマッピングのおかげで、データベーススキーマは容易に正規化でき、健全になり、
+ 後で適切なドメインモデルの実装を追加することが可能になります。
</para>
<para>
- �G���e�B�e�B�\�����[�h�� <literal>Session</literal>
���Ƃɐݒ肷�邱�Ƃ�\�ł��B
+ エンティティ表現モードは <literal>Session</literal> ごとに設定することも可能です。
</para>
<programlisting><![CDATA[Session dynamicSession =
pojoSession.getSession(EntityMode.MAP);
@@ -445,18 +447,18 @@
<para>
- <literal>EntityMode</literal> ��g����
<literal>getSession()</literal>
- �̌Ăяo���� <literal>SessionFactory</literal> �ł͂Ȃ�
<literal>Session</literal>
- API�ɂ��邱�Ƃɒ��ӂ��Ă��������B
- ���̕��@�ł́A�V���� <literal>Session</literal>
�́A�x�[�X�ƂȂ�JDBC�R�l�N�V�����A
- �g�����U�N�V�����A���̑��̃R���e�L�X�g�����L���܂��B
- �����2�Ԗڂ� <literal>Session</literal> �ł�
<literal>flush()</literal> �� <literal>close()</literal>
- ��ĂԕK�v���Ȃ��Ƃ������ƁA���̂��߃g�����U�N�V�����ƃR�l�N�V�����̊Ǘ���
- 1�Ԗڂ̍�ƒP��(Unit of Work)�ɔC���邱�Ƃ��ł���Ƃ������Ƃł��B
+ <literal>EntityMode</literal> を使った
<literal>getSession()</literal>
+ の呼び出しは <literal>SessionFactory</literal> ではなく
<literal>Session</literal>
+ APIにあることに注意してください。
+ その方法では、新しい <literal>Session</literal> は、ベースとなるJDBCコネクション、
+ トランザクション、その他のコンテキスト情報を共有します。
+ これは2番目の <literal>Session</literal> では
<literal>flush()</literal> と <literal>close()</literal>
+ を呼ぶ必要がないということ、そのためトランザクションとコネクションの管理を
+ 1番目の作業単位(Unit of Work)に任せることができるということです。
</para>
<para>
- XML�\���̔\�͂ɂ��Ă̂���Ȃ���� <xref linkend="xml"/>
�Ō�����܂��B
+ XML表現の能力についてのさらなる情報は <xref linkend="xml"/> で見つかります。
</para>
</sect1>
@@ -465,30 +467,30 @@
<title>Tuplizer</title>
<para>
- <literal>org.hibernate.tuple.Tuplizer</literal>
�Ƃ��̃T�u�C���^�[�t�F�C�X�́A
- �\���� <literal>org.hibernate.EntityMode</literal> �𗘗p���āA
- �f�[�^�f�Ђ̂���\���̊Ǘ��ɐӔC�����܂��B
- �^����ꂽ�f�[�^�f�Ђ�f�[�^�\���Ƃ��čl����Ȃ�ATuplizer�͂��̂悤�ȃf�[�^�\����
- �ǂ̂悤�ɍ쐬���邩��m��A���̂悤�ȃf�[�^�\������ǂ̂悤�ɒl�𒊏o���A
- �������邩��m���Ă��܂��B
- �Ⴆ��POJO�G���e�B�e�B���[�h�ł́A�Ή�����Tuplizer�̓R���X�g���N�^��ʂ��āA
- POJO��ǂ̂悤�ɍ쐬���邩�A��`���ꂽ�v���p�e�B�A�N�Z�T��g���A
- POJO�v���p�e�B�ɂǂ̂悤�ɃA�N�Z�X���邩��m��܂��B
- Tuplizer�ɂ͓�̃n�C���x���̌^������܂��B
- �����́A<literal>org.hibernate.tuple.EntityTuplizer</literal> ��
- <literal>org.hibernate.tuple.ComponentTuplizer</literal>
�C���^�[�t�F�C�X�ŕ\������܂��B
- <literal>EntityTuplizer</literal>
�͏�ŏq�ׂ��悤�ȃG���e�B�e�B�Ɋւ���_��̊Ǘ��ɐӔC�����܂��B
- ����A<literal>ComponentTuplizer</literal>
�̓R���|�[�l���g�Ɋւ���_��̊Ǘ��ɐӔC�����܂��B
+ <literal>org.hibernate.tuple.Tuplizer</literal> とそのサブインターフェイスは、
+ 表現の <literal>org.hibernate.EntityMode</literal> を利用して、
+ データ断片のある表現の管理に責任を持ちます。
+ 与えられたデータ断片をデータ構造として考えるなら、Tuplizerはそのようなデータ構造を
+ どのように作成するかを知り、そのようなデータ構造からどのように値を抽出し、
+ 注入するかを知っています。
+ 例えばPOJOエンティティモードでは、対応するTuplizerはコンストラクタを通して、
+ POJOをどのように作成するか、定義されたプロパティアクセサを使い、
+ POJOプロパティにどのようにアクセスするかを知ります。
+ Tuplizerには二つのハイレベルの型があります。
+ それらは、<literal>org.hibernate.tuple.EntityTuplizer</literal> と
+ <literal>org.hibernate.tuple.ComponentTuplizer</literal>
インターフェイスで表現されます。
+ <literal>EntityTuplizer</literal>
は上で述べたようなエンティティに関する契約の管理に責任を持ちます。
+ 一方、<literal>ComponentTuplizer</literal>
はコンポーネントに関する契約の管理に責任を持ちます。
</para>
<para>
- ���[�U�͓Ǝ���Tuplizer�ɍ����ւ��邱�Ƃ�\�ł��B
- �����炭dynamic-map entity-mode�̍ۂ�
<literal>java.util.HashMap</literal> ��g���̂ł͂Ȃ��A
- <literal>java.util.Map</literal> �̎������K�v�ł��傤�B
- ������́A�����炭�f�t�H���g�̂�̂ł͂Ȃ��A�ʂ̃v���L�V�����헪�̒�`���K�v�ł��傤�B
- ���҂Ƃ�A�J�X�^����Tuplizer�������`���邱�ƂŒB������܂��B
-
Tuplizer�̒�`�́A�Ǘ����悤�Ƃ���G���e�B�e�B��R���|�[�l���g�̃}�b�s���O�Ɍ��ѕt�����܂��B
- �ڋq�G���e�B�e�B�̗�ɖ߂�ƁF
+ ユーザは独自のTuplizerに差し替えることも可能です。
+ おそらくdynamic-map entity-modeの際に
<literal>java.util.HashMap</literal> を使うのではなく、
+ <literal>java.util.Map</literal> の実装が必要でしょう。
+ もしくは、おそらくデフォルトのものではなく、別のプロキシ生成戦略の定義が必要でしょう。
+ 両者とも、カスタムのTuplizer実装を定義することで達成されます。
+ Tuplizerの定義は、管理しようとするエンティティやコンポーネントのマッピングに結び付けられます。
+ 顧客エンティティの例に戻ると:
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -531,7 +533,7 @@
</sect1>
<para>
- TODO: �v���p�e�B�ƃv���L�V�p�b�P�[�W�̃��[�U�g���t���[�����[�N�������邱��
+ TODO: プロパティとプロキシパッケージのユーザ拡張フレームワークを文書化すること
</para>
</chapter>
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/preface.xml
===================================================================
--- core/trunk/documentation/manual/ja-JP/src/main/docbook/content/preface.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++ core/trunk/documentation/manual/ja-JP/src/main/docbook/content/preface.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,145 +1,144 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
-
+<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<preface id="preface" revision="2">
- <title>�O����</title>
+ <title>前書き</title>
<para>
-
�����̊�Ɗ��ɂ����āA�I�u�W�F�N�g�w���\�t�g�E�F�A�ƃ����[�V���i���f�[�^�x�[�X�Ɋւ���Ƃ�
- �ώG�Ŗc��Ȏ��Ԃ�K�v�Ƃ��܂��B
- Hibernate��Java���̃I�u�W�F�N�g/�����[�V���i���}�b�s���O�c�[���ł��B
- �I�u�W�F�N�g/�����[�V���i���}�b�s���O�iORM�j�Ƃ́A
- �I�u�W�F�N�g���f������SQL�x�[�X�X�L�[�}�̃����[�V���i���f�[�^���f���ւƁA
- �f�[�^�\����}�b�s���O����i�Ή��t����j�Z�p�̂��Ƃł��B
+ 今日の企業環境において、オブジェクト指向ソフトウェアとリレーショナルデータベースに関わる作業は
+ 煩雑で膨大な時間を必要とします。
+ HibernateはJava環境のオブジェクト/リレーショナルマッピングツールです。
+ オブジェクト/リレーショナルマッピング(ORM)とは、
+ オブジェクトモデルからSQLベーススキーマのリレーショナルデータモデルへと、
+ データ表現をマッピングする(対応付ける)技術のことです。
</para>
<para>
-
Hibernate��Java�N���X����f�[�^�x�[�X�e�[�u���ցi������Java�f�[�^�^����SQL�f�[�^�^�ցj
- �̃}�b�s���O�������邾���ł͂Ȃ��A�f�[�^�̃N�G���ƕ����̎d�g�݂���܂��B
- ���̂�������SQL��JDBC��g�������Ƃł̃f�[�^�����ɔ�₳��Ă����J�����Ԃ�啝�ɍ팸�ł��܂��B
+ HibernateはJavaクラスからデータベーステーブルへ(そしてJavaデータ型からSQLデータ型へ)
+ のマッピングを処理するだけではなく、データのクエリと復元の仕組みも提供します。
+ このおかげでSQLとJDBCを使った手作業でのデータ処理に費やされていた開発時間を大幅に削減できます。
</para>
<para>
-
Hibernate�̍ŏI�ڕW�́A�f�[�^�̉i�����Ɋւ���ʓI�ȃv���O���~���O��Ƃ�95������J���҂������邱�Ƃł��B
- Hibernate�̓r�W�l�X���W�b�N�̎����ɃX�g�A�h�v���V�[�W����g��
- �f�[�^���S�A�v���P�[�V�����ɑ��Ẵx�X�g�\�����[�V�����ł���ɗ��܂�܂���B
-
�I�u�W�F�N�g�w���h���C�����f����Java�x�[�X�̒��ԑw�ł̃r�W�l�X���W�b�N�ɑ��čł��ɗ����܂��B
- ������Hibernate�̓x���_�ŗL��SQL�R�[�h��팸�܂��̓J�v�Z����������A
- �\�`������I�u�W�F�N�g�̃O���t�ւƃ��U���g�Z�b�g��ϊ�����Ȃǂ́A
- ��ʓI�ȃ^�X�N�ɂ�𗧂ł��傤�B
+ Hibernateの最終目標は、データの永続化に関わる一般的なプログラミング作業の95%から開発者を解放することです。
+ Hibernateはビジネスロジックの実装にストアドプロシージャを使う
+ データ中心アプリケーションに対してのベストソリューションであるに留まりません。
+ オブジェクト指向ドメインモデルとJavaベースの中間層でのビジネスロジックに対して最も役に立ちます。
+ しかしHibernateはベンダ固有のSQLコードを削減またはカプセル化したり、
+ 表形式からオブジェクトのグラフへとリザルトセットを変換するなどの、
+ 一般的なタスクにも役立つでしょう。
</para>
<para>
- Hibernate��I�u�W�F�N�g/�����[�V���i���}�b�s���O�A
- ����ɂ�Java�����߂Ă̕��́A�ȉ��̃X�e�b�v�ɏ]���Ă��������F
+ Hibernateやオブジェクト/リレーショナルマッピング、
+ さらにはJavaが初めての方は、以下のステップに従ってください:
</para>
<orderedlist>
<listitem>
<para>
- <xref linkend="tutorial"/> ��ǂ�ł��������B
- �i�K�I�ɉ����Ă����܂��B
- �`���[�g���A���̃\�[�X�R�[�h�̓f�B�X�g���r���[�V������
- <literal>doc/reference/tutorial</literal>
�f�B���N�g���Ɋ܂܂�Ă��܂��B
+ <xref linkend="tutorial"/> を読んでください。
+ 段階的に解説していきます。
+ チュートリアルのソースコードはディストリビューションの
+ <literal>doc/reference/tutorial</literal>
ディレクトリに含まれています。
</para>
</listitem>
<listitem>
<para>
- <xref linkend="architecture"/>
��ǂ�ŁAHibernate�����p�\�Ȋ��𗝉��Ă��������B
+ <xref linkend="architecture"/>
を読んで、Hibernateが利用可能な環境を理解してください。
</para>
</listitem>
<listitem>
<para>
- Hibernate�f�B�X�g���r���[�V������ <literal>eg/</literal>
�f�B���N�g�������������B
- �ȒP�ȃX�^���h�A���[���̃A�v���P�[�V����������܂��B
- JDBC�h���C�o�� <literal>lib/</literal>
�f�B���N�g���ɃR�s�[���āA
- �����̃f�[�^�x�[�X�ɍ����������l��w�肷��悤��
<literal>etc/hibernate.properties</literal>
- ��ҏW���Ă��������B
- �f�B�X�g���r���[�V�����f�B���N�g������A�R�}���h�v�����v�g��
- <literal>ant eg</literal>
�ƃ^�C�v���Ă��������iAnt��g���܂��j�B
- �܂�Windows���ł� <literal>build eg</literal>
�ƃ^�C�v���Ă��������B
+ Hibernateディストリビューションの <literal>eg/</literal>
ディレクトリを見てください。
+ 簡単なスタンドアローンのアプリケーションがあります。
+ JDBCドライバを <literal>lib/</literal> ディレクトリにコピーして、
+ 自分のデータベースに合う正しい値を指定するように
<literal>etc/hibernate.properties</literal>
+ を編集してください。
+ ディストリビューションディレクトリから、コマンドプロンプトで
+ <literal>ant eg</literal> とタイプしてください(Antを使います)。
+ またWindows環境では <literal>build eg</literal> とタイプしてください。
</para>
</listitem>
<listitem>
<para>
- ���̃��t�@�����X�h�L�������g����̏�Ƃ��ė��p���Ă��������B
- �A�v���P�[�V�����v�ɂ��Ă̂���Ȃ����i�K�I�ȃ`���[�g���A����T���Ă���Ȃ�A
- <emphasis>Java Persistence with
Hibernate</emphasis>�ihttp://www.manning.com/bauer2�j
- �������߂��܂��B
- �܂�http://caveatemptor.hibernate.org����
- Java Persistence with
Hibernate�̗��̃A�v���P�[�V������_�E�����[�h�ł��܂��B
+ このリファレンスドキュメントを第一の情報源として利用してください。
+ アプリケーション設計についてのさらなる情報や段階的なチュートリアルを探しているなら、
+ <emphasis>Java Persistence with
Hibernate</emphasis>(http://www.manning.com/bauer2)
+ をおすすめします。
+ またhttp://caveatemptor.hibernate.orgから
+ Java Persistence with Hibernateの例題のアプリケーションをダウンロードできます。
</para>
</listitem>
<listitem>
<para>
- FAQ��Hibernate�E�F�u�T�C�g�ɂ���܂��B
+ FAQはHibernateウェブサイトにあります。
</para>
</listitem>
<listitem>
<para>
-
�T�[�h�p�[�e�B�̃f���A��A�`���[�g���A����Hibernate�E�F�u�T�C�g�Ƀ����N������܂��B
+ サードパーティのデモ、例、チュートリアルはHibernateウェブサイトにリンクがあります。
</para>
</listitem>
<listitem>
<para>
-
Hibernate�E�F�u�T�C�g�̃R�~���j�e�B�G���A�́A�f�U�C���p�^�[���₳�܂��܂ȓ����\�����[�V����
- �iTomcat, JBoss AS, Struts, EJB, ���j�ɂ��Ă̂悢��ł��B
+ Hibernateウェブサイトのコミュニティエリアは、デザインパターンやさまざまな統合ソリューション
+ (Tomcat, JBoss AS, Struts, EJB, 等)についてのよい情報源です。
</para>
</listitem>
</orderedlist>
<para>
- ���₪�����Hibernate�E�F�u�T�C�g�̃��[�U�t�H�[�������p���Ă��������B
- �܂��o�O���|�[�g�ƃt�B�[�`�����N�G�X�g�̂���JIRA�ۑ�ǐՃV�X�e����p�ӂ��Ă��܂��B
- Hibernate�̊J���ɋ���������A�J���҃��[�����O���X�g�ɎQ�����Ă��������B
- ���̃h�L�������g���Ȃ��̍��̌��t�ɖ|�����ꍇ�́A
- �J���҃��[�����O���X�g�Ŏ������ɃR���^�N�g�����Ă��������B
+ 質問があればHibernateウェブサイトのユーザフォーラムを活用してください。
+ またバグレポートとフィーチャリクエストのためJIRA課題追跡システムを用意しています。
+ Hibernateの開発に興味があれば、開発者メーリングリストに参加してください。
+ このドキュメントをあなたの国の言葉に翻訳したい場合は、
+ 開発者メーリングリストで私たちにコンタクトを取ってください。
</para>
<para>
- ���p�J���̃T�|�[�g�A���i�̃T�|�[�g�AHibernate�̃g���[�j���O��JBoss
Inc.�����Ă��܂�
- �ihttp://www.hibernate.org/SupportTraining/�����������j�B
- Hibernate��Professional Open Source�v���W�F�N�g�A
- ������JBoss Enterprise Middleware
System�iJEMS�j�v���_�N�g�X�C�[�g�̃N���e�B�J���R���|�[�l���g�ł��B
+ 商用開発のサポート、製品のサポート、HibernateのトレーニングはJBoss Inc.が提供しています
+ (http://www.hibernate.org/SupportTraining/を見てください)。
+ HibernateはProfessional Open Sourceプロジェクト、
+ そしてJBoss Enterprise Middleware System(JEMS)プロダクトスイートのクリティカルコンポーネントです。
</para>
<!--
<sect1 id="preface-s1" revision="-1">
- <title>���{���ɂ���</title>
+ <title>日本語訳について</title>
<para id="preface-s1-p1" revision="-1">
- ���̓��{���Hibernate Reference Document�i�ȉ��A���{��Łj�́A
- Hibernate�v���W�F�N�g�̖|��v���Z�X�Ɋ�Â��č쐬����Ă��܂��B
- ���{��łȂ�тɌ�����LGPL���C�Z���X�ɏ����܂��B
+ この日本語版Hibernate Reference Document(以下、日本語版)は、
+ Hibernateプロジェクトの翻訳プロセスに基づいて作成されています。
+ 日本語版ならびに原文はLGPLライセンスに準じます。
</para>
<para id="preface-s1-p2" revision="-1">
- ���{��ł̗��p�ɂ���đ�O�҂���邠����s���v�ɑ��āA
- �����ҁA�|��҂Ȃ�тɂ��̑g�D�͈�̕ۏ��������˂܂��B
- ���{��ł͌���܂މ\�������邱�Ƃ�F��������ł����p���������B
- ��e�̐��m�ȈӖ���c�����邽�߂ɂ́A������ǂނ��Ƃ������߂��܂��B
- �܂��A������{��łɌ�������ꂽ�ꍇ�́A�|��҂ɂ��A������������K���ł��B
- ��������e�Ɋւ��Ă̂��₢���킹�ɂ͉������˂܂��̂ŁA���������������B
+ 日本語版の利用によって第三者が被るあらゆる不利益に対して、
+ 原著者、翻訳者ならびにその組織は一切の保証をいたしかねます。
+ 日本語版は誤りを含む可能性があることを認識した上でご利用ください。
+ 内容の正確な意味を把握するためには、原文を読むことをおすすめします。
+ また、もし日本語版に誤りを見つけられた場合は、翻訳者にご連絡いただければ幸いです。
+ ただし内容に関してのお問い合わせには応じかねますので、ご了承ください。
</para>
<sect2 id="preface-s1-1" revision="-1">
- <title>���{��Ŗ|��҂ɂ���</title>
+ <title>日本語版翻訳者について</title>
<para id="preface-s1-1-p4" revision="-1">
- ���{��Ńo�[�W����3.2 cr3�̖|��͊�����ЃG�N�T
- �i<ulink
url="http://www.exa-corp.co.jp">�z�[���y�[�W�͂�����</ulink>�j
- �̈ȉ��̃����o�[�ōs���܂����B
- �{�ԗ́i6,18,19,21,22,23�͒S���j�A
- �L�˗T��i�O����,2,5,13,14,24,25�͒S���j�A
- ���s���l�i7,8,9,10�͒S���j�A
- �ߐ{�G�j�i12,16,17�͒S���j�A
- ��֒m���i1,3,11�͒S���j�A
- �ѓc�_�i�i4,15�͒S���j�A
- ���Ԍ���i20�͒S���j�A
- �X����i���r���[�S���j�B
- �Ȃ���̂��w�E�͖{�ԁA�L�˂܂ł��肢�������܂��B
+ 日本語版バージョン3.2 cr3の翻訳は株式会社エクサ
+ (<ulink
url="http://www.exa-corp.co.jp">ホームページはこちら</ulink>)
+ の以下のメンバーで行いました。
+ 本間力(6,18,19,21,22,23章担当)、
+ 広戸裕介(前書き,2,5,13,14,24,25章担当)、
+ 武市正人(7,8,9,10章担当)、
+ 那須秀男(12,16,17章担当)、
+ 井関知文(1,3,11章担当)、
+ 飯田浩司(4,15章担当)、
+ 平間健一(20章担当)、
+ 森龍二(レビュー担当)。
+ なお誤訳等のご指摘は本間、広戸までお願いいたします。
<mediaobject>
<imageobject role="fo">
@@ -154,4 +153,4 @@
</sect2>
</sect1>
-->
- </preface>
\ No newline at end of file
+ </preface>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_criteria.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_criteria.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_criteria.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,18 +1,20 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="querycriteria">
- <title>Criteria�N�G��</title>
+ <title>Criteriaクエリ</title>
<para>
- Hibernate�ɂ́A�����I�Ŋg���\��criteria�N�G��API���p�ӂ���Ă��܂��B
+ Hibernateには、直感的で拡張可能なcriteriaクエリAPIが用意されています。
</para>
<sect1 id="querycriteria-creating">
- <title> <literal>Criteria</literal>
�C���X�^���X�̍쐬</title>
+ <title> <literal>Criteria</literal> インスタンスの作成</title>
<para>
<literal>org.hibernate.Criteria</literal>
- �C���^�[�t�F�C�X�͓���̉i�����N���X�ɑ���N�G����\�����܂��B
- <literal>Session</literal> ��
<literal>Criteria</literal> �C���X�^���X�̃t�@�N�g���ł��B
+ インターフェイスは特定の永続性クラスに対するクエリを表現します。
+ <literal>Session</literal> は
<literal>Criteria</literal> インスタンスのファクトリです。
</para>
<programlisting><![CDATA[Criteria crit =
sess.createCriteria(Cat.class);
@@ -22,14 +24,14 @@
</sect1>
<sect1 id="querycriteria-narrowing">
- <title>���U���g�Z�b�g�̍i����</title>
+ <title>リザルトセットの絞込み</title>
<para>
- <literal>org.hibernate.criterion.Criterion</literal>
�C���^�[�t�F�C�X�̃C���X�^���X�́A
- �ʂ̃N�G���N���C�e���I���i�₢���킹�̔����j��\���܂��B
+ <literal>org.hibernate.criterion.Criterion</literal>
インターフェイスのインスタンスは、
+ 個別のクエリクライテリオン(問い合わせの判定基準)を表します。
<literal>org.hibernate.criterion.Restrictions</literal>
- �N���X�́A����g�ݍ��݂� <literal>Criterion</literal>
- �^��擾���邽�߂̃t�@�N�g�����\�b�h�����Ă��܂��B
+ クラスは、ある組み込みの <literal>Criterion</literal>
+ 型を取得するためのファクトリメソッドを持っています。
</para>
<programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
@@ -38,7 +40,7 @@
.list();]]></programlisting>
<para>
- Restriction�i����j�́A�_���I�ɃO���[�v���ł��܂��B
+ Restriction(限定)は、論理的にグループ化できます。
</para>
<programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
@@ -60,8 +62,8 @@
.list();]]></programlisting>
<para>
- ���X����Criterion�^�i<literal>Restrictions</literal>
�̃T�u�N���X�j
- �͂��Ȃ�͈̔͂ɋy�т܂����A���ɗL�p�Ȃ̂�SQL�ڎw��ł����̂ł��B
+ 元々あるCriterion型(<literal>Restrictions</literal> のサブクラス)
+ はかなりの範囲に及びますが、特に有用なのはSQLを直接指定できるものです。
</para>
<programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
@@ -69,15 +71,15 @@
.list();]]></programlisting>
<para>
- <literal>{alias}</literal> �Ƃ����v���[�X�z���_�́A
- �₢���킹����G���e�B�e�B�̍s�̕ʖ��ɂ���Ēu���������܂��B
+ <literal>{alias}</literal> というプレースホルダは、
+ 問い合わせを受けたエンティティの行の別名によって置き換えられます。
</para>
<para>
- criterion��ʂ̎�i�́A
- <literal>Property</literal> �C���X�^���X����擾���邱�Ƃł��B
- <literal>Property.forName()</literal> ��Ăяo���āA
- <literal>Property</literal> �C���X�^���X��쐬�ł��܂��B
+ criterionを得る別の手段は、
+ <literal>Property</literal> インスタンスから取得することです。
+ <literal>Property.forName()</literal> を呼び出して、
+ <literal>Property</literal> インスタンスを作成できます。
</para>
<programlisting><![CDATA[
@@ -95,11 +97,11 @@
</sect1>
<sect1 id="querycriteria-ordering">
- <title>���ʂ̐���</title>
+ <title>結果の整列</title>
<para>
<literal>org.hibernate.criterion.Order</literal>
- ��g���Č��ʂ���ёւ��邱�Ƃ��ł��܂��B
+ を使って結果を並び替えることができます。
</para>
<programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
@@ -119,11 +121,11 @@
</sect1>
<sect1 id="querycriteria-associations" revision="2">
- <title>�֘A</title>
+ <title>関連</title>
<para>
- <literal>createCriteria()</literal>
��g���A�֘A��i�r�Q�[�g���邱�ƂŁA
- �e�ՂɊW����G���e�B�e�B�ɐ����w��ł��܂��B
+ <literal>createCriteria()</literal> を使い、関連をナビゲートすることで、
+ 容易に関係するエンティティに制約を指定できます。
</para>
<programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
@@ -133,13 +135,13 @@
.list();]]></programlisting>
<para>
- 2�Ԗڂ� <literal>createCriteria()</literal>
�́A<literal>kittens</literal>
- �R���N�V�����̗v�f��Q�Ƃ���V���� <literal>Criteria</literal>
- �C���X�^���X��Ԃ����Ƃɒ��ӂ��Ă��������B
+ 2番目の <literal>createCriteria()</literal>
は、<literal>kittens</literal>
+ コレクションの要素を参照する新しい <literal>Criteria</literal>
+ インスタンスを返すことに注意してください。
</para>
<para>
- �ȉ��̂悤�ȕ��@��A�ɂ��L�p�ł��B
+ 以下のような方法も、状況により有用です。
</para>
<programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
@@ -149,17 +151,17 @@
.list();]]></programlisting>
<para>
- �i<literal>createAlias()</literal> �͐V����
- <literal>Criteria</literal> �C���X�^���X��쐬���܂���B�j
+ (<literal>createAlias()</literal> は新しい
+ <literal>Criteria</literal> インスタンスを作成しません。)
</para>
<para>
- �O��2�̃N�G���ɂ���ĕԂ���� <literal>Cat</literal>
- �C���X�^���X�ɂ���ĕێ������kittens�R���N�V�����́A
- criteria�ɂ���Ď��O�Ƀt�B���^�����O <emphasis>����Ȃ�</emphasis>
- ���Ƃɒ��ӂ��Ă��������B
- ���criteria�ɓK������kitten��擾�������Ȃ�A
- <literal>ResultTransformer</literal> ��g��Ȃ���Ȃ�܂���B
+ 前の2つのクエリによって返される <literal>Cat</literal>
+ インスタンスによって保持されるkittensコレクションは、
+ criteriaによって事前にフィルタリング <emphasis>されない</emphasis>
+ ことに注意してください。
+ もしcriteriaに適合するkittenを取得したいなら、
+ <literal>ResultTransformer</literal> を使わなければなりません。
</para>
<programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
@@ -177,11 +179,11 @@
</sect1>
<sect1 id="querycriteria-dynamicfetching" revision="1">
- <title>�֘A�̓��I�t�F�b�`</title>
+ <title>関連の動的フェッチ</title>
<para>
- <literal>setFetchMode()</literal> ��g���A
- ���s���Ɋ֘A�̕������@��w�肵�Ă�悢�ł��B
+ <literal>setFetchMode()</literal> を使い、
+ 実行時に関連の復元方法を指定してもよいです。
</para>
<programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
@@ -191,19 +193,19 @@
.list();]]></programlisting>
<para>
- ���̃N�G���͊O�������ɂ�� <literal>mate</literal> ��
- <literal>kittens</literal> �̗�����t�F�b�`���܂��B
- ��葽���̏��� <xref linkend="performance-fetching"/>
��Q�Ƃ��Ă��������B
+ このクエリは外部結合により <literal>mate</literal> と
+ <literal>kittens</literal> の両方をフェッチします。
+ より多くの情報は <xref linkend="performance-fetching"/> を参照してください。
</para>
</sect1>
<sect1 id="querycriteria-examples">
- <title>�N�G���̗�</title>
+ <title>クエリの例</title>
<para>
- <literal>org.hibernate.criterion.Example</literal> �N���X�́A
- �^����ꂽ�C���X�^���X����N�G���N���C�e���I����\�z�ł��܂��B
+ <literal>org.hibernate.criterion.Example</literal> クラスは、
+ 与えられたインスタンスからクエリクライテリオンを構築できます。
</para>
<programlisting><![CDATA[Cat cat = new Cat();
@@ -214,13 +216,13 @@
.list();]]></programlisting>
<para>
- �o�[�W�����v���p�e�B�A���ʎq�A�֘A�͖�������܂��B
- �f�t�H���g�ł�null�l�̃v���p�e�B�͏��O����܂��B
+ バージョンプロパティ、識別子、関連は無視されます。
+ デフォルトではnull値のプロパティは除外されます。
</para>
<para>
- �ǂ̂悤�� <literal>Example</literal> ��K�p���邩
- �������邱�Ƃ��ł��܂��B
+ どのように <literal>Example</literal> を適用するか
+ 調整することができます。
</para>
<programlisting><![CDATA[Example example = Example.create(cat)
@@ -233,7 +235,7 @@
.list();]]></programlisting>
<para>
- �֘A�I�u�W�F�N�g��criteria��w�肷�邽�߂ɁAExample��g�����Ƃ�\�ł��B
+ 関連オブジェクトにcriteriaを指定するために、Exampleを使うことも可能です。
</para>
<programlisting><![CDATA[List results =
session.createCriteria(Cat.class)
@@ -245,12 +247,12 @@
</sect1>
<sect1 id="querycriteria-projection">
- <title>�ˉe�A�W��A�O���[�v��</title>
+ <title>射影、集約、グループ化</title>
<para>
- <literal>org.hibernate.criterion.Projections</literal> �N���X��
- <literal>Projection</literal> �C���X�^���X�̃t�@�N�g���ł��B
- <literal>setProjection()</literal> ��Ăяo�����ƂŁA
- �N�G���Ɏˉe��K�p���܂��B
+ <literal>org.hibernate.criterion.Projections</literal> クラスは
+ <literal>Projection</literal> インスタンスのファクトリです。
+ <literal>setProjection()</literal> を呼び出すことで、
+ クエリに射影を適用します。
</para>
<programlisting><![CDATA[List results =
session.createCriteria(Cat.class)
@@ -268,14 +270,14 @@
.list();]]></programlisting>
<para>
- �K�v�ł����Ă�Acriteria�N�G���Ɂugroup by�v������K�v�͂���܂���B
- ������Projection�^�� <emphasis>�O���[�v���ˉe</emphasis>
�Ƃ��Ē�`����A
- SQL�� <literal>group by</literal> �߂ɂ����܂��B
+ 必要であっても、criteriaクエリに「group by」を明示する必要はありません。
+ ある種のProjection型は <emphasis>グループ化射影</emphasis> として定義され、
+ SQLの <literal>group by</literal> 節にも現れます。
</para>
<para>
- �C�ӂŎˉe�ɕʖ���t�����邽�߁A�ˉe�����l��restriction��ordering�����Q�Ƃł��܂��B
- �ʖ������Q�̈قȂ���@�����܂��B
+ 任意で射影に別名を付けられるため、射影される値はrestrictionやordering内から参照できます。
+ 別名をつける2つの異なる方法を示します。
</para>
<programlisting><![CDATA[List results =
session.createCriteria(Cat.class)
@@ -289,10 +291,10 @@
.list();]]></programlisting>
<para>
- <literal>alias()</literal> �� <literal>as()</literal>
���\�b�h�́A
- Projection�C���X�^���X��ʂ̖��O�� <literal>Projection</literal>
�C���X�^���X��
- ���b�v���邾���ł��B
- �V���[�g�J�b�g�Ƃ��āA�ˉe��ˉe���X�g�ɒlj�����ۂɁA�ʖ�������܂��B
+ <literal>alias()</literal> と <literal>as()</literal>
メソッドは、
+ Projectionインスタンスを別の名前の <literal>Projection</literal> インスタンスで
+ ラップするだけです。
+ ショートカットとして、射影を射影リストに追加する際に、別名をつけられます。
</para>
<programlisting><![CDATA[List results =
session.createCriteria(Cat.class)
@@ -317,7 +319,7 @@
.list();]]></programlisting>
<para>
- �ˉe�̎��� <literal>Property.forName()</literal> ��g�p�ł��܂��B
+ 射影の式に <literal>Property.forName()</literal> も使用できます。
</para>
<programlisting><![CDATA[List results =
session.createCriteria(Cat.class)
@@ -339,11 +341,11 @@
</sect1>
<sect1 id="querycriteria-detachedqueries">
- <title>�N�G������уT�u�N�G���̕���</title>
+ <title>クエリおよびサブクエリの分離</title>
<para>
- <literal>DetachedCriteria</literal> �N���X�ɂ��A
- �Z�b�V�����X�R�[�v�O�ɃN�G����쐬�ł��܂��B
- ��ŁA�C�ӂ� <literal>Session</literal> ��g���āA���s�ł��܂��B
+ <literal>DetachedCriteria</literal> クラスにより、
+ セッションスコープ外にクエリを作成できます。
+ 後で、任意の <literal>Session</literal> を使って、実行できます。
</para>
<programlisting><![CDATA[DetachedCriteria query =
DetachedCriteria.forClass(Cat.class)
@@ -356,9 +358,9 @@
session.close();]]></programlisting>
<para>
- <literal>DetachedCriteria</literal>
�́A�T�u�N�G����\�����邽�߂ɂ�g���܂��B
- �T�u�N�G����Criterion�C���X�^���X�́A
- <literal>Subqueries</literal> �������
<literal>Property</literal> ���瓾���܂��B
+ <literal>DetachedCriteria</literal> は、サブクエリを表現するためにも使えます。
+ サブクエリを伴うCriterionインスタンスは、
+ <literal>Subqueries</literal> もしくは
<literal>Property</literal> から得られます。
</para>
<programlisting><![CDATA[DetachedCriteria avgWeight =
DetachedCriteria.forClass(Cat.class)
@@ -374,7 +376,7 @@
.list();]]></programlisting>
<para>
- ���݊W������T�u�N�G���ł�����\�ł��B
+ 相互関係があるサブクエリでさえも可能です。
</para>
<programlisting><![CDATA[DetachedCriteria avgWeightForSex =
DetachedCriteria.forClass(Cat.class, "cat2")
@@ -391,23 +393,23 @@
could also be explained. -->
<sect1 id="query-criteria-naturalid">
- <title>���R���ʎq�ɂ��N�G��</title>
+ <title>自然識別子によるクエリ</title>
<para>
- criteria�N�G����܂ނ����Ă��̃N�G���ɂƂ��āA
- �N�G���L���b�V���͂��܂�������悭�Ȃ��ł��B
- �Ȃ��Ȃ�A�N�G���L���b�V�����p�ɂɖ����ɂȂ邽�߂ł��B
- �������Ȃ���A�L���b�V�����ɂ���A���S���Y����œK���ł���
- ���ʂȃN�G���̎�ނ��P����܂��B
- �X�V����Ȃ����R�L�[�ɂ�錟���ł��B
- �������̃A�v���P�[�V�����ł́A���̎�ނ̃N�G�����p�ɂɌ���܂��B
- ���̂悤�Ȏg�����̂��߂ɁAcriteria API�͓��ʂȑ����܂��B
+ criteriaクエリを含むたいていのクエリにとって、
+ クエリキャッシュはあまり効率がよくないです。
+ なぜなら、クエリキャッシュが頻繁に無効になるためです。
+ しかしながら、キャッシュを無効にするアルゴリズムを最適化できる
+ 特別なクエリの種類が1つあります。
+ 更新されない自然キーによる検索です。
+ いくつかのアプリケーションでは、この種類のクエリが頻繁に現れます。
+ このような使われ方のために、criteria APIは特別な対策を提供します。
</para>
<para>
- �ŏ��ɁA<literal><natural-id></literal> ��g���āA
- �G���e�B�e�B�̎��R�L�[��}�b�v���Ă��������B
- �����āA�L���b�V����L���ɂ��܂��B
+ 最初に、<literal><natural-id></literal> を使って、
+ エンティティの自然キーをマップしてください。
+ そして、二次キャッシュを有効にします。
</para>
<programlisting><![CDATA[<class name="User">
@@ -423,17 +425,17 @@
</class>]]></programlisting>
<para>
- ���ӁF <emphasis>�ύX�����</emphasis> ���R�L�[���G���e�B�e�B��
- ���̋@�\��g���̂́A�Ӑ}����Ă��Ȃ��g�����ł��B
+ 注意: <emphasis>変更される</emphasis> 自然キーを持つエンティティに
+ この機能を使うのは、意図されていない使い方です。
</para>
<para>
- ���ɁAHibernate�N�G���L���b�V����L���ɂ��܂��B
+ 次に、Hibernateクエリキャッシュを有効にします。
</para>
<para>
- ����ŁA<literal>Restrictions.naturalId()</literal> �ɂ��A
- �������I�ȃL���b�V���A���S���Y����g�p�ł��܂��B
+ これで、<literal>Restrictions.naturalId()</literal> により、
+ より効率的なキャッシュアルゴリズムを使用できます。
</para>
<programlisting><![CDATA[session.createCriteria(User.class)
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_hql.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_hql.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_hql.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,87 +1,89 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="queryhql">
<title>HQL: The Hibernate Query Language</title>
<para>
- Hibernate��SQL�ɔ��ɂ悭����(�Ӑ}�I�Ɏ�����)���͂Ȗ₢���킹���������Ă��܂��B
- ������SQL�Ɏ����\���ɘf�킳��Ȃ��ł��������BHQL�͊��S�ɃI�u�W�F�N�g�w���ł���A
- �p���A�|�����[�t�B�Y���A�֘A�Ƃ������T�O�𗝉��܂��B
+ HibernateはSQLに非常によく似た(意図的に似せた)強力な問い合わせ言語を備えています。
+ しかしSQLに似た構文に惑わされないでください。HQLは完全にオブジェクト指向であり、
+ 継承、ポリモーフィズム、関連といった概念を理解します。
</para>
<sect1 id="queryhql-casesensitivity">
- <title>�啶���Ə������̋��</title>
+ <title>大文字と小文字の区別</title>
<para>
- �N�G����Java�̃N���X���ƃv���p�e�B�������đ啶���A���������ʂ��܂���B
- �]���� <literal>SeLeCT</literal> ��
- <literal>sELEct</literal> �Ɠ����ŁA����
- <literal>SELECT</literal> �Ƃ�����ł���
- <literal>net.sf.hibernate.eg.FOO</literal> ��
- <literal>net.sf.hibernate.eg.Foo</literal> �Ƃ͈Ⴂ�A����
- <literal>foo.barSet</literal> ��
- <literal>foo.BARSET</literal> �Ƃ�Ⴂ�܂��B
+ クエリはJavaのクラス名とプロパティ名を除いて大文字、小文字を区別しません。
+ 従って <literal>SeLeCT</literal> は
+ <literal>sELEct</literal> と同じで、かつ
+ <literal>SELECT</literal> とも同じですが
+ <literal>net.sf.hibernate.eg.FOO</literal> は
+ <literal>net.sf.hibernate.eg.Foo</literal> とは違い、かつ
+ <literal>foo.barSet</literal> は
+ <literal>foo.BARSET</literal> とも違います。
</para>
<para>
- ���̃}�j���A���ł͏�������HQL�L�[���[�h��g�p���܂��B
- �啶���̃L�[���[�h�̃N�G���̕����ǂ݂₷���Ɗ����郆�[�U�[�����Ǝv���܂��B
- �ł����AJava�R�[�h��ɖ��ߍ��܂ꂽ�Ƃ��ɂ͌��Â炢�Ǝv���܂��B
+ このマニュアルでは小文字のHQLキーワードを使用します。
+ 大文字のキーワードのクエリの方が読みやすいと感じるユーザーもいると思います。
+ ですが、Javaコード内に埋め込まれたときには見づらいと思います。
</para>
</sect1>
<sect1 id="queryhql-from">
- <title>from��</title>
+ <title>from節</title>
<para>
- ����Ƃ�P����Hibernate�N�G���͎��̌`���ł��B
+ もっとも単純なHibernateクエリは次の形式です。
</para>
<programlisting><![CDATA[from eg.Cat]]></programlisting>
<para>
-
����͒P���Ɂ@<literal>eg.Cat</literal>�@�N���X�̃C���X�^���X���ׂĕԂ��܂��B
- �K������N���X����C������i�N���X�Ƀp�b�P�[�W����t����j�K�v�͂���܂���B
- �Ƃ����̂�A<literal>auto-import</literal>
���f�t�H���g�ɂȂ��Ă��邩��ł��B
- ���̂��߂قƂ�ǂ̏ꍇ�A���̂悤�ɏ��������ŏ\���ł��B
+ これは単純に <literal>eg.Cat</literal> クラスのインスタンスをすべて返します。
+ 必ずしもクラス名を修飾する(クラスにパッケージ名を付ける)必要はありません。
+ というのも、<literal>auto-import</literal> がデフォルトになっているからです。
+ そのためほとんどの場合、このように書くだけで十分です。
</para>
<programlisting><![CDATA[from Cat]]></programlisting>
<para>
-
�قƂ�ǂ̏ꍇ�N�G���̂ق��̕����Ł@<literal>Cat</literal>�@��Q�Ƃ���̂ŁA�ʖ����蓖�Ă�K�v������ł��傤�B
+
ほとんどの場合クエリのほかの部分で <literal>Cat</literal> を参照するので、別名を割り当てる必要があるでしょう。
</para>
<programlisting><![CDATA[from Cat as cat]]></programlisting>
<para>
- ���̃N�G���ł� <literal>Cat</literal> �C���X�^���X��
<literal>cat</literal>
- �Ƃ����ʖ���t���Ă��܂��B
- ���̂��߁A��ł��̃N�G����ŁA���̕ʖ���g�����Ƃ��ł��܂��B
- <literal>as</literal>
�L�[���[�h�̓I�v�V�����ł��B�܂肱�̂悤�ɏ������Ƃ�ł��܂��F
+ このクエリでは <literal>Cat</literal> インスタンスに
<literal>cat</literal>
+ という別名を付けています。
+ そのため、後でこのクエリ内で、この別名を使うことができます。
+ <literal>as</literal> キーワードはオプションです。つまりこのように書くこともできます:
</para>
<programlisting><![CDATA[from Cat cat]]></programlisting>
<para>
- ���ρA���邢�̓N���X�����ɂ���đ����̃N���X���o�����邱�Ƃ����܂��B
+ 直積、あるいはクロス結合によって多数のクラスが出現することもあります。
</para>
<programlisting><![CDATA[from Formula,
Parameter]]></programlisting>
<programlisting><![CDATA[from Formula as form, Parameter as
param]]></programlisting>
<para>
- ���[�J���ϐ���Java�̃l�[�~���O��ƈ�v�����A
- �������ɏ�������g�����N�G���̕ʖ���t���邱�Ƃ͂����K���ł�(�Ⴆ��
<literal>domesticCat</literal> )�B
+ ローカル変数のJavaのネーミング基準と一致した、
+ 頭文字に小文字を使ったクエリの別名を付けることはいい習慣です(例えば <literal>domesticCat</literal>
)。
</para>
</sect1>
<sect1 id="queryhql-joins" revision="2">
- <title>�֘A�ƌ���</title>
+ <title>関連と結合</title>
<para>
-
�֘A����G���e�B�e�B���邢�͒l�R���N�V�����̗v�f�ɂ�A<literal>����</literal>
��g���ĕʖ����蓖�Ă邱�Ƃ��o���܂��B
+ 関連するエンティティあるいは値コレクションの要素にも、<literal>結合</literal>
を使って別名を割り当てることが出来ます。
</para>
<programlisting><![CDATA[from Cat as cat
@@ -93,7 +95,7 @@
<programlisting><![CDATA[from Formula form full join form.parameter
param]]></programlisting>
<para>
- �T�|�[�g���Ă��錋���̃^�C�v��ANSI SQL�Ɠ����ł��B
+ サポートしている結合のタイプはANSI SQLと同じです。
</para>
<itemizedlist spacing="compact">
@@ -114,13 +116,13 @@
</listitem>
<listitem>
<para>
- <literal>full join</literal> (�����Ă��̏ꍇ�g���Â炢)
+ <literal>full join</literal> (たいていの場合使いづらい)
</para>
</listitem>
</itemizedlist>
<para>
- <literal>inner join</literal>�A<literal>left outer
join</literal>�A<literal>right outer
join</literal>�ɂ͏ȗ��`��g�����Ƃ�ł��܂��B
+ <literal>inner join</literal>、<literal>left outer
join</literal>、<literal>right outer join</literal>には省略形を使うこともできます。
</para>
<programlisting><![CDATA[from Cat as cat
@@ -128,7 +130,7 @@
left join cat.kittens as kitten]]></programlisting>
<para>
- HQL�� <literal>with</literal>
�L�[���[�h��g���ƁA��������t�������邱�Ƃ��ł��܂��B
+ HQLの <literal>with</literal> キーワードを使うと、結合条件を付け加えることができます。
</para>
<programlisting><![CDATA[from Cat as cat
@@ -136,10 +138,10 @@
with kitten.bodyWeight > 10.0]]></programlisting>
<para>
-
�����āA�u�t�F�b�`�v�����͊֘A��l�̃R���N�V������e�I�u�W�F�N�g�ƈꏏ��1�x��select��ŏ��������܂��B
-
����͓��ɃR���N�V�����̏ꍇ�ɗL�p�ł��B����͎�����A�֘A�ƃR���N�V�����ɑ���}�b�s���O��`�t�@�C���̊O��������lazy�������̒�`��㏑�����邱�ƂɂȂ�܂��B
+ 加えて、「フェッチ」結合は関連や値のコレクションを親オブジェクトと一緒に1度のselect句で初期化します。
+
これは特にコレクションの場合に有用です。これは実質上、関連とコレクションに対するマッピング定義ファイルの外部結合とlazy初期化の定義を上書きすることになります。
- <xref linkend="performance-fetching"/> �ɂ�葽���̏����܂��B
+ <xref linkend="performance-fetching"/> により多くの情報があります。
</para>
<programlisting><![CDATA[from Cat as cat
@@ -147,10 +149,10 @@
left join fetch cat.kittens]]></programlisting>
<para>
- �����ɂ��t�F�b�`�͊֘A����I�u�W�F�N�g�� <literal>where</literal>
��(�܂��͑��̂ǂ�Ȑ߂ł�)
- �Ŏg���Ă͂Ȃ�Ȃ��̂ŁA�ʏ�ʖ����蓖�Ă�K�v������܂���B�܂��֘A�I�u�W�F�N�g�͖₢���킹���ʂƂ���
- ���ڕԂ���܂���B����ɐe�I�u�W�F�N�g��ʂ��ăA�N�Z�X�ł��܂��B
- �R���N�V������ċA�I�Ɍ����t�F�b�`����ꍇ�̂݁A�ʖ����K�v�ɂȂ�܂��B
+ 結合によるフェッチは関連するオブジェクトが <literal>where</literal> 節(または他のどんな節でも)
+ で使われてはならないので、通常別名を割り当てる必要がありません。また関連オブジェクトは問い合わせ結果として
+ 直接返されません。代わりに親オブジェクトを通してアクセスできます。
+ コレクションを再帰的に結合フェッチする場合のみ、別名が必要になります。
</para>
<programlisting><![CDATA[from Cat as cat
@@ -159,28 +161,28 @@
left join fetch child.kittens]]></programlisting>
<para>
- <literal>fetch</literal> �\����
<literal>iterate()</literal>
- ��g�����N�G���Ăяo���Ŏg�p�ł��Ȃ����Ƃɒ��ӂ��Ă�������
- �i����� <literal>scroll()</literal> �͎g�p�ł��܂��j�B
+ <literal>fetch</literal> 構文は
<literal>iterate()</literal>
+ を使ったクエリ呼び出しで使用できないことに注意してください
+ (一方で <literal>scroll()</literal> は使用できます)。
- �܂��A�����̑���͌��ʂ̍s�Ɋ�Â��Ă��邽�߁A
- <literal>fetch</literal> ��
<literal>setMaxResults()</literal> ��
<literal>setFirstResult()</literal>
- �ƈꏏ�Ɏg�p���ׂ��ł͂���܂���B
-
�ʏ�eager�ȃR���N�V�����t�F�b�`����Əd�����o�Ă��܂����߁A���Ȃ������҂���悤�ȍs���ɂ͂Ȃ�Ȃ��̂ł��B
+ また、これらの操作は結果の行に基づいているため、
+ <literal>fetch</literal> は
<literal>setMaxResults()</literal> や
<literal>setFirstResult()</literal>
+ と一緒に使用すべきではありません。
+ 通常eagerなコレクションフェッチをすると重複が出てしまうため、あなたが期待するような行数にはならないのです。
- �����Ă܂� <literal>fetch</literal> �́A�A�h�z�b�N��
<literal>with</literal> ����
- �ꏏ�Ɏg�����Ƃ�ł��܂���B
-
��̃N�G���ŕ����̃R���N�V���������t�F�b�`���邱�Ƃɂ�蒼�ς�쐬�ł���̂ŁA���̏ꍇ���ӂ��Ă��������B
-
�܂��A�����̃R���N�V�����ɑ��錋���t�F�b�`��bag�}�b�s���O�ɑ��ė\�����ʌ��ʂ����炷���Ƃ�����̂ŁA
- ���̏ꍇ�̃N�G���̍쐬�ɂ͒��ӂ��Ă��������B
- �Ō�� <literal>�S�O�������ɂ��t�F�b�`</literal> ��
- <literal>�E�O�������ɂ��t�F�b�`</literal>
�͗L�p�ł͂Ȃ����Ƃɒ��ӂ��Ă��������B
+ そしてまた <literal>fetch</literal> は、アドホックな
<literal>with</literal> 条件を
+ 一緒に使うこともできません。
+ 一つのクエリで複数のコレクションを結合フェッチすることにより直積を作成できるので、この場合注意してください。
+ また、複数のコレクションに対する結合フェッチはbagマッピングに対して予期せぬ結果をもたらすことがあるので、
+ この場合のクエリの作成には注意してください。
+ 最後に <literal>全外部結合によるフェッチ</literal> と
+ <literal>右外部結合によるフェッチ</literal> は有用ではないことに注意してください。
</para>
<para>
- ����v���p�e�B���x���̒x���t�F�b�`��g���ꍇ�i����I�Ƀo�C�g�R�[�h��������ꍇ�j�A
- <literal>fetch all properties</literal> ��g�����Ƃ�
- Hibernate�ɒx���v���p�e�B�𑬂₩�Ɂi�ŏ��̃N�G���Łj�t�F�b�`�����邱�Ƃ��ł��܂��B
+ もしプロパティレベルの遅延フェッチを使う場合(内部的にバイトコード処理をする場合)、
+ <literal>fetch all properties</literal> を使うことで
+ Hibernateに遅延プロパティを速やかに(最初のクエリで)フェッチさせることができます。
</para>
<programlisting><![CDATA[from Document fetch all properties order by
name]]></programlisting>
@@ -189,32 +191,32 @@
</sect1>
<sect1 id="queryhql-joins-forms">
- <title>�����\���̌`��</title>
+ <title>結合構文の形式</title>
<para>
- HQL�͂Q�̊֘A�����`����T�|�[�g���܂��F<literal>�ÖٓI</literal> ��
<literal>�����I</literal>�B
+ HQLは2つの関連結合形式をサポートします:<literal>暗黙的</literal> と
<literal>明示的</literal>。
</para>
<para>
- ����܂ł̃Z�N�V�����ł����������g�����͂��ׂ�
<literal>�����I��</literal> �`���ŁA
- from�߂Ŗ����I��join�L�[���[�h��g���Ă��܂��B
- ���̌`���������߂��܂��B
+ これまでのセクションでお見せした使い方はすべて <literal>明示的な</literal> 形式で、
+ from節で明示的にjoinキーワードを使っています。
+ この形式をおすすめします。
</para>
<para>
- <literal>�ÖٓI</literal>
�t�H�[���́Ajoin�L�[���[�h��g���܂���B����ɁA�Q�Ƃ���֘A��
- �h�b�g�\�L��g���܂��B<literal>�ÖٓI</literal>
�����́A���܂��܂�HQL�ɏo�Ă��܂��B
- <literal>�ÖٓI</literal>
�����̌��ʂ́ASQL�X�e�[�g�����g�̓���������ʂł��B
+ <literal>暗黙的</literal> フォームは、joinキーワードを使いません。代わりに、参照する関連に
+ ドット表記を使います。<literal>暗黙的</literal> 結合は、さまざまなHQLに出てきます。
+ <literal>暗黙的</literal> 結合の結果は、SQLステートメントの内部結合結果です。
</para>
<programlisting><![CDATA[from Cat as cat where cat.mate.name like
'%s%']]></programlisting>
</sect1>
<sect1 id="queryhql-select">
- <title>Select��</title>
+ <title>Select節</title>
<para>
- <literal>select</literal>
�߂͈ȉ��̂悤�ɂǂ̃I�u�W�F�N�g�Ƒ�����N�G�����U���g�Z�b�g�ɕԂ�����I���܂��B:
+ <literal>select</literal>
節は以下のようにどのオブジェクトと属性をクエリリザルトセットに返すかを選択します。:
</para>
<programlisting><![CDATA[select mate
@@ -222,14 +224,14 @@
inner join cat.mate as mate]]></programlisting>
<para>
- ��L�̃N�G���͑��� <literal>Cat</literal> ��
<literal>mate</literal> ��I���܂��B
- ���ۂɂ͎��̂悤�ɁA���Ȍ��ɕ\���ł��܂��B:
+ 上記のクエリは他の <literal>Cat</literal> の
<literal>mate</literal> を選択します。
+ 実際には次のように、より簡潔に表現できます。:
</para>
<programlisting><![CDATA[select cat.mate from Cat
cat]]></programlisting>
<para>
- �N�G���̓R���|�[�l���g�^�̃v���p�e�B��܂ށA������l�^�̃v���p�e�B��Ԃ��܂��B:
+ クエリはコンポーネント型のプロパティを含む、あらゆる値型のプロパティも返せます。:
</para>
<programlisting><![CDATA[select cat.name from DomesticCat cat
@@ -238,7 +240,7 @@
<programlisting><![CDATA[select cust.name.firstName from Customer as
cust]]></programlisting>
<para>
- �N�G���͕����̃I�u�W�F�N�g��(�܂���)�v���p�e�B��
<literal>Object[]</literal> �^�̔z��Ƃ��ĕԂ��܂��B
+ クエリは複数のオブジェクトと(または)プロパティを <literal>Object[]</literal>
型の配列として返せます。
</para>
<programlisting><![CDATA[select mother, offspr, mate.name
@@ -247,7 +249,7 @@
left outer join mother.kittens as offspr]]></programlisting>
<para>
- ������� <literal>List</literal> �Ƃ��āA
+ もしくは <literal>List</literal> として、
</para>
<programlisting><![CDATA[select new list(mother, offspr, mate.name)
@@ -256,7 +258,7 @@
left outer join mother.kittens as offspr]]></programlisting>
<para>
- �܂��́A�^�C�v�Z�[�t��Java�I�u�W�F�N�g��Ԃ��܂��B
+ または、タイプセーフなJavaオブジェクトを返せます。
</para>
<programlisting><![CDATA[select new Family(mother, mate, offspr)
@@ -265,34 +267,34 @@
left join mother.kittens as offspr]]></programlisting>
<para>
- ���邢�� <literal>Family</literal>
�N���X���K�ȃR���X�g���N�^�����Ă���Ƃ���Ȃ�A
+ あるいは <literal>Family</literal> クラスが適切なコンストラクタを持っているとするならば、
</para>
<para>
- select�߂� <literal>as</literal> ��g���ĕʖ�����邱�Ƃ�ł��܂��B
+ select節に <literal>as</literal> を使って別名をつけることもできます。
</para>
<programlisting><![CDATA[select max(bodyWeight) as max, min(bodyWeight)
as min, count(*) as n
from Cat cat]]></programlisting>
<para>
- <literal>select new map</literal> �ƈꏏ�Ɏg���Ƃ��ɍł�𗧂��܂��F
+ <literal>select new map</literal> と一緒に使うときに最も役立ちます:
</para>
<programlisting><![CDATA[select new map( max(bodyWeight) as max,
min(bodyWeight) as min, count(*) as n )
from Cat cat]]></programlisting>
<para>
- ���̃N�G���͕ʖ�����select�����l�� <literal>Map</literal> ��Ԃ��܂��B
+ このクエリは別名からselectした値へ <literal>Map</literal> を返します。
</para>
</sect1>
<sect1 id="queryhql-aggregation">
- <title>�W���</title>
+ <title>集約関数</title>
<para>
- HQL�̃N�G���̓v���p�e�B�̏W����̌��ʂ�Ԃ��܂��F
+ HQLのクエリはプロパティの集約関数の結果も返せます:
</para>
<programlisting><![CDATA[select avg(cat.weight), sum(cat.weight),
max(cat.weight), count(cat)
@@ -309,7 +311,7 @@
-->
<para>
- �T�|�[�g���Ă���W����͈ȉ��̂�̂ł��B
+ サポートしている集約関数は以下のものです。
</para>
<itemizedlist spacing="compact">
@@ -331,7 +333,7 @@
</itemizedlist>
<para>
- select�߂ɂ����ĎZ�p����A�A���Ə��F���ꂽSQL����g�����Ƃ��ł��܂��B
+ select節において算術操作、連結と承認されたSQL関数を使うことができます。
</para>
<programlisting><![CDATA[select cat.weight + sum(kitten.weight)
@@ -342,7 +344,7 @@
<programlisting><![CDATA[select firstName||' '||initial||'
'||upper(lastName) from Person]]></programlisting>
<para>
- SQL�Ɠ����Ӗ����� <literal>distinct</literal> ��
<literal>all</literal> �L�[���[�h��g�����Ƃ��ł��܂��B
+ SQLと同じ意味を持つ <literal>distinct</literal> と
<literal>all</literal> キーワードを使うことができます。
</para>
<programlisting><![CDATA[select distinct cat.name from Cat cat
@@ -352,56 +354,56 @@
</sect1>
<sect1 id="queryhql-polymorphism">
- <title>�|�����[�t�B�b�N�ȃN�G��</title>
+ <title>ポリモーフィックなクエリ</title>
<para>
- ���̂悤�ȃN�G���F
+ 次のようなクエリ:
</para>
<programlisting><![CDATA[from Cat as cat]]></programlisting>
<para>
- <literal>Cat</literal>
�C���X�^���X�����ł͂Ȃ��A<literal>DomesticCat</literal>
- �̂悤�ȃT�u�N���X��Ԃ���܂��BHibernate�N�G����
<emphasis>�ǂ��</emphasis>
- Java�N���X��C���^�[�t�F�C�X�� <literal>from</literal>
�߂ɓ���邱�Ƃ��ł��܂��B
-
�N�G���͂��̃N���X��g�������A������̓C���^�[�t�F�C�X����������S�Ẳi���N���X��Ԃ��܂��B
- ���̃N�G���͉i���I�u�W�F�N�g���ׂĕԂ��܂�:
+ <literal>Cat</literal>
インスタンスだけではなく、<literal>DomesticCat</literal>
+ のようなサブクラスも返されます。Hibernateクエリは <emphasis>どんな</emphasis>
+ Javaクラスやインターフェイスも <literal>from</literal> 節に入れることができます。
+ クエリはそのクラスを拡張した、もしくはインターフェイスを実装した全ての永続クラスを返します。
+ 次のクエリは永続オブジェクトをすべて返します:
</para>
<programlisting><![CDATA[from java.lang.Object
o]]></programlisting>
<para>
- <literal>Named</literal>
�C���^�[�t�F�C�X�͗l�X�ȉi���N���X�ɂ���Ď�������܂��B:
+ <literal>Named</literal> インターフェイスは様々な永続クラスによって実装されます。:
</para>
<programlisting><![CDATA[from Named n, Named m where n.name =
m.name]]></programlisting>
<para>
- �Ō�̓�̃N�G���́A��ȏ��SQL <literal>SELECT</literal>
��v�����Ă��邱�Ƃɒ��ӂ��Ă��������B
- ���̂��Ƃ� <literal>order by</literal>
�߂����U���g�Z�b�g�S�̂𐳊m�ɂ͐��Ȃ����Ƃ�Ӗ����܂�
- (����ɂ���́A<literal>Query.scroll()</literal>
��g�p���Ă����̃N�G����ĂԂ��Ƃ��ł��Ȃ����Ƃ�Ӗ����܂��B)�B
+ 最後の二つのクエリは、二つ以上のSQL <literal>SELECT</literal>
を要求していることに注意してください。
+ このことは <literal>order by</literal> 節がリザルトセット全体を正確には整列しないことを意味します
+ (さらにそれは、<literal>Query.scroll()</literal>
を使用してこれらのクエリを呼ぶことができないことを意味します。)。
</para>
</sect1>
<sect1 id="queryhql-where">
- <title>where��</title>
+ <title>where節</title>
<para>
- <literal>where</literal>
�߂͕Ԃ����C���X�^���X�̃��X�g��i�邱�Ƃ��ł��܂��B
- ����ʖ����Ȃ��ꍇ�A���O�Ńv���p�e�B��Q�Ƃ��܂��B
+ <literal>where</literal> 節は返されるインスタンスのリストを絞ることができます。
+ もし別名がない場合、名前でプロパティを参照します。
</para>
<programlisting><![CDATA[from Cat where
name='Fritz']]></programlisting>
<para>
- ����ʖ�������ꍇ�A�C������g���Ă��������B
+ もし別名がある場合、修飾名を使ってください。
</para>
<programlisting><![CDATA[from Cat as cat where
cat.name='Fritz']]></programlisting>
<para>
- ���O��'Fritz'�Ƃ��� <literal>Cat</literal>
�̃C���X�^���X��Ԃ��܂��B
+ 名前が'Fritz'という <literal>Cat</literal> のインスタンスを返します。
</para>
<programlisting><![CDATA[select foo
@@ -409,28 +411,28 @@
where foo.startDate = bar.date]]></programlisting>
<para>
- ���HQL�́A<literal>Foo</literal> ��
<literal>startDate</literal> �v���p�e�B�Ɠ�����
- <literal>date</literal> �v���p�e�B������
<literal>bar</literal> �C���X�^���X�����݂���A
- ���ׂĂ� <literal>Foo</literal> �C���X�^���X��Ԃ��܂��B
- �R���p�E���h�p�X���i�Ⴆ�ucat.mate.name�v�j��
<literal>where</literal> �߂���ɋ��͂ɂ��܂��B���ځF
+ 上のHQLは、<literal>Foo</literal> の
<literal>startDate</literal> プロパティと等しい
+ <literal>date</literal> プロパティを持った
<literal>bar</literal> インスタンスが存在する、
+ すべての <literal>Foo</literal> インスタンスを返します。
+ コンパウンドパス式(例えば「cat.mate.name」)は <literal>where</literal>
節を非常に強力にします。注目:
</para>
<programlisting><![CDATA[from Cat cat where cat.mate.name is not
null]]></programlisting>
<para>
- ���̃N�G���̓e�[�u�������i��������j����SQL�N�G���ɕϊ�����܂��B
- ���̑���Ɉȉ��̂悤�ɏ����ƁA
+ このクエリはテーブル結合(内部結合)を持つSQLクエリに変換されます。
+ その代わりに以下のように書くと、
</para>
<programlisting><![CDATA[from Foo foo
where foo.bar.baz.customer.address.city is not null]]></programlisting>
<para>
- �����̃N�G����L�q������N�G�����4�̃e�[�u��������K�v�Ƃ���SQL�N�G���ɕϊ�����܂��B
+ もし上のクエリを記述したらクエリ内に4つのテーブル結合を必要とするSQLクエリに変換されます。
</para>
<para>
- <literal>=</literal>
���Z�q�͈ȉ��̂悤�ɁA�v���p�e�B�����łȂ��C���X�^���X���r���邽�߂ɂ�g���܂��B�F
+ <literal>=</literal> 演算子は以下のように、プロパティだけでなくインスタンスを比較するためにも使われます。:
</para>
<programlisting><![CDATA[from Cat cat, Cat rival where cat.mate =
rival.mate]]></programlisting>
@@ -440,8 +442,8 @@
where cat.mate = mate]]></programlisting>
<para>
- <literal>id</literal> (������)�͓��ʂȃv���p�e�B�ł���A
-
�I�u�W�F�N�g�̃��j�[�N�Ȏ��ʎq��Q�Ƃ��邽�߂Ɏg�p�ł��܂��B(����ɁA���̃v���p�e�B����g�p�ł��܂��B)
+ <literal>id</literal> (小文字)は特別なプロパティであり、
+ オブジェクトのユニークな識別子を参照するために使用できます。(さらに、そのプロパティ名を使用できます。)
</para>
<programlisting><![CDATA[from Cat as cat where cat.id = 123
@@ -449,12 +451,12 @@
from Cat as cat where cat.mate.id = 69]]></programlisting>
<para>
- 2�Ԗڂ̃N�G���͌����I�ł��B�e�[�u���������K�v����܂���I
+ 2番目のクエリは効率的です。テーブル結合が必要ありません!
</para>
<para>
- �܂��������ʎq�̃v���p�e�B��g�p�ł��܂��B������
<literal>Person</literal> ��
- <literal>country</literal> ��
<literal>medicareNumber</literal> ����Ȃ镡�����ʎq���Ɖ��肵�܂��B
+ また複合識別子のプロパティも使用できます。ここで <literal>Person</literal> が
+ <literal>country</literal> と
<literal>medicareNumber</literal> からなる複合識別子を持つと仮定します。
</para>
<programlisting><![CDATA[from bank.Person person
@@ -466,70 +468,70 @@
and account.owner.id.medicareNumber = 123456]]></programlisting>
<para>
- �����x�����܂����A2�Ԗڂ̃N�G���ɂ̓e�[�u���������K�v����܂���B
+ もう一度言いますが、2番目のクエリにはテーブル結合が必要ありません。
</para>
<para>
- ���l�� <literal>class</literal> �͓��ʂȃv���p�e�B�ł���A
- �|�����[�t�B�b�N�ȉi�����ɂ�����C���X�^���X��discriminator�l�ɃA�N�Z�X���܂��B
- where�߂ɖ��ߍ��܂ꂽJava�̃N���X���͂���discriminator�l�ɕϊ�����܂��B
+ 同様に <literal>class</literal> は特別なプロパティであり、
+ ポリモーフィックな永続化におけるインスタンスのdiscriminator値にアクセスします。
+ where節に埋め込まれたJavaのクラス名はそのdiscriminator値に変換されます。
</para>
<programlisting><![CDATA[from Cat cat where cat.class =
DomesticCat]]></programlisting>
<para>
-
�܂��R���|�[�l���g�╡�����[�U�^(�܂����̃R���|�[�l���g�̃R���|�[�l���g�Ȃ�)�̃v���p�e�B��w��ł��܂��B
+ またコンポーネントや複合ユーザ型(またそのコンポーネントのコンポーネントなど)のプロパティも指定できます。
-
�����������āi�R���|�[�l���g�̃v���p�e�B�ł͂Ȃ��j�R���|�[�l���g�^�̃v���p�e�B�ŏI������p�X����g��Ȃ��ł��������B
- �Ⴆ��� <literal>store.owner</literal> ��
<literal>address</literal>
- �R���|�[�l���g���G���e�B�e�B�Ȃ�Έȉ��̂悤�Ȍ��ʂƂȂ�܂��B
+ しかし決して(コンポーネントのプロパティではなく)コンポーネント型のプロパティで終了するパス式を使わないでください。
+ 例えばもし <literal>store.owner</literal> が
<literal>address</literal>
+ コンポーネントを持つエンティティならば以下のような結果となります。
</para>
<programlisting><![CDATA[store.owner.address.city // okay
store.owner.address // error!]]></programlisting>
<para>
- "any"�^�͓��ʂȃv���p�e�B�ł��� <literal>id</literal> ��
<literal>class</literal> �����A
-
�ȉ��̕��@�Ō�����\�����邱�Ƃ�\�ɂ��܂�(<literal>AuditLog.item</literal> ��
- <literal><any></literal>
�Ń}�b�s���O���ꂽ�v���p�e�B�ł�)�B
+ "any"型は特別なプロパティである <literal>id</literal> と
<literal>class</literal> を持ち、
+ 以下の方法で結合を表現することを可能にします(<literal>AuditLog.item</literal> は
+ <literal><any></literal> でマッピングされたプロパティです)。
</para>
<programlisting><![CDATA[from AuditLog log, Payment payment
where log.item.class = 'Payment' and log.item.id =
payment.id]]></programlisting>
<para>
- <literal>log.item.class</literal> ��
<literal>payment.class</literal> ��
- ��L�̃N�G�����őS���قȂ�f�[�^�x�[�X�J�����̒l��Q�Ƃ���Ƃ������Ƃɒ��ӂ��Ă��������B
+ <literal>log.item.class</literal> と
<literal>payment.class</literal> が
+ 上記のクエリ中で全く異なるデータベースカラムの値を参照するということに注意してください。
</para>
</sect1>
<sect1 id="queryhql-expressions">
- <title>Expressions ��</title>
+ <title>Expressions 式</title>
<para>
- SQL�� <literal>where</literal>
�߂ŋL�q���邱�Ƃ��o���鎮�̂قƂ�ǂ�HQL�ł�L�q�ł��܂��B:
+ SQLの <literal>where</literal> 節で記述することが出来る式のほとんどをHQLでも記述できます。:
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- �Z�p���Z�q�F<literal>+, -, *, /</literal>
+ 算術演算子:<literal>+, -, *, /</literal>
</para>
</listitem>
<listitem>
<para>
- 2����r���Z�q�F<literal>=, >=, <=,
<>, !=, like</literal>
+ 2項比較演算子:<literal>=, >=, <=, <>, !=,
like</literal>
</para>
</listitem>
<listitem>
<para>
- �_�����Z�q�F<literal>and, or, not</literal>
+ 論理演算子:<literal>and, or, not</literal>
</para>
</listitem>
<listitem>
<para>
- �O���[�v������\�����ʁF<literal>( )</literal>
+ グループ分けを表す括弧:<literal>( )</literal>
</para>
</listitem>
<listitem>
@@ -547,13 +549,13 @@
</listitem>
<listitem>
<para>
- "�V���v��"��case <literal>case ... when ... then ...
else ... end</literal>�A
- "�T���I"��case <literal>case when ... then ... else
... end</literal>
+ "シンプル"なcase <literal>case ... when ... then ... else
... end</literal>、
+ "探索的"なcase <literal>case when ... then ... else ...
end</literal>
</para>
</listitem>
<listitem>
<para>
- �X�g�����O�̘A�� <literal>...||...</literal> �܂���
<literal>concat(...,...)</literal>
+ ストリングの連結 <literal>...||...</literal> または
<literal>concat(...,...)</literal>
</para>
</listitem>
<listitem>
@@ -571,74 +573,74 @@
</listitem>
<listitem>
<para>
- EJB-QL 3.0�Œ�`����Ă�����≉�Z�q: <literal>substring(), trim(),
+ EJB-QL 3.0で定義されている関数や演算子: <literal>substring(), trim(),
lower(), upper(), length(), locate(), abs(), sqrt(),
bit_length()</literal>
</para>
</listitem>
<listitem>
<para>
- <literal>coalesce()</literal> ��
<literal>nullif()</literal>
+ <literal>coalesce()</literal> と
<literal>nullif()</literal>
</para>
</listitem>
<listitem>
<para>
- �����⎞�Ԃ̒l��String�ɃR���o�[�g����
<literal>str()</literal>�j
+ 数字や時間の値をStringにコンバートする <literal>str()</literal>)
</para>
</listitem>
<listitem>
<para>
- 2�Ԗڂ̈�����Hibernate�^�̖��O�ł��� <literal>cast(... as
...)</literal> ��
- <literal>extract(... from ...)</literal>�B
- �������g�p����f�[�^�x�[�X��ANSI <literal>cast()</literal>
�� <literal>extract()</literal>
- ��T�|�[�g����ꍇ�Ɍ���܂��B
+ 2番目の引数がHibernate型の名前である <literal>cast(... as
...)</literal> と
+ <literal>extract(... from ...)</literal>。
+ ただし使用するデータベースがANSI <literal>cast()</literal> と
<literal>extract()</literal>
+ をサポートする場合に限ります。
</para>
</listitem>
<listitem>
<para>
- ���������C���f�b�N�X�t���̃R���N�V�����̕ʖ��ɓK�p�����HQL��
- <literal>index()</literal> ���B
+ 結合したインデックス付きのコレクションの別名に適用されるHQLの
+ <literal>index()</literal> 関数。
</para>
</listitem>
<listitem>
<para>
- �R���N�V�����l�̃p�X������HQL���F <literal>size(),
minelement(), maxelement(),
- minindex(), maxindex()</literal> �B
- <literal>some, all, exists, any, in</literal>
��g���ďC�����邱�Ƃ��ł�����ʂ�
- <literal>elements()</literal> ��
<literal>indices</literal> ���ƈꏏ�Ɏg���܂��B
+ コレクション値のパス式を取るHQL関数: <literal>size(), minelement(),
maxelement(),
+ minindex(), maxindex()</literal> 。
+ <literal>some, all, exists, any, in</literal>
を使って修飾することができる特別な
+ <literal>elements()</literal> と
<literal>indices</literal> 関数と一緒に使います。
</para>
</listitem>
<listitem>
<para>
<literal>sign()</literal>,
<literal>trunc()</literal>, <literal>rtrim()</literal>,
<literal>sin()</literal>
- �̂悤�ȃf�[�^�x�[�X���T�|�[�g����SQL�X�J�����B
+ のようなデータベースがサポートするSQLスカラ関数。
</para>
</listitem>
<listitem>
<para>
- JDBC�X�^�C���̈ʒu�p�����[�^ <literal>?</literal>
+ JDBCスタイルの位置パラメータ <literal>?</literal>
</para>
</listitem>
<listitem>
<para>
- ���O�t���p�����[�^: <literal>:name</literal>,
<literal>:start_date</literal>, <literal>:x1</literal>
+ 名前付きパラメータ: <literal>:name</literal>,
<literal>:start_date</literal>, <literal>:x1</literal>
</para>
</listitem>
<listitem>
<para>
- SQL���e�����F<literal>'foo'</literal>,
<literal>69</literal>, <literal>6.66E+2</literal>,
+ SQLリテラル:<literal>'foo'</literal>,
<literal>69</literal>, <literal>6.66E+2</literal>,
<literal>'1970-01-01 10:00:01.0'</literal>
</para>
</listitem>
<listitem>
<para>
- Java�� <literal>public static final</literal>
�萔�F<literal>eg.Color.TABBY</literal>
+ Javaの <literal>public static final</literal>
定数:<literal>eg.Color.TABBY</literal>
</para>
</listitem>
</itemizedlist>
<para>
- <literal>in</literal> �� <literal>between</literal>
�͈ȉ��̂悤�Ɏg�p�ł��܂��B:
+ <literal>in</literal> と <literal>between</literal>
は以下のように使用できます。:
</para>
<programlisting><![CDATA[from DomesticCat cat where cat.name between
'A' and 'B']]></programlisting>
@@ -646,7 +648,7 @@
<programlisting><![CDATA[from DomesticCat cat where cat.name in (
'Foo', 'Bar', 'Baz' )]]></programlisting>
<para>
- �܂��A�ے�`�ŋL�q���邱�Ƃ�ł��܂��B
+ また、否定形で記述することもできます。
</para>
<programlisting><![CDATA[from DomesticCat cat where cat.name not between
'A' and 'B']]></programlisting>
@@ -654,25 +656,25 @@
<programlisting><![CDATA[from DomesticCat cat where cat.name not in (
'Foo', 'Bar', 'Baz' )]]></programlisting>
<para>
- ���l�� <literal>is null</literal> �� <literal>is not
null</literal> ��null�l��e�X�g���邽�߂Ɏg�p�ł��܂��B
+ 同様に <literal>is null</literal> や <literal>is not
null</literal> はnull値をテストするために使用できます。
</para>
<para>
- Hibernate�ݒ�t�@�C����HQL query
substitutions���`����Aboolean�l���̒��ŊȒP�Ɏg�p�ł��܁B�F
+ Hibernate設定ファイルでHQL query substitutionsを定義すれば、boolean値を式の中で簡単に使用できま。:
</para>
<programlisting><![CDATA[<property
name="hibernate.query.substitutions">true 1, false
0</property>]]></programlisting>
<para>
- �������邱�Ƃʼn��L��HQL��SQL�ɕϊ�����Ƃ��� <literal>true</literal> ,
- <literal>false</literal> �L�[���[�h��
<literal>1</literal> , <literal>0</literal> �ɒu���������܂��B:
+ こうすることで下記のHQLをSQLに変換するときに <literal>true</literal> ,
+ <literal>false</literal> キーワードは <literal>1</literal>
, <literal>0</literal> に置き換えられます。:
</para>
<programlisting><![CDATA[from Cat cat where cat.alive =
true]]></programlisting>
<para>
- ���ʂȃv���p�e�B <literal>size</literal>�A�܂��͓��ʂȊ�
<literal>size()</literal>
- ��g���ăR���N�V�����̃T�C�Y��e�X�g�ł��܂��B:
+ 特別なプロパティ <literal>size</literal>、または特別な関数
<literal>size()</literal>
+ を使ってコレクションのサイズをテストできます。:
</para>
<programlisting><![CDATA[from Cat cat where cat.kittens.size >
0]]></programlisting>
@@ -680,10 +682,10 @@
<programlisting><![CDATA[from Cat cat where size(cat.kittens) >
0]]></programlisting>
<para>
- �C���f�b�N�X�t���̃R���N�V�����ł́A<literal>minindex</literal> ��
<literal>maxindex</literal>
- ����g���āA�C���f�b�N�X�̍ŏ��l�ƍő�l��Q�Ƃł��܂��B
- ���l�ɁA<literal>minelement</literal> ��
<literal>maxelement</literal> ��g���āA
- ��{�^�̃R���N�V�����v�f�̍ŏ��l�ƍő�l��Q�Ƃł��܂��B
+ インデックス付きのコレクションでは、<literal>minindex</literal> と
<literal>maxindex</literal>
+ 関数を使って、インデックスの最小値と最大値を参照できます。
+ 同様に、<literal>minelement</literal> と
<literal>maxelement</literal> を使って、
+ 基本型のコレクション要素の最小値と最大値を参照できます。
</para>
<programlisting><![CDATA[from Calendar cal where
maxelement(cal.holidays) > current_date]]></programlisting>
@@ -693,9 +695,9 @@
<programlisting><![CDATA[from Order order where minelement(order.items)
> 10000]]></programlisting>
<para>
-
�R���N�V�����̗v�f��C���f�b�N�X�̃Z�b�g�i<literal>elements</literal> ��
<literal>indices</literal>
- ���j�A�܂��͕��₢���킹�i��q�j�̌��ʂ�����Ƃ��́A
- SQL�� <literal>any, some, all, exists, in</literal>
���T�|�[�g����܂��B
+ コレクションの要素やインデックスのセット(<literal>elements</literal> と
<literal>indices</literal>
+ 関数)、または副問い合わせ(後述)の結果が受け取れるときは、
+ SQL関数 <literal>any, some, all, exists, in</literal> がサポートされます。
</para>
<programlisting><![CDATA[select mother from Cat as mother, Cat as kit
@@ -713,12 +715,12 @@
<para>
<literal>size</literal>, <literal>elements</literal>,
<literal>indices</literal>,
<literal>minindex</literal>,
<literal>maxindex</literal>, <literal>minelement</literal>,
- <literal>maxelement</literal>
��Hibernate3��where�߂����ŗ��p�\�ł��邱�Ƃɒ��ӂ��Ă��������B
+ <literal>maxelement</literal>
はHibernate3のwhere節だけで利用可能であることに注意してください。
</para>
<para>
- �C���f�b�N�X�t���̃R���N�V�����iarrays, lists, maps�j�̗v�f�́A
- �C���f�b�N�X�ŎQ�Ƃł��܂��iwhere�ߓ�ł̂݁j�B
+ インデックス付きのコレクション(arrays, lists, maps)の要素は、
+ インデックスで参照できます(where節内でのみ)。
</para>
<programlisting><![CDATA[from Order order where order.items[0].id =
1234]]></programlisting>
@@ -734,14 +736,14 @@
where order.items[ maxindex(order.items) ] = item and order.id =
11]]></programlisting>
<para>
- <literal>[]</literal> ����̎��́A�Z�p���ł�\���܂���B
+ <literal>[]</literal> 内部の式は、算術式でも構いません。
</para>
<programlisting><![CDATA[select item from Item item, Order order
where order.items[ size(order.items) - 1 ] = item]]></programlisting>
<para>
- ��Α��֘A��l�̃R���N�V�����̗v�f�ɑ��ẮAHQL�͑g�ݍ��݂�
<literal>index()</literal> ����p�ӂ��Ă��܂��B
+ 一対多関連や値のコレクションの要素に対しては、HQLは組み込みの <literal>index()</literal>
関数も用意しています。
</para>
<programlisting><![CDATA[select item, index(item) from Order order
@@ -749,13 +751,13 @@
where index(item) < 5]]></programlisting>
<para>
- �x�[�X�ƂȂ�f�[�^�x�[�X���T�|�[�g���Ă���X�J���[SQL�����g�p�ł��܂�
+ ベースとなるデータベースがサポートしているスカラーSQL関数が使用できます
</para>
<programlisting><![CDATA[from DomesticCat cat where upper(cat.name) like
'FRI%']]></programlisting>
<para>
- ����܂��S�Ă𗝉��Ă��Ȃ��Ȃ�A���̃N�G����SQL�łǂꂾ�������A�ǂ݂Â炭�o���邩�l���Ă��������B:
+ もしまだ全てを理解していないなら、下のクエリをSQLでどれだけ長く、読みづらく出来るか考えてください。:
</para>
@@ -768,7 +770,7 @@
and prod = all elements(cust.currentOrder.lineItems)]]></programlisting>
<para>
- <emphasis>�q���g:</emphasis> �Ⴆ���̂悤�ɏo���܂��B
+ <emphasis>ヒント:</emphasis> 例えばこのように出来ます。
</para>
<programlisting><![CDATA[SELECT cust.name, cust.address, cust.phone,
cust.id, cust.current_order
@@ -792,25 +794,25 @@
</sect1>
<sect1 id="queryhql-ordering">
- <title>order by��</title>
+ <title>order by節</title>
<para>
- �N�G�����Ԃ�list�́A�Ԃ����N���X��R���|�[�l���g�̔C�ӂ̑����ɂ���ĕ��בւ����܂��B�F
+ クエリが返すlistは、返されるクラスやコンポーネントの任意の属性によって並べ替えられます。:
</para>
<programlisting><![CDATA[from DomesticCat cat
order by cat.name asc, cat.weight desc, cat.birthdate]]></programlisting>
<para>
- �I�v�V������ <literal>asc</literal> ��
<literal>desc</literal> �͂��ꂼ�ꏸ�����~���̐�������܂��B
+ オプションの <literal>asc</literal> と
<literal>desc</literal> はそれぞれ昇順か降順の整列を示します。
</para>
</sect1>
<sect1 id="queryhql-grouping">
- <title>group by��</title>
+ <title>group by節</title>
<para>
-
�W��l��Ԃ��N�G���́A�Ԃ����N���X��R���|�[�l���g�̔C�ӂ̃v���p�e�B�ɂ���ăO���[�v���ł��܂��B:
+ 集約値を返すクエリは、返されるクラスやコンポーネントの任意のプロパティによってグループ化できます。:
</para>
<programlisting><![CDATA[select cat.color, sum(cat.weight), count(cat)
@@ -822,7 +824,7 @@
group by foo.id]]></programlisting>
<para>
- <literal>having</literal> �߂�g���܂��B
+ <literal>having</literal> 節も使えます。
</para>
<programlisting><![CDATA[select cat.color, sum(cat.weight), count(cat)
@@ -831,9 +833,9 @@
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)]]></programlisting>
<para>
- ����g�p����f�[�^�x�[�X���T�|�[�g���Ă���Ȃ�A
- <literal>having</literal> �� <literal>order
by</literal> �߂�SQL���ƏW������g���܂�
- �i�Ⴆ��MySQL�ɂ͂���܂���j�B
+ もし使用するデータベースがサポートしているなら、
+ <literal>having</literal> と <literal>order
by</literal> 節でSQL関数と集約関数が使えます
+ (例えばMySQLにはありません)。
</para>
<programlisting><![CDATA[select cat
@@ -844,19 +846,19 @@
order by count(kitten) asc, sum(kitten.weight) desc]]></programlisting>
<para>
- <literal>group by</literal> �߂� <literal>order
by</literal> �߂�
- �Z�p����܂ނ��Ƃ��ł��Ȃ����Ƃɒ��ӂ��Ă��������B
+ <literal>group by</literal> 節や <literal>order
by</literal> 節に
+ 算術式を含むことができないことに注意してください。
</para>
</sect1>
<sect1 id="queryhql-subqueries" revision="2">
- <title>���₢���킹</title>
+ <title>副問い合わせ</title>
<para>
-
�T�u�Z���N�g��T�|�[�g����f�[�^�x�[�X�̂��߁AHibernate�͕��₢���킹��T�|�[�g���Ă��܂��B
- ���₢���킹�͊��ʂň͂܂Ȃ���Ȃ�܂���iSQL�̏W����Ăяo���ɂ�鎖�������ł��j�B
- �֘A���₢���킹(�O���N�G�����̕ʖ���Q�Ƃ��镛�₢���킹�̂���)����������܂��B
+ サブセレクトをサポートするデータベースのため、Hibernateは副問い合わせをサポートしています。
+ 副問い合わせは括弧で囲まなければなりません(SQLの集約関数呼び出しによる事が多いです)。
+ 関連副問い合わせ(外部クエリ中の別名を参照する副問い合わせのこと)さえ許可されます。
</para>
<programlisting><![CDATA[from Cat as fatcat
@@ -883,11 +885,11 @@
from Cat as cat]]></programlisting>
<para>
- HQL���₢���킹�́Aselect�܂���where�߂����Ŏg���邱�Ƃɒ��ӂ��Ă��������B
+ HQL副問い合わせは、selectまたはwhere節だけで使われることに注意してください。
</para>
<para>
- select���X�g�ɕ����̎������₢���킹�ɂ́A�^�v����g�����Ƃ��ł��܂��B
+ selectリストに複数の式を持つ副問い合わせには、タプルを使うことができます。
</para>
<programlisting><![CDATA[from Cat as cat
@@ -896,43 +898,43 @@
)]]></programlisting>
<para>
- �������̃f�[�^�x�[�X�iOracle��HSQL�ɂ͂���܂���j�ł́A
- ���̃R���e�L�X�g�ł�^�v�����g���܂��B
- �Ⴆ�A�N�G���R���|�[�l���g�╡�����[�U�^�ɂ����Ăł��B
+ いくつかのデータベース(OracleやHSQLにはありません)では、
+ 他のコンテキストでもタプルが使えます。
+ 例えば、クエリコンポーネントや複合ユーザ型においてです。
</para>
<programlisting><![CDATA[from Person where name = ('Gavin',
'A', 'King')]]></programlisting>
<para>
- �����ł����A���璷�ȃN�G���ł��F
+ 同等ですが、より冗長なクエリです:
</para>
<programlisting><![CDATA[from Person where name.first = 'Gavin'
and name.initial = 'A' and name.last =
'King')]]></programlisting>
<para>
- ���̂悤�Ȃ��Ƃ������Ȃ��̂ɂ�2�̗��R������܂��F
- 1�ڂ́A�f�[�^�x�[�X�v���b�g�t�H�[���ԂŊ��S�Ȍ݊����͂Ȃ�����ł��B
- 2�ڂ́A�N�G�����}�b�s���O�h�L�������g�̃v���p�e�B�̏����Ɉˑ����邩��ł��B
+ このようなことをしたくないのには2つの理由があります:
+ 1つ目は、データベースプラットフォーム間で完全な互換性はないからです。
+ 2つ目は、クエリがマッピングドキュメントのプロパティの順序に依存するからです。
</para>
</sect1>
<sect1 id="queryhql-examples">
- <title>HQL�̗�</title>
+ <title>HQLの例</title>
<para>
-
Hibernate�N�G���͔��ɋ��͂ŕ��G�ɂł��܂��B���ہA�N�G������̈З͂�Hibernate�̎�v�ȃZ�[���X�|�C���g�̈�ł��B
- �����ɍŋ߂̃v���W�F�N�g�Ŏg�p�����N�G���Ɣ��ɂ悭�����Ⴊ����܂��B
- �قƂ�ǂ̃N�G���͂����̗���ȒP�ɋL�q�ł��邱�Ƃɒ��ӂ��Ă�������!
+ Hibernateクエリは非常に強力で複雑にできます。実際、クエリ言語の威力はHibernateの主要なセールスポイントの一つです。
+ ここに最近のプロジェクトで使用したクエリと非常によく似た例があります。
+ ほとんどのクエリはこれらの例より簡単に記述できることに注意してください!
</para>
<para>
- �ȉ��̃N�G���͓���̌ڋq�Ɨ^����ꂽ�ŏ��̍��v�l�ɑ��関���������̒���ID�A
- ���i�̐��A�����̍��v���v�l�Ő��ĕԂ��܂��B
- ���i���肷��ہA���݂̃J�^���O��g���܂��B���ʂƂ��ĕԂ����SQL�N�G����
+ 以下のクエリは特定の顧客と与えられた最小の合計値に対する未払い注文の注文ID、
+ 商品の数、注文の合計を合計値で整列して返します。
+ 価格を決定する際、現在のカタログを使います。結果として返されるSQLクエリは
<literal>ORDER</literal>,
<literal>ORDER_LINE</literal>, <literal>PRODUCT</literal>,
- <literal>CATALOG</literal> �����
<literal>PRICE</literal> �e�[�u���ɑ�4�̓��������
- (�֘A���Ȃ�)���₢���킹�����܂��B
+ <literal>CATALOG</literal> および
<literal>PRICE</literal> テーブルに対し4つの内部結合と
+ (関連しない)副問い合わせを持ちます。
</para>
<programlisting><![CDATA[select order.id, sum(price.amount),
count(item)
@@ -955,7 +957,7 @@
order by sum(price.amount) desc]]></programlisting>
<para>
- ���ċ���ȃN�G���Ȃ̂ł��傤!
���i���͕��₢���킹���܂�g���܂���B���������Ď��̃N�G���͎��ۂɂ͈ȉ��̂悤�ɂȂ�܂��B:
+ 何て巨大なクエリなのでしょう! 普段私は副問い合わせをあまり使いません。したがって私のクエリは実際には以下のようになります。:
</para>
<programlisting><![CDATA[select order.id, sum(price.amount),
count(item)
@@ -973,10 +975,10 @@
order by sum(price.amount) desc]]></programlisting>
<para>
- ���̃N�G���͊e�X�e�[�^�X�̎x�������𐔂��܂��B���������ׂĂ̎x���������݂̗��p�҂ɂ��
- �ŐV�̃X�e�[�^�X�ύX�ł��� <literal>AWAITING_APPROVAL</literal>
�ł���ꍇ�����܂��B
- ���̃N�G����2�̓�������� <literal>PAYMENT</literal>,
<literal>PAYMENT_STATUS</literal> �����
- <literal>PAYMENT_STATUS_CHANGE</literal>
�e�[�u���ɑ���֘A���₢���킹�������SQL�N�G���ɕϊ�����܂��B
+ 次のクエリは各ステータスの支払い数を数えます。ただしすべての支払いが現在の利用者による
+ 最新のステータス変更である <literal>AWAITING_APPROVAL</literal> である場合を除きます。
+ このクエリは2つの内部結合と <literal>PAYMENT</literal>,
<literal>PAYMENT_STATUS</literal> および
+ <literal>PAYMENT_STATUS_CHANGE</literal>
テーブルに対する関連副問い合わせを備えたSQLクエリに変換されます。
</para>
<programlisting><![CDATA[select count(payment), status.name
@@ -996,8 +998,8 @@
order by status.sortOrder]]></programlisting>
<para>
- �������set�̑����list�Ƃ��� <literal>statusChanges</literal>
�R���N�V������
- �}�b�s���O�����Ȃ�A�͂邩�ɊȒP�ɃN�G����L�q�ł���ł��傤�B
+ もし私がsetの代わりにlistとして <literal>statusChanges</literal> コレクションを
+ マッピングしたならば、はるかに簡単にクエリを記述できるでしょう。
</para>
<programlisting><![CDATA[select count(payment), status.name
@@ -1009,13 +1011,13 @@
order by status.sortOrder]]></programlisting>
<para>
- ���̃N�G���͌��݂̃��[�U����������g�D�ɑ���A�J�E���g����і������̎x������
- ���ׂĕԂ�MS SQL Server
- �� <literal>isNull()</literal> ����g�p���Ă��܂��B
- ���̃N�G����3�̓��������1�̊O������ �A
- ������ <literal>ACCOUNT</literal>,
<literal>PAYMENT</literal>, <literal>PAYMENT_STATUS</literal>,
- <literal>ACCOUNT_TYPE</literal>,
<literal>ORGANIZATION</literal> �����
- <literal>ORG_USER</literal>
�e�[�u���ɑ��镛�₢���킹������SQL�ɕϊ�����܂��B
+ 次のクエリは現在のユーザが所属する組織に対するアカウントおよび未払いの支払いを
+ すべて返すMS SQL Server
+ の <literal>isNull()</literal> 関数を使用しています。
+ このクエリは3つの内部結合と1つの外部結合 、
+ そして <literal>ACCOUNT</literal>,
<literal>PAYMENT</literal>, <literal>PAYMENT_STATUS</literal>,
+ <literal>ACCOUNT_TYPE</literal>,
<literal>ORGANIZATION</literal> および
+ <literal>ORG_USER</literal> テーブルに対する副問い合わせ持ったSQLに変換されます。
</para>
<programlisting><![CDATA[select account, payment
@@ -1026,7 +1028,7 @@
order by account.type.sortOrder, account.accountNumber,
payment.dueDate]]></programlisting>
<para>
- �������̃f�[�^�x�[�X�ɂ��ẮA(�֘A������ꂽ)���₢���킹�̎g�p�����K�v������ł��傤�B
+ いくつかのデータベースについては、(関連させられた)副問い合わせの使用を避ける必要があるでしょう。
</para>
<programlisting><![CDATA[select account, payment
@@ -1040,12 +1042,12 @@
</sect1>
<sect1 id="queryhql-bulk" revision="2">
- <title>��ʂ�UPDATE��DELETE</title>
+ <title>大量のUPDATEとDELETE</title>
<para>
- HQL�͍��� <literal>update</literal> ��
<literal>delete</literal>�A<literal>insert ... select
...</literal>
- �X�e�[�g�����g��HQL�ɓ���邱�Ƃ�T�|�[�g���Ă��܂��B
- <xref linkend="batch-direct"/> �ɏڍׂ�����܂��B
+ HQLは今は <literal>update</literal> と
<literal>delete</literal>、<literal>insert ... select
...</literal>
+ ステートメントをHQLに入れることをサポートしています。
+ <xref linkend="batch-direct"/> に詳細があります。
</para>
</sect1>
@@ -1053,13 +1055,13 @@
<title>Tips & Tricks</title>
<para>
- ���ۂɌ��ʂ�Ԃ��Ȃ��Ă�N�G���̌��ʐ��𐔂��邱�Ƃ��ł��܂��B:
+ 実際に結果を返さなくてもクエリの結果数を数えることができます。:
</para>
<programlisting><![CDATA[( (Integer) session.createQuery("select
count(*) from ....").iterate().next() ).intValue()]]></programlisting>
<para>
- �R���N�V�����̃T�C�Y�ɂ�茋�ʂ���בւ��邽�߂ɂ͈ȉ��̃N�G����g�p���܂��B:
+ コレクションのサイズにより結果を並べ替えるためには以下のクエリを使用します。:
</para>
<programlisting><![CDATA[select usr.id, usr.name
@@ -1069,13 +1071,13 @@
order by count(msg)]]></programlisting>
<para>
-
�g�p���Ă���f�[�^�x�[�X���T�u�Z���N�g��T�|�[�g����ꍇ�A�N�G����where�߂ŃT�C�Y�ɂ��I�����ݒ�ł��܂�:
+ 使用しているデータベースがサブセレクトをサポートする場合、クエリのwhere節でサイズによる選択条件を設定できます:
</para>
<programlisting><![CDATA[from User usr where size(usr.messages) >=
1]]></programlisting>
<para>
-
�g�p���Ă���f�[�^�x�[�X���T�u�Z���N�g��T�|�[�g���Ȃ��ꍇ�́A���̃N�G����g�p���Ă�������:
+ 使用しているデータベースがサブセレクトをサポートしない場合は、次のクエリを使用してください:
</para>
<programlisting><![CDATA[select usr.id, usr.name
@@ -1085,8 +1087,8 @@
having count(msg) >= 1]]></programlisting>
<para>
- ����������Ă��邹���ŏ�̉��@��message�̌�����
- �[���� <literal>User</literal>
��Ԃ����Ƃ��ł��Ȃ��Ȃ�A�ȉ��̌`�����g���܂��B
+ 内部結合をしているせいで上の解決法がmessageの件数が
+ ゼロの <literal>User</literal> を返すことができないならば、以下の形式が使えます。
</para>
<programlisting><![CDATA[select usr.id, usr.name
@@ -1096,7 +1098,7 @@
having count(msg) = 0]]></programlisting>
<para>
- JavaBean�̃v���p�e�B�́A���O�t���̃N�G���p�����[�^�Ɍ��т��邱�Ƃ��o���܂��B�F
+ JavaBeanのプロパティは、名前付きのクエリパラメータに結びつけることが出来ます。:
</para>
<programlisting><![CDATA[Query q = s.createQuery("from foo Foo as
foo where foo.name=:name and foo.size=:size");
@@ -1104,7 +1106,7 @@
List foos = q.list();]]></programlisting>
<para>
- �R���N�V�����̓t�B���^�t�� <literal>Query</literal>
�C���^�[�t�F�C�X��g�p���邱�ƂŃy�[�W����邱�Ƃ��ł��܂��B:
+ コレクションはフィルタ付き <literal>Query</literal>
インターフェイスを使用することでページをつけることができます。:
</para>
<programlisting><![CDATA[Query q = s.createFilter( collection,
"" ); // the trivial filter
@@ -1113,14 +1115,14 @@
List page = q.list();]]></programlisting>
<para>
- �R���N�V�����̗v�f�̓N�G���t�B���^��g���āA���בւ���O���[�v�������o���܂��B:
+ コレクションの要素はクエリフィルタを使って、並べ替えやグループ分けが出来ます。:
</para>
<programlisting><![CDATA[Collection orderedCollection = s.filter(
collection, "order by this.amount" );
Collection counts = s.filter( collection, "select this.type, count(this) group by
this.type" );]]></programlisting>
<para>
- �R���N�V���������������ɃR���N�V�����̃T�C�Y�邱�Ƃ��ł��܂��B:
+ コレクションを初期化せずにコレクションのサイズを得ることができます。:
</para>
<programlisting><![CDATA[( (Integer) session.createQuery("select
count(*) from ....").iterate().next() ).intValue();]]></programlisting>
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_sql.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_sql.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/query_sql.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,41 +1,43 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="querysql" revision="2">
- <title>�l�C�e�B�uSQL</title>
+ <title>ネイティブSQL</title>
- <para>�f�[�^�x�[�X�̃l�C�e�B�uSQL������g���ăN�G����\�����邱�Ƃ�ł��܂��B
- �N�G���q���g��Oracle�� <literal>CONNECT</literal> �L�[���[�h�̂悤�ɁA
- �f�[�^�x�[�X�Ǝ��̋@�\�𗘗p�������Ƃ��Ɏg���܂��B
- SQL/JDBC�ڎg�p���Ă���A�v���P�[�V��������Hibernate�ւ̈ڍs��e�Ղɂ��Ă��܂��B</para>
+ <para>データベースのネイティブSQL方言を使ってクエリを表現することもできます。
+ クエリヒントやOracleの <literal>CONNECT</literal> キーワードのように、
+ データベース独自の機能を利用したいときに使えます。
+ SQL/JDBCを直接使用しているアプリケーションからHibernateへの移行も容易にしています。</para>
- <para>Hibernate3�ł́A�����A�X�V�A�폜�A�ǂݍ��ݏ����̂悤�Ȃ��ׂĂ�
- SQL�i�X�g�A�h�v���V�[�W����܂ށj��菑���ł��܂��B</para>
+ <para>Hibernate3では、生成、更新、削除、読み込み処理のようなすべての
+ SQL(ストアドプロシージャを含む)を手書きできます。</para>
<sect1 id="querysql-creating" revision="4">
- <title><literal>SQLQuery</literal> �̎g�p</title>
+ <title><literal>SQLQuery</literal> の使用</title>
- <para>�l�C�e�B�u��SQL�N�G���̎��s�� <literal>SQLQuery</literal>
- �C���^�[�t�F�C�X��ʂ��Đ��䂵�܂��B
- <literal>SQLQuery</literal> �C���^�[�t�F�C�X��
- <literal>Session.createSQLQuery()</literal> ��Ăяo���Ď擾���܂��B
- ����API��g���Ė₢���킹������@��ȉ��Ő�����܂��B</para>
+ <para>ネイティブなSQLクエリの実行は <literal>SQLQuery</literal>
+ インターフェイスを通して制御します。
+ <literal>SQLQuery</literal> インターフェイスは
+ <literal>Session.createSQLQuery()</literal> を呼び出して取得します。
+ このAPIを使って問い合わせする方法を以下で説明します。</para>
<sect2>
- <title>�X�J���[�̃N�G��</title>
+ <title>スカラーのクエリ</title>
- <para>�ł��{�I��SQL�N�G���̓X�J���[�i�l�j�̃��X�g�邱�Ƃł��B</para>
+ <para>最も基本的なSQLクエリはスカラー(値)のリストを得ることです。</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM
CATS").list();
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
]]></programlisting>
- <para>�����͂ǂ����ACATS�e�[�u���̊e�J�����̃X�J���[�l��܂�
- Object�z��iObject[]�j�̃��X�g��Ԃ��܂��B
- �Ԃ��X�J���[�l�̎��ۂ̏��Ԃƌ^�𐄒肷�邽�߂ɁA
- Hibernate��ResultSetMetadata��g�p���܂��B</para>
+ <para>これらはどちらも、CATSテーブルの各カラムのスカラー値を含む
+ Object配列(Object[])のリストを返します。
+ 返すスカラー値の実際の順番と型を推定するために、
+ HibernateはResultSetMetadataを使用します。</para>
- <para><literal>ResultSetMetadata</literal>
��g�p����I�[�o�[�w�b�h����邽�߁A
- ������͒P�ɉ����Ԃ���邩���m�ɂ��邽�߁A<literal>addScalar()</literal>
- ��g���܂��B</para>
+ <para><literal>ResultSetMetadata</literal> を使用するオーバーヘッドを避けるため、
+ もしくは単に何が返されるか明確にするため、<literal>addScalar()</literal>
+ を使えます。</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM
CATS")
.addScalar("ID", Hibernate.LONG)
@@ -43,28 +45,28 @@
.addScalar("BIRTHDATE", Hibernate.DATE)
]]></programlisting>
- <para>���̃N�G���Ŏw�肳��Ă����̂��L�Ɏ����܂��B</para>
+ <para>このクエリで指定されているものを下記に示します。</para>
<itemizedlist>
<listitem>
- <para>SQL�N�G��������</para>
+ <para>SQLクエリ文字列</para>
</listitem>
<listitem>
- <para>�Ԃ����J�����ƌ^</para>
+ <para>返されるカラムと型</para>
</listitem>
</itemizedlist>
- <para>����͂܂�Object�z���Ԃ��܂����A
- <literal>ResultSetMetdata</literal> ��g�p���܂���B
- �������A���̑���Ɋ�b�ɂ��郊�U���g�Z�b�g����
- ID�ANAME�ABIRTHDATE �J�������ꂼ��
- Long�AString�AShort �Ƃ��Ė����I�Ɏ擾���܂��B
- ����͂R�̃J������Ԃ��݂̂ł��邱�Ƃ�Ӗ����܂��B
- ���Ƃ��A�N�G���� <literal>*</literal> ��g�p���A
- �����R��葽���̃J������Ԃ���Ƃ��Ă�ł��B</para>
+ <para>これはまだObject配列を返しますが、
+ <literal>ResultSetMetdata</literal> を使用しません。
+ ただし、その代わりに基礎にあるリザルトセットから
+ ID、NAME、BIRTHDATE カラムをそれぞれ
+ Long、String、Short として明示的に取得します。
+ これは3つのカラムを返すのみであることも意味します。
+ たとえ、クエリが <literal>*</literal> を使用し、
+ 列挙した3つより多くのカラムを返せるとしてもです。</para>
- <para>�X�J���[�̌^����Ȃ����Ƃ�ł��܂��B</para>
+ <para>スカラーの型情報を省くこともできます。</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM
CATS")
.addScalar("ID", Hibernate.LONG)
@@ -73,68 +75,68 @@
]]></programlisting>
<para>
- ����͖{���I�ɑO�Ɠ����N�G���ł����A�A
- NAME �� BIRTHDATE �̌^���߂邽�߂� <literal>ResultSetMetaData</literal>
- ��g�p���܂��B����AID �̌^�͖����I�Ɏw�肳��Ă��܂��B
+ これは本質的に前と同じクエリですが、、
+ NAME と BIRTHDATE の型を決めるために <literal>ResultSetMetaData</literal>
+ を使用します。一方、ID の型は明示的に指定されています。
</para>
<para>
- ResultSetMetaData ����Ԃ���� java.sql.Types �� Hibernate �̌^��
- �}�b�s���O���邱�Ƃ́ADialect �����䂵�܂��B
- �������ꂽ�^���}�b�s���O����Ă��Ȃ����A���ʂ̌^�����҂�����̂ƈقȂ�ꍇ�A
- Dialect �� <literal>registerHibernateType</literal> ��Ăяo���A
- �J�X�^�}�C�Y�ł��܂��B
+ ResultSetMetaData から返される java.sql.Types を Hibernate の型に
+ マッピングすることは、Dialect が制御します。
+ 明示された型がマッピングされていないか、結果の型が期待したものと異なる場合、
+ Dialect の <literal>registerHibernateType</literal> を呼び出し、
+ カスタマイズできます。
</para>
</sect2>
<sect2>
- <title>�G���e�B�e�B�̃N�G��</title>
+ <title>エンティティのクエリ</title>
- <para>�����܂ł̃N�G���́A���ׂăX�J���[�l��Ԃ���̂ł����B
- ��{�I�ɁA���U���g�Z�b�g����u�����H�v�̒l��Ԃ��܂��B
- �ȍ~�ł́A<literal>addEntity()</literal> �ɂ��A�l�C�e�B�uSQL�N�G������
- �G���e�B�e�B�I�u�W�F�N�g��擾������@�����܂��B</para>
+ <para>ここまでのクエリは、すべてスカラー値を返すものでした。
+ 基本的に、リザルトセットから「未加工」の値を返します。
+ 以降では、<literal>addEntity()</literal> により、ネイティブSQLクエリから
+ エンティティオブジェクトを取得する方法を示します。</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM
CATS").addEntity(Cat.class);
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM
CATS").addEntity(Cat.class);
]]></programlisting>
- <para>���̃N�G���Ŏw�肳��Ă����̂��L�Ɏ����܂��B</para>
+ <para>このクエリで指定されているものを下記に示します。</para>
<itemizedlist>
<listitem>
- <para>SQL�N�G��������</para>
+ <para>SQLクエリ文字列</para>
</listitem>
<listitem>
- <para>�N�G�����Ԃ��G���e�B�e�B��SQL�e�[�u���̕ʖ�
+ <para>クエリが返すエンティティとSQLテーブルの別名
</para>
</listitem>
</itemizedlist>
- <para>Cat��ID, NAME, BIRTHDATE�̃J������g���ăN���X�Ƀ}�b�s���O�����ꍇ�A
- ��L�̃N�G���͂ǂ����A�v�f��Cat�G���e�B�e�B�ł��郊�X�g��Ԃ��܂��B</para>
+ <para>CatがID, NAME, BIRTHDATEのカラムを使ってクラスにマッピングされる場合、
+ 上記のクエリはどちらも、要素がCatエンティティであるリストを返します。</para>
- <para>�G���e�B�e�B��ʂ̃G���e�B�e�B�� <literal>���Έ�</literal>
�Ń}�b�s���O���Ă���ꍇ�́A
- �l�C�e�B�u�N�G������s����ۂɁA���̕ʂ̃G���e�B�e�B��Ԃ����Ƃ�v�����܂��B
- ����Ȃ���A�f�[�^�x�[�X�ŗL�́ucolumn not
found(�J������������܂���)�v�G���[���������܂��B
- * �\�L��g�p�����ۂ́A�lj��̃J�����������I�ɕԂ���܂����A
- ���̗�̂悤�ɁA<literal>Dog</literal> ��
<literal>���Έ�</literal> �ł��邱�Ƃ�
- �������邱�Ƃ������͍D�݂܂��B</para>
+ <para>エンティティを別のエンティティに <literal>多対一</literal> でマッピングしている場合は、
+ ネイティブクエリを実行する際に、この別のエンティティを返すことも要求します。
+ さもなければ、データベース固有の「column not found(カラムが見つかりません)」エラーが発生します。
+ * 表記を使用した際は、追加のカラムが自動的に返されますが、
+ 次の例のように、<literal>Dog</literal> に <literal>多対一</literal>
であることを
+ 明示することを私たちは好みます。</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT ID, NAME,
BIRTHDATE, DOG_ID FROM CATS").addEntity(Cat.class);
]]></programlisting>
- <para>����ɂ�� cat.getDog() ���������@�\���܂��B</para>
+ <para>これにより cat.getDog() が正しく機能します。</para>
</sect2>
<sect2>
- <title>�֘A�ƃR���N�V�����̑���</title>
+ <title>関連とコレクションの操作</title>
- <para>�v���L�V���������邽�߂̗]���ȏ�������邽�߁A
- <literal>Dog</literal> �̒��ő��������ł��܂��B
- ����� <literal>addJoin()</literal> ���\�b�h�ɂ��s���܂��B
- �֘A������̓R���N�V�����Ɍ����ł��܂��B
+ <para>プロキシを初期化するための余分な処理を避けるため、
+ <literal>Dog</literal> の中で即時結合できます。
+ これは <literal>addJoin()</literal> メソッドにより行います。
+ 関連もしくはコレクションに結合できます。
</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT c.ID, NAME,
BIRTHDATE, DOG_ID, D_ID, D_NAME FROM CATS c, DOGS d WHERE c.DOG_ID = d.D_ID")
@@ -142,79 +144,79 @@
.addJoin("cat.dog");
]]></programlisting>
- <para>���̗�̒��ŁA�Ԃ���� <literal>Cat</literal> �́A
- �f�[�^�x�[�X�ւ̗]�������Ȃ��ŁA
- ���S�ɏ��������ꂽ <literal>dog</literal> �v���p�e�B�����܂��B
- �����Ώۂ̃v���p�e�B�ւ̃p�X��w��ł���悤�ɁA
- �ʖ��i�ucat�v�j��lj��������Ƃɒ��ӂ��Ă��������B
- �R���N�V�����̑�������������悤�ɂł��܂��B
- ���Ƃ��A<literal>Cat</literal> ����Α���
<literal>Dog</literal>
- �����Ă����ꍇ�A���̂悤�ɂȂ�܂��B</para>
+ <para>この例の中で、返される <literal>Cat</literal> は、
+ データベースへの余分処理なしで、
+ 完全に初期化された <literal>dog</literal> プロパティを持ちます。
+ 結合対象のプロパティへのパスを指定できるように、
+ 別名(「cat」)を追加したことに注意してください。
+ コレクションの即時結合も同じようにできます。
+ たとえば、<literal>Cat</literal> が一対多で <literal>Dog</literal>
+ を持っていた場合、次のようになります。</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT ID, NAME,
BIRTHDATE, D_ID, D_NAME, CAT_ID FROM CATS c, DOGS d WHERE c.ID = d.CAT_ID")
.addEntity("cat", Cat.class)
.addJoin("cat.dogs");
]]></programlisting>
- <para>���݂̂Ƃ���A
- Hibernate�Ŏg���₷�����邽�߂�SQL�N�G���̊g���Ȃ��ɁA
- �l�C�e�B�u�N�G���ʼn�����\�ɂ�����E�ɗ��Ă��܂��B
- �����^�̃G���e�B�e�B���Ԃ��ۂ�A�f�t�H���g�̕ʖ���ŏ\���ł͂Ȃ��ꍇ�ɁA
- ���͋N����n�߂܂��B
+ <para>現在のところ、
+ Hibernateで使いやすくするためのSQLクエリの拡張なしに、
+ ネイティブクエリで何かを可能にする限界に来ています。
+ 同じ型のエンティティを複数返す際や、デフォルトの別名や列名で十分ではない場合に、
+ 問題は起こり始めます。
</para>
</sect2>
<sect2>
- <title>�����G���e�B�e�B�̎擾</title>
+ <title>複数エンティティの取得</title>
- <para>�����܂ł́A���U���g�Z�b�g�̃J�������́A
- �}�b�s���O�t�@�C���Ŏw�肳�ꂽ�J�������Ɠ����ł���Ɖ��肵�Ă��܂����B
- �����̃e�[�u���������J���������ꍇ�����邽�߁A
- �����e�[�u����������SQL�N�G���Ŗ��ƂȂ�ꍇ������܂��B</para>
+ <para>ここまでは、リザルトセットのカラム名は、
+ マッピングファイルで指定されたカラム名と同じであると仮定していました。
+ 複数のテーブルが同じカラム名を持つ場合があるため、
+ 複数テーブルを結合するSQLクエリで問題となる場合があります。</para>
- <para>���L�̂悤�ȁi���s�������ȁj�N�G���ł́A
- �J�����ʖ��C���W�F�N�V�����icolumn alias injection�j���K�v�ł��B</para>
+ <para>下記のような(失敗しそうな)クエリでは、
+ カラム別名インジェクション(column alias injection)が必要です。</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT c.*, m.* FROM
CATS c, CATS m WHERE c.MOTHER_ID = m.ID")
.addEntity("cat", Cat.class)
.addEntity("mother", Cat.class)
]]></programlisting>
- <para>���̃N�G���̈Ӑ}�́A
- �P�s���ƂɂQ��Cat�C���X�^���X�A�܂�L�Ƃ��̕�e��Ԃ��Ƃ������Ƃł��B
- �����J�������Ƀ}�b�s���O���邱�Ƃɂ�薼�O���Փ˂��邽�߁A���̃N�G���͎��s���܂��B
- �x�[�^�x�[�X�ɂ���ẮA�Ԃ����J�����̕ʖ��� "c.ID"�A"c.NAME"
�Ȃǂ̌`���ł���A
- �}�b�s���O�Ŏw�肳�ꂽ�J�����i"ID" ��
"NAME"�j�Ɠ������Ȃ����߁A���s���܂��B</para>
+ <para>このクエリの意図は、
+ 1行ごとに2つのCatインスタンス、つまり猫とその母親を返すということです。
+ 同じカラム名にマッピングすることにより名前が衝突するため、このクエリは失敗します。
+ ベータベースによっては、返されるカラムの別名が "c.ID"、"c.NAME" などの形式であり、
+ マッピングで指定されたカラム("ID" と "NAME")と等しくないため、失敗します。</para>
- <para>���L�̌`���́A�J���������d�����Ă���v�ł��B</para>
+ <para>下記の形式は、カラム名が重複しても大丈夫です。</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT {cat.*},
{mother.*} FROM CATS c, CATS m WHERE c.MOTHER_ID = m.ID")
.addEntity("cat", Cat.class)
.addEntity("mother", Cat.class)
]]></programlisting>
- <para>���̃N�G���Ŏw�肳��Ă����̂��L�Ɏ����܂��B</para>
+ <para>このクエリで指定されているものを下記に示します。</para>
<itemizedlist>
<listitem>
- <para>SQL�N�G��������
- �iHibernate���J�����̕ʖ���}�����邽�߂̃v���[�X�z���_��܂ށj</para>
+ <para>SQLクエリ文字列
+ (Hibernateがカラムの別名を挿入するためのプレースホルダを含む)</para>
</listitem>
<listitem>
- <para>�N�G���ɂ���ĕԂ����G���e�B�e�B</para>
+ <para>クエリによって返されるエンティティ</para>
</listitem>
</itemizedlist>
- <para>��L�Ŏg�p���Ă��� {cat.*} �� {mother.*} �Ƃ����\�L�́A
- �u���ׂẴv���p�e�B�v��\���ȗ��`�ł��B
- ����ɁA�����I�ɃJ��������Ă�悢�ł����A
- ���̏ꍇ�́AHibernate�Ɋe�v���p�e�B�ɑΉ�����SQL�J�����̕ʖ���}��������ׂ��ł��傤�B
- �J�����̕ʖ��̂��߂̃v���[�X�z���_�́A�e�[�u���̕ʖ��ɂ���ďC�����ꂽ�v���p�e�B���ł��B
- ���L�̗�ł́A�ʂ̃e�[�u�� cat_log ����
- �}�b�s���O���^�f�[�^�Œ�`���ꂽ Cat �Ƃ��̕�e�����܂��B
- ����D�ނȂ�Awhere�߂̒��ł�A�v���p�e�B�̕ʖ���g���܂��B</para>
+ <para>上記で使用している {cat.*} と {mother.*} という表記は、
+ 「すべてのプロパティ」を表す省略形です。
+ 代わりに、明示的にカラムを列挙してもよいですが、
+ その場合は、Hibernateに各プロパティに対応するSQLカラムの別名を挿入させるべきでしょう。
+ カラムの別名のためのプレースホルダは、テーブルの別名によって修飾されたプロパティ名です。
+ 下記の例では、別のテーブル cat_log から
+ マッピングメタデータで定義された Cat とその母親を復元します。
+ もし好むなら、where節の中でも、プロパティの別名を使えます。</para>
<programlisting><![CDATA[String sql = "SELECT ID as {c.id}, NAME as
{c.name}, " +
"BIRTHDATE as {c.birthDate}, MOTHER_ID as {c.mother}, {mother.*} " +
@@ -226,19 +228,19 @@
]]></programlisting>
<sect3 id="querysql-aliasreferences" revision="2">
- <title>�ʖ��ƃv���p�e�B�̃��t�@�����X</title>
+ <title>別名とプロパティのリファレンス</title>
- <para>�����̏ꍇ�A��L�̂悤�ȕʖ��C���W�F�N�V�������K�v�ł��B
- �������A�����v���p�e�B�A�p�����ʎq�A�R���N�V�����Ȃǂ̂悤��
- ��蕡�G�ȃ}�b�s���O�Ɗ֘A����N�G�����Ȃ���ł��B
- �������̕ʖ���g�p���邱�Ƃɂ��AHibernate�͓K�ȕʖ���}���ł��܂��B</para>
+ <para>多くの場合、上記のような別名インジェクションが必要です。
+ ただし、複合プロパティ、継承識別子、コレクションなどのような
+ より複雑なマッピングと関連するクエリがなければです。
+ ある特定の別名を使用することにより、Hibernateは適切な別名を挿入できます。</para>
- <para>�ʖ��C���W�F�N�V�����Ƃ��Ďg�p�ł����̂��\�Ɏ����܂��B
- ���ӁF���\�̕ʖ��͈��ł��B
- ���ꂼ��̕ʖ��͈�ӂł���A�g�p����ۂɂ͂����炭�قȂ閼�O�����܂��B</para>
+ <para>別名インジェクションとして使用できるものを下表に示します。
+ 注意:下表の別名は一例です。
+ それぞれの別名は一意であり、使用する際にはおそらく異なる名前を持ちます。</para>
<table frame="topbot" id="aliasinjection-summary">
- <title>�ʖ��ɑ}�����閼�O</title>
+ <title>別名に挿入する名前</title>
<tgroup cols="3">
<colspec colwidth="1*" />
@@ -249,60 +251,60 @@
<thead>
<row>
- <entry>���</entry>
- <entry>�\��</entry>
- <entry>��</entry>
+ <entry>説明</entry>
+ <entry>構文</entry>
+ <entry>例</entry>
</row>
</thead>
<tbody>
<row>
- <entry>�P���ȃv���p�e�B</entry>
+ <entry>単純なプロパティ</entry>
<entry><literal>{[aliasname].[propertyname]}</literal></entry>
<entry><literal>A_NAME as
{item.name}</literal></entry>
</row>
<row>
- <entry>�����v���p�e�B</entry>
+ <entry>複合プロパティ</entry>
<entry><literal>{[aliasname].[componentname].[propertyname]}</literal></entry>
<entry><literal>CURRENCY as {item.amount.currency}, VALUE as
{item.amount.value}</literal></entry>
</row>
<row>
- <entry>�G���e�B�e�B�̃N���X���ʂ���l</entry>
+ <entry>エンティティのクラスを識別する値</entry>
<entry><literal>{[aliasname].class}</literal></entry>
<entry><literal>DISC as
{item.class}</literal></entry>
</row>
<row>
- <entry>�G���e�B�e�B�̑S�v���p�e�B</entry>
+ <entry>エンティティの全プロパティ</entry>
<entry><literal>{[aliasname].*}</literal></entry>
<entry><literal>{item.*}</literal></entry>
</row>
<row>
- <entry>�R���N�V�����̃L�[</entry>
+ <entry>コレクションのキー</entry>
<entry><literal>{[aliasname].key}</literal></entry>
<entry><literal>ORGID as
{coll.key}</literal></entry>
</row>
<row>
- <entry>�R���N�V������ID</entry>
+ <entry>コレクションのID</entry>
<entry><literal>{[aliasname].id}</literal></entry>
<entry><literal>EMPID as
{coll.id}</literal></entry>
</row>
<row>
- <entry>�R���N�V�����̗v�f</entry>
+ <entry>コレクションの要素</entry>
<entry><literal>{[aliasname].element}</literal></entry>
<entry><literal>XID as
{coll.element}</literal></entry>
</row>
<row>
- <entry>�R���N�V�����̗v�f�̃v���p�e�B</entry>
+ <entry>コレクションの要素のプロパティ</entry>
<entry><literal>{[aliasname].element.[propertyname]}</literal></entry>
<entry><literal>NAME as
{coll.element.name}</literal></entry>
</row>
<row>
- <entry>�R���N�V�����̗v�f�̑S�v���p�e�B</entry>
+ <entry>コレクションの要素の全プロパティ</entry>
<entry><literal>{[aliasname].element.*}</literal></entry>
<entry><literal>{coll.element.*}</literal></entry>
</row>
<row>
- <entry>�R���N�V�����̑S�v���p�e�B</entry>
+ <entry>コレクションの全プロパティ</entry>
<entry><literal>{[aliasname].*}</literal></entry>
<entry><literal>{coll.*}</literal></entry>
</row>
@@ -313,43 +315,43 @@
</sect2>
<sect2>
- <title>�Ǘ�����Ă��Ȃ��G���e�B�e�B�̎擾</title>
+ <title>管理されていないエンティティの取得</title>
- <para>�l�C�e�B�uSQL�N�G���� ResultTransformer ��K�p�ł��܂��B
- ���L�̂悤�ɁA�Ⴆ�A�Ǘ�����Ă��Ȃ��G���e�B�e�B��Ԃ��܂��B</para>
+ <para>ネイティブSQLクエリに ResultTransformer を適用できます。
+ 下記のように、例えば、管理されていないエンティティを返します。</para>
<programlisting><![CDATA[sess.createSQLQuery("SELECT NAME, BIRTHDATE
FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))]]></programlisting>
- <para>���̃N�G���Ŏw�肳��Ă����̂��L�Ɏ����܂��B</para>
+ <para>このクエリで指定されているものを下記に示します。</para>
<itemizedlist>
<listitem>
- <para>SQL�N�G��������</para>
+ <para>SQLクエリ文字列</para>
</listitem>
<listitem>
- <para>���ʂ�ϊ��������</para>
+ <para>結果を変換したもの</para>
</listitem>
</itemizedlist>
- <para>��L�̃N�G���́A�C���X�^���X�����ANAME �� BIRTHDATE �̒l��
- �Ή�����v���p�e�B������̓t�B�[���h�ɑ}������ <literal>CatDTO</literal>
- �̃��X�g��Ԃ��܂��B</para>
+ <para>上記のクエリは、インスタンス化し、NAME と BIRTHDATE の値を
+ 対応するプロパティもしくはフィールドに挿入した <literal>CatDTO</literal>
+ のリストを返します。</para>
</sect2>
<sect2>
- <title>�p���̐���</title>
+ <title>継承の制御</title>
- <para>�p���̈ꕔ�Ƃ��ă}�b�s���O���ꂽ�G���e�B�e�B��₢���킹��l�C�e�B�uSQL�N�G���́A
- �x�[�X�̃N���X�Ƃ��̂��ׂẴT�u�N���X�̃v���p�e�B���ׂĂ�܂܂Ȃ���Ȃ�܂���B</para>
+ <para>継承の一部としてマッピングされたエンティティを問い合わせるネイティブSQLクエリは、
+ ベースのクラスとそのすべてのサブクラスのプロパティすべてを含まなければなりません。</para>
</sect2>
<sect2>
- <title>�p�����[�^</title>
+ <title>パラメータ</title>
- <para>�l�C�e�B�uSQL�N�G���́A�ȉ��̂悤�ɁA
- ���O�t���p�����[�^�i:name�j�Ɠ��l�Ɉʒu�p�����[�^��T�|�[�g���܂��B</para>
+ <para>ネイティブSQLクエリは、以下のように、
+ 名前付きパラメータ(:name)と同様に位置パラメータをサポートします。</para>
<programlisting><![CDATA[Query query = sess.createSQLQuery("SELECT *
FROM CATS WHERE NAME like ?").addEntity(Cat.class);
List pusList = query.setString(0, "Pus%").list();
@@ -361,11 +363,11 @@
</sect1>
<sect1 id="querysql-namedqueries" revision="3">
- <title>���O�t��SQL�N�G��</title>
+ <title>名前付きSQLクエリ</title>
- <para>���O�t��SQL�N�G���̓}�b�s���O�h�L�������g�Œ�`���邱�Ƃ��ł��A
- ���O�t��HQL�N�G���ƑS���������@�ŌĂԂ��Ƃ��ł��܂��B
- ���̏ꍇ�A<literal>addEntity()</literal> ��Ăяo���K�v��
<emphasis>�Ȃ�</emphasis> �ł��B</para>
+ <para>名前付きSQLクエリはマッピングドキュメントで定義することができ、
+ 名前付きHQLクエリと全く同じ方法で呼ぶことができます。
+ この場合、<literal>addEntity()</literal> を呼び出す必要は
<emphasis>ない</emphasis> です。</para>
<programlisting><![CDATA[<sql-query name="persons">
<return alias="person" class="eg.Person"/>
@@ -381,9 +383,9 @@
.setMaxResults(50)
.list();]]></programlisting>
- <para>�֘A�������邽�߂ƃR���N�V��������������N�G�����`���邽�߂ɁA���ꂼ��
- <literal><return-join></literal> ��
<literal><load-collection></literal>
- �v�f��g���܂��B</para>
+ <para>関連を結合するためとコレクションを初期化するクエリを定義するために、それぞれ
+ <literal><return-join></literal> と
<literal><load-collection></literal>
+ 要素を使います。</para>
<programlisting><![CDATA[<sql-query name="personsWith">
<return alias="person" class="eg.Person"/>
@@ -401,9 +403,9 @@
WHERE person.NAME LIKE :namePattern
</sql-query>]]></programlisting>
- <para>���O�t��SQL�N�G���̓X�J���l��Ԃ����Ƃ�ł��܂��B
- <literal><return-scalar></literal> �v�f��g���āA
- ��̕ʖ���Hibernate�̌^��錾���Ȃ���Ȃ�܂���B</para>
+ <para>名前付きSQLクエリはスカラ値を返すこともできます。
+ <literal><return-scalar></literal> 要素を使って、
+ 列の別名とHibernateの型を宣言しなければなりません。</para>
<programlisting><![CDATA[<sql-query name="mySqlQuery">
<return-scalar column="name" type="string"/>
@@ -414,10 +416,10 @@
</sql-query>]]></programlisting>
- <para>���U���g�Z�b�g�̃}�b�s���O����
<literal><resultset></literal>
- �ɊO�o�����邱�Ƃ��ł��܂��B
- �����̖��O�t���N�G���ōė��p������A<literal>setResultSetMapping()</literal>
- API��ʂ��čė��p������ł��܂��B
+ <para>リザルトセットのマッピング情報を
<literal><resultset></literal>
+ に外出しすることができます。
+ 複数の名前付きクエリで再利用したり、<literal>setResultSetMapping()</literal>
+ APIを通して再利用したりできます。
</para>
<programlisting><![CDATA[<resultset name="personAddress">
@@ -439,8 +441,8 @@
WHERE person.NAME LIKE :namePattern
</sql-query>]]></programlisting>
- <para>����ɁAhbm�t�@�C����̃��U���g�Z�b�g�̃}�b�s���O����
- ����Java�R�[�h�̒��Ŏg�p�ł��܂��B</para>
+ <para>代わりに、hbmファイル内のリザルトセットのマッピング情報を
+ 直接Javaコードの中で使用できます。</para>
<programlisting><![CDATA[List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother =
cat.id"
@@ -449,11 +451,11 @@
.list();]]></programlisting>
<sect2 id="propertyresults">
- <title>��Ɨ�̕ʖ����I�Ɏw�肷�邽�߂� return-property ��g��</title>
+ <title>列と列の別名を明示的に指定するために return-property を使う</title>
- <para>�ʖ���}�����邽�߂� <literal>{}</literal> �\����g������ɁA
- <literal><return-property></literal> ��g���A
- �ǂ̗�̕ʖ���g���̂����ł��܂��B</para>
+ <para>別名を挿入するために <literal>{}</literal> 構文を使う代わりに、
+ <literal><return-property></literal> を使い、
+ どの列の別名を使うのかを明示できます。</para>
<programlisting><![CDATA[<sql-query name="mySqlQuery">
<return alias="person" class="eg.Person">
@@ -468,9 +470,9 @@
</sql-query>
]]></programlisting>
- <para><literal><return-property></literal>
�͕����̗������܂��B
- ����́A������̃v���p�e�B���ߍׂ�������ł��Ȃ��Ƃ����A
- <literal>{}</literal> �\���̐���������܂��B</para>
+ <para><literal><return-property></literal>
は複数の列も扱えます。
+ これは、複数列のプロパティをきめ細かく制御できないという、
+ <literal>{}</literal> 構文の制限を解決します。</para>
<programlisting><![CDATA[<sql-query
name="organizationCurrentEmployments">
<return alias="emp" class="Employment">
@@ -488,24 +490,24 @@
ORDER BY STARTDATE ASC
</sql-query>]]></programlisting>
- <para>���̗�ł́A�}���̂��߂� <literal>{}</literal> �\���Ƃ�������ɁA
- <literal><return-property></literal>
��g���Ă��邱�Ƃɒ��ӂ��Ă��������B
- ��ƃv���p�e�B��ǂ̂悤�ɎQ�Ƃ��邩��I�ׂ܂��B</para>
+ <para>この例では、挿入のための <literal>{}</literal> 構文といっしょに、
+ <literal><return-property></literal> を使っていることに注意してください。
+ 列とプロパティをどのように参照するかを選べます。</para>
- <para>�}�b�s���O�� discriminator ���܂܂�Ă���ꍇ�A
- discriminator �̗��w�肷�邽�߂ɁA<return-discriminator>
- ��g��Ȃ���Ȃ�܂���B</para>
+ <para>マッピングに discriminator が含まれている場合、
+ discriminator の列を指定するために、<return-discriminator>
+ を使わなければなりません。</para>
</sect2>
<sect2 id="sp_query" revision="1">
- <title>�₢���킹���邽�߂ɃX�g�A�h�v���V�[�W����g��</title>
+ <title>問い合わせするためにストアドプロシージャを使う</title>
-
<para>Hibernate�̓o�[�W����3����A�X�g�A�h�v���V�[�W���ƃX�g�A�h���o�R�̖₢���킹��
- �T�|�[�g����܂����B
- �ȍ~�̕����̑����́A�����ɓ��Ă͂܂�܂��B
- �X�g�A�h�v���V�[�W����X�g�A�h����Hibernate�Ŏg�����߂ɂ́A
- 1�Ԗڂ̏o�̓p�����[�^�Ƃ��ă��U���g�Z�b�g��Ԃ��Ȃ���Ȃ�܂���B
- Oracle
9�i������͂���ȏ�̃o�[�W�����j�̃X�g�A�h�v���V�[�W���̗��ȉ��Ɏ����܂��B</para>
+ <para>Hibernateはバージョン3から、ストアドプロシージャとストアド関数経由の問い合わせが
+ サポートされました。
+ 以降の文書の多くは、両方に当てはまります。
+ ストアドプロシージャやストアド関数をHibernateで使うためには、
+ 1番目の出力パラメータとしてリザルトセットを返さなければなりません。
+ Oracle 9(もしくはそれ以上のバージョン)のストアドプロシージャの例を以下に示します。</para>
<programlisting><![CDATA[CREATE OR REPLACE FUNCTION selectAllEmployments
RETURN SYS_REFCURSOR
@@ -520,8 +522,8 @@
RETURN st_cursor;
END;]]></programlisting>
- <para>Hibernate�ł��̃N�G����g�����߂ɂ́A
- ���O�t���N�G���Ń}�b�s���O����K�v������܂��B</para>
+ <para>Hibernateでこのクエリを使うためには、
+ 名前付きクエリでマッピングする必要があります。</para>
<programlisting><![CDATA[<sql-query
name="selectAllEmployees_SP" callable="true">
<return alias="emp" class="Employment">
@@ -539,57 +541,57 @@
{ ? = call selectAllEmployments() }
</sql-query>]]></programlisting>
- <para>���ӁF���̂Ƃ���A�X�g�A�h�v���V�[�W���̓X�J���ƃG���e�B�e�B��Ԃ��݂̂ł��B
- <literal><return-join></literal> ��
<literal><load-collection></literal>
- �̓T�|�[�g����Ă��܂���B</para>
+ <para>注意:今のところ、ストアドプロシージャはスカラとエンティティを返すのみです。
+ <literal><return-join></literal> と
<literal><load-collection></literal>
+ はサポートされていません。</para>
<sect3 id="querysql-limits-storedprocedures"
revision="1">
- <title>�X�g�A�h�v���V�[�W����g����ł̃��[���Ɛ���</title>
+ <title>ストアドプロシージャを使う上でのルールと制限</title>
- <para>Hibernate�ŃX�g�A�h�v���V�[�W�������g�����߂ɂ́A
- ���̃v���V�[�W���͂������̃��[���ɏ�������K�v������܂��B
- ���[���ɏ������Ă��Ȃ��v���V�[�W���́AHibernate�Ŏg�����Ƃ͂ł��܂���B
- ����ł�A�������Ă��Ȃ��v���V�[�W����g�������̂ł���A
- <literal>session.connection()</literal> ��ʂ��Ď��s���Ȃ���Ȃ�܂���B
- ���[���̓f�[�^�x�[�X���ƂɈقȂ�܂��B
- �X�g�A�h�v���V�[�W���̃Z�}���e�B�b�N�X�ƃV���^�b�N�X�́A
- �f�[�^�x�[�X�x���_���ƂɈقȂ邽�߂ł��B</para>
+ <para>Hibernateでストアドプロシージャや関数を使うためには、
+ そのプロシージャはいくつかのルールに準拠する必要があります。
+ ルールに準拠していないプロシージャは、Hibernateで使うことはできません。
+ それでも、準拠していないプロシージャを使いたいのであれば、
+ <literal>session.connection()</literal> を通じて実行しなければなりません。
+ ルールはデータベースごとに異なります。
+ ストアドプロシージャのセマンティックスとシンタックスは、
+ データベースベンダごとに異なるためです。</para>
- <para><literal>setFirstResult()/setMaxResults()</literal>
��g���āA
- �X�g�A�h�v���V�[�W���N�G����y�[�W�������邱�Ƃ͂ł��܂���B</para>
+ <para><literal>setFirstResult()/setMaxResults()</literal>
を使って、
+ ストアドプロシージャクエリをページ分けすることはできません。</para>
- <para>��������Ăяo�����́A�W���ł���SQL92�ɏ]�����Ƃł��B
- <literal>{ ? = call functionName(<parameters>)
}</literal> ��
- <literal>{ ? = call procedureName(<parameters>)
}</literal> �ł��B
- �l�C�e�B�u�ȌĂяo���\���̓T�|�[�g����Ă��܂���B</para>
+ <para>推奨する呼び出し方は、標準であるSQL92に従うことです。
+ <literal>{ ? = call functionName(<parameters>)
}</literal> や
+ <literal>{ ? = call procedureName(<parameters>)
}</literal> です。
+ ネイティブな呼び出し構文はサポートされていません。</para>
- <para>Oracle�ɂ͉��L�̃��[�����K�p����܂��B</para>
+ <para>Oracleには下記のルールが適用されます。</para>
<itemizedlist spacing="compact">
<listitem>
- <para>���̓��U���g�Z�b�g��Ԃ��Ȃ���Ȃ�܂���B
- �v���V�[�W���̑������̓��U���g�Z�b�g��Ԃ����߁A
- <literal>OUT</literal> �łȂ���Ȃ�܂���B
- Oracle 9��10�ł́A<literal>SYS_REFCURSOR</literal>
��g�����Ƃɂ���Ăł��܂��B
- Oracle�ł� <literal>REF CURSOR</literal> �^���`����K�v������܂��B
- Oracle�̕�����Q�Ƃ��Ă��������B</para>
+ <para>関数はリザルトセットを返さなければなりません。
+ プロシージャの第一引数はリザルトセットを返すため、
+ <literal>OUT</literal> でなければなりません。
+ Oracle 9と10では、<literal>SYS_REFCURSOR</literal> を使うことによってできます。
+ Oracleでは <literal>REF CURSOR</literal> 型を定義する必要があります。
+ Oracleの文献を参照してください。</para>
</listitem>
</itemizedlist>
- <para>Sybase��MS SQL�T�[�o�[�ɓK�p����郋�[�����L�Ɏ����܂��B</para>
+ <para>SybaseとMS SQLサーバーに適用されるルールを下記に示します。</para>
<itemizedlist spacing="compact">
<listitem>
- <para>�v���V�[�W���̓��U���g�Z�b�g��Ԃ��Ȃ���Ȃ�܂���B
- �T�[�o�[�͕����̃��U���g�Z�b�g�ƍX�V�J�E���g��Ԃ��܂����A
- Hibernate��1�ڂ̃��U���g�Z�b�g������Ԃ����Ƃɒ��ӂ��Ă��������B
- ���̑��͂��ׂĎ̂Ă��܂��B</para>
+ <para>プロシージャはリザルトセットを返さなければなりません。
+ サーバーは複数のリザルトセットと更新カウントを返しますが、
+ Hibernateは1つ目のリザルトセットだけを返すことに注意してください。
+ その他はすべて捨てられます。</para>
</listitem>
<listitem>
- <para>�v���V�[�W���̒��� <literal>SET NOCOUNT ON</literal>
��L���ɂł���A
- �����炭�������悭�Ȃ�ł��傤�B
- �������A����͕K�v���ł͂���܂���B</para>
+ <para>プロシージャの中で <literal>SET NOCOUNT ON</literal>
を有効にできれば、
+ おそらく効率がよくなるでしょう。
+ しかし、これは必要条件ではありません。</para>
</listitem>
</itemizedlist>
</sect3>
@@ -597,15 +599,15 @@
</sect1>
<sect1 id="querysql-cud">
- <title>�쐬�A�X�V�A�폜�̂��߂̃J�X�^��SQL</title>
+ <title>作成、更新、削除のためのカスタムSQL</title>
- <para>Hibernate3�͍쐬�A�X�V�A�폜�����̂��߂̃J�X�^��SQL����g�p�ł��܂��B
- �N���X�ƃR���N�V�����̉i�����@�\�́A�R���t�B�O���[�V�������ɐ������ꂽ������
- �iinsertsql�Adeletesql�Aupdatesql�Ȃǁj�̃Z�b�g���łɕێ����Ă��܂��B
- �����̕�������A
- <literal><sql-insert></literal>�A
- <literal><sql-delete></literal>�A
- <literal><sql-update></literal>
�Ƃ����}�b�s���O�^�O���D�悳��܂��B</para>
+ <para>Hibernate3は作成、更新、削除処理のためのカスタムSQL文を使用できます。
+ クラスとコレクションの永続化機構は、コンフィグレーション時に生成された文字列
+ (insertsql、deletesql、updatesqlなど)のセットをすでに保持しています。
+ これらの文字列より、
+ <literal><sql-insert></literal>、
+ <literal><sql-delete></literal>、
+ <literal><sql-update></literal>
というマッピングタグが優先されます。</para>
<programlisting><![CDATA[<class name="Person">
<id name="id">
@@ -617,11 +619,11 @@
<sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete>
</class>]]></programlisting>
- <para>SQL�ڃf�[�^�x�[�X�Ŏ��s���邽�߁A�D�݂̕������R�Ɏg�p�ł��܂��B
- �f�[�^�x�[�X�Ǝ���SQL��g���A���R�}�b�s���O�̃|�[�^�r���e�B��������܂��B</para>
+ <para>SQLを直接データベースで実行するため、好みの方言を自由に使用できます。
+ データベース独自のSQLを使えば、当然マッピングのポータビリティが下がります。</para>
- <para><literal>callable</literal> ������Z�b�g����A
- �X�g�A�h�v���V�[�W����g�p�ł��܂��B</para>
+ <para><literal>callable</literal> 属性をセットすれば、
+ ストアドプロシージャを使用できます。</para>
<programlisting><![CDATA[<class name="Person">
<id name="id">
@@ -633,21 +635,21 @@
<sql-update callable="true">{? = call updatePerson (?,
?)}</sql-update>
</class>]]></programlisting>
- <para>���̂Ƃ���A�ʒu�p�����[�^�̏��Ԃ͂ƂĂ�d�v�ł��B
- ���Ȃ킿�AHibernate�����҂��鏇���łȂ���Ȃ�܂���B</para>
+ <para>今のところ、位置パラメータの順番はとても重要です。
+ すなわち、Hibernateが期待する順序でなければなりません。</para>
- <para><literal>org.hiberante.persister.entity</literal>
���x���̃f�o�b�O���O��
- �L���ɂ��邱�Ƃɂ���āA���҂���鏇�Ԃ�m���߂��܂��B
- ���̃��x����L���ɂ��邱�Ƃɂ��A�G���e�B�e�B�̍쐬�A�X�V�A�폜�Ȃǂ�
- �g�p�����ÓI��SQL���o�͂���܂��B
- �i���҂���鏇����m�F���邽�߂ɂ́AHibernate����������ÓI��SQL��I�[�o�[���C�h����
- �J�X�^��SQL��}�b�s���O�t�@�C���Ɋ܂߂Ȃ����Ƃ�Y��Ȃ��ł��������B�j</para>
+ <para><literal>org.hiberante.persister.entity</literal>
レベルのデバッグログを
+ 有効にすることによって、期待される順番を確かめられます。
+ このレベルを有効にすることにより、エンティティの作成、更新、削除などで
+ 使用される静的なSQLが出力されます。
+ (期待される順序を確認するためには、Hibernateが生成する静的なSQLをオーバーライドする
+ カスタムSQLをマッピングファイルに含めないことを忘れないでください。)</para>
- <para>�X�g�A�h�v���V�[�W���͑}��/�X�V/�폜���ꂽ�s����Ԃ��K�v������܂�
- �i�ǂݍ��݂̏ꍇ�́A�Ԃ��Ȃ����͕Ԃ������悢�ł��j�B
- ���s����Hibernate��SQL���̐�����`�F�b�N���邩��ł��B
- Hibernate�́ACUD�����̂��߂̐��l�̏o�̓p�����[�^�Ƃ��āA
- SQL���̍ŏ��̃p�����[�^����L�^���܂��B</para>
+ <para>ストアドプロシージャは挿入/更新/削除された行数を返す必要があります
+ (読み込みの場合は、返さないよりは返す方がよいです)。
+ 実行時にHibernateがSQL文の成功をチェックするからです。
+ Hibernateは、CUD処理のための数値の出力パラメータとして、
+ SQL文の最初のパラメータをいつも記録します。</para>
<programlisting><![CDATA[CREATE OR REPLACE FUNCTION updatePerson (uid IN
NUMBER, uname IN VARCHAR2)
RETURN NUMBER IS
@@ -665,9 +667,9 @@
</sect1>
<sect1 id="querysql-load">
- <title>���[�h�̂��߂̃J�X�^��SQL</title>
+ <title>ロードのためのカスタムSQL</title>
-
<para>�G���e�B�e�B��ǂݍ��ނ��߂̓Ǝ���SQL�i�������HQL�j�N�G����錾�ł��܂��B</para>
+ <para>エンティティを読み込むための独自のSQL(もしくはHQL)クエリも宣言できます。</para>
<programlisting><![CDATA[<sql-query name="person">
<return alias="pers" class="Person"
lock-mode="upgrade"/>
@@ -677,8 +679,8 @@
FOR UPDATE
</sql-query>]]></programlisting>
- <para>����́A�܂��Ɂi�ȑO�c�_�����j���O�t���N�G���̐錾�ł��B
- ���̖��O�t���N�G����N���X�̃}�b�s���O����Q�Ƃł��܂��B</para>
+ <para>これは、まさに(以前議論した)名前付きクエリの宣言です。
+ この名前付きクエリをクラスのマッピングから参照できます。</para>
<programlisting><![CDATA[<class name="Person">
<id name="id">
@@ -689,9 +691,9 @@
</class>]]></programlisting>
- <para>����̓X�g�A�h�v���V�[�W���ł�������삵�܂��B</para>
+ <para>これはストアドプロシージャでさえも動作します。</para>
- <para>���̂悤�ɁA�R���N�V�������[�h���邽�߂̃N�G��������`���Ă悢�ł��B</para>
+ <para>次のように、コレクションをロードするためのクエリさえ定義してよいです。</para>
<programlisting><![CDATA[<set name="employments"
inverse="true">
<key/>
@@ -707,8 +709,8 @@
ORDER BY STARTDATE ASC, EMPLOYEE ASC
</sql-query>]]></programlisting>
- <para>���̂悤�ɁA�����t�F�b�`�ɂ��R���N�V�������[�h����
- �G���e�B�e�B���[�_�[���`�ł��܂��B</para>
+ <para>次のように、結合フェッチによりコレクションをロードする
+ エンティティローダーを定義できます。</para>
<programlisting><![CDATA[<sql-query name="person">
<return alias="pers" class="Person"/>
@@ -721,4 +723,4 @@
</sql-query>]]></programlisting>
</sect1>
-</chapter>
\ No newline at end of file
+</chapter>
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/session_api.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/session_api.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/session_api.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,81 +1,83 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="objectstate">
- <title>�I�u�W�F�N�g����</title>
+ <title>オブジェクトを扱う</title>
<para>
- Hibernate �͊��S�ȃI�u�W�F�N�g/�����[�V���i���}�b�s���O�\�����[�V�����ł���A
- �f�[�^�x�[�X�Ǘ��V�X�e���̏ڍׂ�J���҂���B�����邾���łȂ��A �I�u�W�F�N�g��
<emphasis>��ԊǗ�</emphasis> ��s���܂��B
- ����́AJDBC/SQL�i���w�Ɠ����悤��SQL <literal>��</literal> �̊Ǘ��Ƃ͈قȂ�A
- Java�A�v���P�[�V�����ɂ�����i�����ɑ���A�ƂĂ���R�ȃI�u�W�F�N�g�w���̍l��������܂��B
+ Hibernate は完全なオブジェクト/リレーショナルマッピングソリューションであり、
+ データベース管理システムの詳細を開発者から隠蔽するだけでなく、 オブジェクトの <emphasis>状態管理</emphasis>
も行います。
+ これは、JDBC/SQL永続層と同じようなSQL <literal>文</literal> の管理とは異なり、
+ Javaアプリケーションにおける永続化に対する、とても自然なオブジェクト指向の考え方を提供します。
</para>
<para>
- ����������AHibernate��p����A�v���P�[�V�����J���҂́A�I�u�W�F�N�g��
<emphasis>���</emphasis> �ɂ��Ă�
- ��Ɉӎ����ׂ��ł���ASQL���̎��s�ɂ��Ă͕K����������ł͂���܂���B
-
���̕����́A�ʏ�AHibernate���������A�V�X�e���̃p�t�H�[�}���X��`���[�j���O����Ƃ��ɂ����A
���ɂȂ��Ă��܂��B
+ 言いかえれば、Hibernateを用いるアプリケーション開発者は、オブジェクトの <emphasis>状態</emphasis>
については
+ 常に意識すべきであり、SQL文の実行については必ずしもそうではありません。
+ この部分は、通常、Hibernateが処理し、システムのパフォーマンスをチューニングするときにだけ、 問題になってきます。
</para>
<sect1 id="objectstate-overview">
- <title>Hibernate�ɂ�����I�u�W�F�N�g�̏��</title>
+ <title>Hibernateにおけるオブジェクトの状態</title>
<para>
- Hibernate�͎��̂悤�ȃI�u�W�F�N�g�̏�Ԃ��`���A�T�|�[�g���Ă��܂��B
+ Hibernateは次のようなオブジェクトの状態を定義し、サポートしています。
</para>
<itemizedlist>
<listitem>
<para>
- <emphasis> �ꎞ�I(Transient) </emphasis> -
<literal>new</literal>
- ���Z�q��g���� �C���X�^���X�����ꂽ�����ŁA Hibernate��
<literal>Session</literal>
- �Ɋ֘A�t�����Ă��Ȃ��I�u�W�F�N�g�́A �ꎞ�I(transient)�ł��B
- ����́A�f�[�^�x�[�X�ɉi���I�ȕ\���������A���ʎq�ƂȂ�l�͊��蓖�Ă��Ă��܂���B
- �ꎞ�I�ȃC���X�^���X�́A�A�v���P�[�V���������̎Q�Ƃ�ǂ��ɂ�ێ����Ȃ��ꍇ�ɁA
�K�x�[�W�R���N�^�ɂ���Ĕj������܂��B
- �I�u�W�F�N�g��i���I(persistent)�ȏ�Ԃɂ��邽�߂ɂ́AHibernate��
- <literal>Session</literal> ��g���܂��傤�B
- �i���̏�ԑJ�ڂɕK�v�ƂȂ�SQL���̔��s�́AHibernate�ɔC���܂��傤�B�j
+ <emphasis> 一時的(Transient) </emphasis> -
<literal>new</literal>
+ 演算子を使って インスタンス化されただけで、 Hibernateの
<literal>Session</literal>
+ に関連付けられていないオブジェクトは、 一時的(transient)です。
+ それは、データベースに永続的な表現を持たず、識別子となる値は割り当てられていません。
+ 一時的なインスタンスは、アプリケーションがその参照をどこにも保持しない場合に、 ガベージコレクタによって破棄されます。
+ オブジェクトを永続的(persistent)な状態にするためには、Hibernateの
+ <literal>Session</literal> を使いましょう。
+ (この状態遷移に必要となるSQL文の発行は、Hibernateに任せましょう。)
</para>
</listitem>
<listitem>
<para>
- <emphasis>�i���I(Persistent)</emphasis> -
- �i���I�ȃC���X�^���X�̓f�[�^�x�[�X��
�i���I�ȕ\�������A���ʎq�ƂȂ�l�����Ă��܂��B
- ����́A�Z�[�u���ꂽ��A���[�h���ꂽ�肷�邩�����܂��A
- ��`��́A <literal>Session</literal>
�̃X�R�[�v�̒��ɑ��݂��Ă��܂��B
- Hibernate�́A��ƒP�ʁiUnit of work�j�����������Ƃ��ɁA
�i����Ԃ̃I�u�W�F�N�g�ɉ�����ꂽ�ύX���o���A
- �I�u�W�F�N�g�̏�Ԃƃf�[�^�x�[�X�����܂��B
�I�u�W�F�N�g��ꎞ�I(transient)�ɂ���Ƃ��́A�J���҂́A���Ƃ�
- <literal>UPDATE</literal> ����
<literal>DELETE</literal>
- ������s���܂���B
+ <emphasis>永続的(Persistent)</emphasis> -
+ 永続的なインスタンスはデータベースに 永続的な表現を持ち、識別子となる値を持っています。
+ それは、セーブされたり、ロードされたりするかもしれませんが、
+ 定義上は、 <literal>Session</literal> のスコープの中に存在しています。
+ Hibernateは、作業単位(Unit of work)が完了したときに、 永続状態のオブジェクトに加えられた変更を検出し、
+ オブジェクトの状態とデータベースを同期します。 オブジェクトを一時的(transient)にするときは、開発者は、手作業で
+ <literal>UPDATE</literal> 文や
<literal>DELETE</literal>
+ 文を実行しません。
</para>
</listitem>
<listitem>
<para>
- <emphasis>����(Detached)</emphasis> -
�������ꂽ�C���X�^���X�Ƃ́A�i��������Ă��邪�A
- ����Ɗ֘A�t���Ă��� <literal>Session</literal>
���N���[�Y����Ă���I�u�W�F�N�g�̂��Ƃł��B
- ���̃I�u�W�F�N�g�ւ̎Q�Ƃ́A�ˑR�Ƃ��ėL���ł��B
- �����āA������A�������ꂽ��Ԃɂ���I�u�W�F�N�g�́A�C�����邱�Ƃ����ł��܂��B
-
�������ꂽ�C���X�^���X�́A�����x�i�����������i�����āA���ׂĂ̕ύX��i�����������j�Ƃ��ɁA �V����
- <literal>Session</literal> �ɍĒlj��ł��܂��B
- ���̋@�\�́A���[�U���l���鎞�Ԃ�K�v�Ƃ���悤�ȁA�����Ԃɋy�ԍ�ƒP�ʂɑ���
�v���O���~���O���f����\�ɂ��܂��B
- ��X�́A�����
<emphasis>�A�v���P�[�V�����̃g�����U�N�V�����iapplication
- transactions�j</emphasis> �ƌĂ�ł��܂��B
���Ȃ킿�A���[�U���猩����ƒP�ʂ��Ƃ������Ƃł��B
+ <emphasis>分離(Detached)</emphasis> -
分離されたインスタンスとは、永続化されているが、
+ それと関連付いていた <literal>Session</literal>
がクローズされているオブジェクトのことです。
+ そのオブジェクトへの参照は、依然として有効です。
+ そして、もちろん、分離された状態にあるオブジェクトは、修正することさえできます。
+ 分離されたインスタンスは、もう一度永続化したい(そして、すべての変更を永続化したい)ときに、 新しい
+ <literal>Session</literal> に再追加できます。
+ この機能は、ユーザが考える時間を必要とするような、長期間に及ぶ作業単位に対する プログラミングモデルを可能にします。
+ 我々は、これを <emphasis>アプリケーションのトランザクション(application
+ transactions)</emphasis> と呼んでいます。 すなわち、ユーザから見た作業単位だということです。
</para>
</listitem>
</itemizedlist>
<para>
- ���ꂩ��A��ԂƏ�ԑJ�ځi�����āA�J�ڂ̂��������ƂȂ�Hibernate�̃��\�b�h�j�ɂ���
�A�ڍׂɏq�ׂ܂��B
+ これから、状態と状態遷移(そして、遷移のきっかけとなるHibernateのメソッド)について 、詳細に述べます。
</para>
</sect1>
<sect1 id="objectstate-makingpersistent" revision="1">
- <title>�I�u�W�F�N�g��i����Ԃɂ���</title>
+ <title>オブジェクトを永続状態にする</title>
<para>
- �V�����C���X�^���X�����ꂽ�i���N���X�̃C���X�^���X�́A Hibernate�ł�
- <emphasis>�ꎞ�I(transient)</emphasis> �ƌ��Ȃ���܂��B
- �ȉ��̂悤�ɁA�Z�b�V�����Ɗ֘A�Â��邱�ƂŁA�ꎞ�I�ȃC���X�^���X��
- <emphasis>�i�����(persistent)</emphasis> �ɂł��܂��B
+ 新しくインスタンス化された永続クラスのインスタンスは、 Hibernateでは
+ <emphasis>一時的(transient)</emphasis> と見なされます。
+ 以下のように、セッションと関連づけることで、一時的なインスタンスを
+ <emphasis>永続状態(persistent)</emphasis> にできます。
</para>
@@ -86,18 +88,18 @@
Long generatedId = (Long) sess.save(fritz);]]></programlisting>
<para>
- <literal>Cat</literal> �N���X�̎��ʎq���������������̂ł���A
- <literal>save()</literal> ���Ă��Ƃ��ɁA ���ʎq����������A
<literal>cat</literal>
- �C���X�^���X�Ɋ��蓖�Ă��܂��B <literal>Cat</literal>
- �̎��ʎq�������犄�蓖�Ă���i <literal>assigned</literal>
���ʎq���j���A�����L�[�ł���Ȃ�A
- <literal>save()</literal> ��Ăяo���O�ɁA���ʎq���蓖�ĂȂ���Ȃ�܂���B
- <literal>save()</literal> �̑���ɁAEJB3 �̏����h���t�g�Œ�`���ꂽ
- <literal>persist()</literal> ��g�����Ƃ�\�ł��B
+ <literal>Cat</literal> クラスの識別子が自動生成されるのであれば、
+ <literal>save()</literal> が呼ばれるときに、 識別子が生成され、
<literal>cat</literal>
+ インスタンスに割り当てられます。 <literal>Cat</literal>
+ の識別子が他から割り当てられる( <literal>assigned</literal> 識別子を持つ)か、複合キーであるなら、
+ <literal>save()</literal> を呼び出す前に、識別子を割り当てなければなりません。
+ <literal>save()</literal> の代わりに、EJB3 の初期ドラフトで定義された
+ <literal>persist()</literal> を使うことも可能です。
</para>
<para>
- ����ɁA���ʎq������ɂƂ� <literal>save()</literal>
- ���\�b�h��g���āA ���ʎq���蓖�Ă邱�Ƃ�ł��܂��B
+ 代わりに、識別子を引数にとる <literal>save()</literal>
+ メソッドを使って、 識別子を割り当てることもできます。
</para>
@@ -110,29 +112,29 @@
sess.save( pk, new Long(1234) );]]></programlisting>
<para>
- �i��������I�u�W�F�N�g���֘A�I�u�W�F�N�g�����Ă���ꍇ �i�Ⴆ�A�O�̗�ɂ�����
- <literal>kittens</literal> �R���N�V�����̂悤�Ɂj�A
�O���L�[�J�����ɁA <literal>NOT
- NULL</literal> �������Ȃ�����́A
�����̈�A�̃I�u�W�F�N�g��ǂ�ȏ��Ԃʼni�������Ă���܂��܂���B
- �O���L�[�����ᔽ���鋰��͂���܂���B �������A <literal>NOT
NULL</literal>
- ������ꍇ�A�Ԉ�������ԂŃI�u�W�F�N�g�� <literal>save()</literal>
���Ă��܂��ƁA
- ����Ɉᔽ���邩�����܂���B </para>
+ 永続化するオブジェクトが関連オブジェクトを持っている場合 (例えば、前の例における
+ <literal>kittens</literal> コレクションのように)、 外部キーカラムに、
<literal>NOT
+ NULL</literal> 制約をつけない限りは、 これらの一連のオブジェクトをどんな順番で永続化してもかまいません。
+ 外部キー制約を違反する恐れはありません。 しかし、 <literal>NOT NULL</literal>
+ 制約がある場合、間違った順番でオブジェクトを <literal>save()</literal> してしまうと、
+ 制約に違反するかもしれません。 </para>
<para>
- �֘A����I�u�W�F�N�g�����I�ɕۑ�����A Hibernate��
<emphasis>�J�ړI�ȉi����(transitive
- persistence)</emphasis> �@�\��
�g�����Ȃ�A���̂悤�ȏڍׂ�C�ɂ���K�v�͂���܂���B
- �����āA <literal>NOT NULL</literal> ����̈ᔽ����N����܂���B
- Hibernate�����ׂĖʓ|��݂Ă���܂��B�J�ړI�ȉi�����́A���̏͂̌㔼�ɏ�����Ă��܂��B
</para>
+ 関連するオブジェクトを自動的に保存する、 Hibernateの <emphasis>遷移的な永続化(transitive
+ persistence)</emphasis> 機能を 使うつもりならば、そのような詳細を気にする必要はありません。
+ そして、 <literal>NOT NULL</literal> 制約の違反すら起こりません。
+ Hibernateがすべて面倒をみてくれます。遷移的な永続化は、この章の後半に書かれています。 </para>
</sect1>
<sect1 id="objectstate-loading">
- <title>�I�u�W�F�N�g�̃��[�h</title>
+ <title>オブジェクトのロード</title>
<para>
- �i�������ꂽ�C���X�^���X�̎��ʎq�����炩���ߕ������Ă���Ȃ�A
<literal>Session</literal> ��
- <literal>load()</literal> ���\�b�h��g���āA�����ł��܂��B
<literal>load()</literal>
- �́AClass �I�u�W�F�N�g������ɂƂ�A
���̃N���X�̃C���X�^���X��V���ɐ������A��Ԃ��[�h���܂��B
- ���̃C���X�^���X�̏�Ԃ́A�i��(persistent)��Ԃł��B </para>
+ 永続化されたインスタンスの識別子があらかじめ分かっているなら、 <literal>Session</literal> の
+ <literal>load()</literal> メソッドを使って、復元できます。
<literal>load()</literal>
+ は、Class オブジェクトを引数にとり、 そのクラスのインスタンスを新たに生成し、状態をロードします。
+ そのインスタンスの状態は、永続(persistent)状態です。 </para>
<programlisting><![CDATA[Cat fritz = (Cat) sess.load(Cat.class,
generatedId);]]></programlisting>
@@ -142,7 +144,7 @@
long id = 1234;
DomesticCat pk = (DomesticCat) sess.load( DomesticCat.class, new Long(id)
);]]></programlisting>
<para>
- ���邢�́A�ȉ��̂悤�ɁA�����̃C���X�^���X�ɏ�Ԃ��[�h���邱�Ƃ�ł��܂��B </para>
+ あるいは、以下のように、既存のインスタンスに状態をロードすることもできます。 </para>
<programlisting><![CDATA[Cat cat = new DomesticCat();
@@ -151,16 +153,16 @@
Set kittens = cat.getKittens();]]></programlisting>
<para>
- DB�ɊY������s�������ꍇ�A <literal>load()</literal> �͉s�\�ȗ�O��
�����邱�Ƃɒ��ӂ��܂��傤�B
- ���̃N���X���v���L�V��g���ă}�b�s���O����Ă���ꍇ�A
<literal>load()</literal>
- �͏���������Ă��Ȃ��v���L�V��Ԃ��A�v���L�V�̃��\�b�h���Ă��܂Ŏ��ۂɂ�
�f�[�^�x�[�X�ɃA�N�Z�X���܂���B
- ����A���ۂɃf�[�^�x�[�X���烍�[�h�����ɁA�I�u�W�F�N�g�ɑ���֘A���肽���ꍇ�A
���̐U�镑���͂ƂĂ�𗧂��܂��B
- <literal>batch-size</literal>
���N���X�}�b�s���O�ɒ�`����Ă���Ȃ�A
- �����̃C���X�^���X��ꊇ�Ń��[�h���邱�Ƃ��\�ł��B </para>
+ DBに該当する行が無い場合、 <literal>load()</literal> は回復不可能な例外を
投げることに注意しましょう。
+ そのクラスがプロキシを使ってマッピングされている場合、 <literal>load()</literal>
+ は初期化されていないプロキシを返し、プロキシのメソッドが呼ばれるまで実際には データベースにアクセスしません。
+ もし、実際にデータベースからロードせずに、オブジェクトに対する関連を作りたい場合、 この振る舞いはとても役立ちます。
+ <literal>batch-size</literal> がクラスマッピングに定義されているならば、
+ 複数のインスタンスを一括でロードすることが可能です。 </para>
<para>
- �Y������s�����݂��邱�Ƃ�m�M�ł��Ȃ��ꍇ�́A <literal>get()</literal>
���\�b�h��g���ׂ��ł��B
- ����́A�f�[�^�x�[�X�ɂ����ɃA�N�Z�X���A�Y������s�������ꍇ��null��Ԃ��܂��B
</para>
+ 該当する行が存在することを確信できない場合は、 <literal>get()</literal> メソッドを使うべきです。
+ それは、データベースにすぐにアクセスし、該当する行が無い場合はnullを返します。 </para>
<programlisting><![CDATA[Cat cat = (Cat) sess.get(Cat.class, id);
@@ -171,53 +173,53 @@
return cat;]]></programlisting>
<para>
- <literal>LockMode</literal> ��g���A
- <literal>SELECT ... FOR UPDATE</literal>�Ƃ���SQL��
�g���ăI�u�W�F�N�g���[�h���邱�Ƃ��ł��܂��B
- �ڍׂȏ��́AAPI�h�L�������g��Q�Ƃ��Ă��������B </para>
+ <literal>LockMode</literal> を使えば、
+ <literal>SELECT ... FOR UPDATE</literal>というSQLを
使ってオブジェクトをロードすることができます。
+ 詳細な情報は、APIドキュメントを参照してください。 </para>
<programlisting><![CDATA[Cat cat = (Cat) sess.get(Cat.class, id,
LockMode.UPGRADE);]]></programlisting>
<para>
- �֘A�ɑ���J�X�P�[�h���@�Ƃ���
- <literal>lock</literal> �� <literal>all</literal>
��
- �w�肵�Ȃ�����A�֘A����C���X�^���X��܂܂��R���N�V������ <literal>FOR
UPDATE</literal> ���
- <emphasis>����Ȃ�</emphasis> ���Ƃɒ��ӂ��܂��傤�B </para>
+ 関連に対するカスケード方法として
+ <literal>lock</literal> や <literal>all</literal> を
+ 指定しない限り、関連するインスタンスや含まれるコレクションは <literal>FOR UPDATE</literal> で復元
+ <emphasis>されない</emphasis> ことに注意しましょう。 </para>
<para>
- <literal>refresh()</literal>
���\�b�h��g�����ƂŁA�ǂ�ȂƂ��ł�A�I�u�W�F�N�g�₻�̃R���N�V������
- �����[�h���邱�Ƃ��ł��܂��B �f�[�^�x�[�X�̃g���K���e�[�u����X�V�����ۂɁA
- ���̃e�[�u���ɑΉ�����I�u�W�F�N�g�̃v���p�e�B������ꍇ�A���̃��\�b�h����ɗ����܂��B
</para>
+ <literal>refresh()</literal> メソッドを使うことで、どんなときでも、オブジェクトやそのコレクションを
+ リロードすることができます。 データベースのトリガがテーブルを更新した際に、
+ そのテーブルに対応するオブジェクトのプロパティを同期する場合、このメソッドが役に立ちます。 </para>
<programlisting><![CDATA[sess.save(cat);
sess.flush(); //force the SQL INSERT
sess.refresh(cat); //re-read the state (after the trigger
executes)]]></programlisting>
<para>
- ��Ȗ��́A������̓_�Ɋւ����̂ł��B����́AHibernate���f�[�^�x�[�X����A
- �ǂ̂��炢�̗ʂ�����̂��ƁA�ǂ̂��炢�̐���SQL�� <literal>SELECT</literal>
�����g����̂��ł��B
- ����́A <emphasis>�t�F�b�`�̐헪</emphasis>
�ɂ��܂��B����ɂ��ẮA<xref linkend="performance-fetching"/> �Ő�����Ă��܂��B
</para>
+ 大切な問題は、いつも次の点に関するものです。それは、Hibernateがデータベースから、
+ どのくらいの量を復元するのかと、どのくらいの数のSQLの <literal>SELECT</literal>
文が使われるのかです。
+ これは、 <emphasis>フェッチの戦略</emphasis> によります。これについては、<xref
linkend="performance-fetching"/> で説明しています。 </para>
</sect1>
<sect1 id="objectstate-querying" revision="1">
- <title>�N�G��</title>
+ <title>クエリ</title>
<para>
- �T�������I�u�W�F�N�g�̎��ʎq��������Ȃ��ꍇ�́A�N�G�����K�v�ɂȂ�܂��B
- Hibernate�͎g���₷���ċ��͂ȃI�u�W�F�N�g�w���̃N�G������ (HQL)��T�|�[�g���Ă��܂��B
-
�v���O�����ɂ���ăN�G�����쐬�ł���悤�ɁAHibernate�͐�����ꂽCriteria��Example�N�G���@�\(QBC��QBE�j��
-
�T�|�[�g���Ă��܂��BResultSet��I�u�W�F�N�g�ɕϊ�����Hibernate�̃I�v�V�����@�\��g�����ƂŁA
- �f�[�^�x�[�X�̃l�C�e�B�u��SQL�ŃN�G����\�����邱�Ƃ�ł��܂��B </para>
+ 探したいオブジェクトの識別子が分からない場合は、クエリが必要になります。
+ Hibernateは使いやすくて強力なオブジェクト指向のクエリ言語 (HQL)をサポートしています。
+ プログラムによってクエリが作成できるように、Hibernateは洗練されたCriteriaとExampleクエリ機能(QBCとQBE)を
+ サポートしています。ResultSetをオブジェクトに変換するHibernateのオプション機能を使うことで、
+ データベースのネイティブなSQLでクエリを表現することもできます。 </para>
<sect2 id="objectstate-querying-executing"
revision="1">
- <title>�N�G���̎��s</title>
+ <title>クエリの実行</title>
<para>
- HQL��l�C�e�B�u��SQL�N�G���́A
<literal>org.hibernate.Query</literal>
- �̃C���X�^���X�Ƃ��ĕ\������܂��B
���̃C���^�t�F�[�X�́A�p�����[�^�o�C���f�B���O��ResultSet�̃n���h�����O��
- �N�G���̎��s��s�����\�b�h��p�ӂ��Ă��܂��B �ʏ�A
<literal>Query</literal> �́A�ȉ��Ɏ����悤�ɁA
- ���̎��_�� <literal>Session</literal> ��g���Ď擾���܂��B
</para>
+ HQLやネイティブなSQLクエリは、 <literal>org.hibernate.Query</literal>
+ のインスタンスとして表現されます。 このインタフェースは、パラメータバインディングやResultSetのハンドリングや
+ クエリの実行を行うメソッドを用意しています。 通常、 <literal>Query</literal>
は、以下に示すように、
+ その時点の <literal>Session</literal> を使って取得します。 </para>
<programlisting><![CDATA[List cats = session.createQuery(
@@ -247,27 +249,27 @@
]]></programlisting>
<para>
- �N�G���́A���ʁA <literal>list()</literal>
��Ăяo�����Ƃɂ���Ď��s����܂��B
- �N�G���̌��ʂ́A��������ɂ���R���N�V�����ɂ��ׂă��[�h����܂��B
- �N�G���ɂ���ĕ������ꂽ�G���e�B�e�B�̃C���X�^���X�́A�i����Ԃł��B
- ����A�N�G����������1�̃C���X�^���X��Ԃ��ƕ������Ă���Ȃ�A
- <literal>uniqueResult()</literal>
���\�b�h�������葁�����@�ł��B
- �����t�F�b�`�𗘗p�����N�G���̏ꍇ�A�ӂ��A����ꂽ�R���N�V�����ɂ́A
- ���[�g�̃I�u�W�F�N�g���d�����Ċ܂܂�Ă��܂�
- �i�������A���[�g�����R���N�V�����͏�����(���[�h�j����Ă��܂��j�B
- ���̏d���� <literal>Set</literal>
��g���Ď�菜�����Ƃ��ł��܂��B</para>
+ クエリは、普通、 <literal>list()</literal> を呼び出すことによって実行されます。
+ クエリの結果は、メモリ上にあるコレクションにすべてロードされます。
+ クエリによって復元されたエンティティのインスタンスは、永続状態です。
+ もし、クエリがたった1個のインスタンスを返すと分かっているなら、
+ <literal>uniqueResult()</literal> メソッドが手っ取り早い方法です。
+ 即時フェッチを利用したクエリの場合、ふつう、得られたコレクションには、
+ ルートのオブジェクトが重複して含まれています
+ (しかし、ルートが持つコレクションは初期化(ロード)されています)。
+ この重複は <literal>Set</literal> を使って取り除くことができます。</para>
<sect3 id="objectstate-querying-executing-iterate">
- <title>���ʂ�C�e���[�g����</title>
+ <title>結果をイテレートする</title>
<para>
- ���X�A <literal>iterate()</literal>
���\�b�h��g���ăN�G������s���邱�ƂŁA
- ���ǂ��p�t�H�[�}���X�邱�Ƃ��ł��܂��B
����́A�ʏ�A�N�G���ɂ���ē���ꂽ���ۂ̃G���e�B�e�B�̃C���X�^���X���A
- ���łɃZ�b�V�����܂��͓L���b�V���ɑ��݂��邱�Ƃ����҂ł���ꍇ�����ł��B
- ����炪�A�܂��L���b�V������Ă��Ȃ��Ȃ�A
<literal>iterate()</literal> �́A
- <literal>list()</literal>
����x���A�ȒP�ȃN�G���ɑ��Ă�����̃f�[�^�x�[�X�A�N�Z�X��
- �K�v�Ƃ��܂��B���̃A�N�Z�X�Ƃ́A���ʎq������擾���邽�߂̍ŏ���select�P��ƁA
- ���ۂ̃C���X�^���X���������邽�߂Ɍォ��s��n���select�̂��Ƃł��B </para>
+ 時々、 <literal>iterate()</literal> メソッドを使ってクエリを実行することで、
+ より良いパフォーマンスを得ることができます。 これは、通常、クエリによって得られた実際のエンティティのインスタンスが、
+ すでにセッションまたは二次キャッシュに存在することが期待できる場合だけです。
+ それらが、まだキャッシュされていないなら、 <literal>iterate()</literal> は、
+ <literal>list()</literal>
よりも遅く、簡単なクエリに対しても多くのデータベースアクセスを
+ 必要とします。そのアクセスとは、識別子だけを取得するための最初のselect1回と、
+ 実際のインスタンスを初期化するために後から行うn回のselectのことです。 </para>
<programlisting><![CDATA[// fetch ids
@@ -285,9 +287,9 @@
</sect3>
<sect3 id="objectstate-querying-executing-tuples">
- <title>�I�u�W�F�N�g�̑g�ituple�j��Ԃ��N�G��</title>
+ <title>オブジェクトの組(tuple)を返すクエリ</title>
<para>
- Hibernate�̃N�G���ł́A���X�A�I�u�W�F�N�g�̑g��Ԃ����Ƃ�����܂��B
���̏ꍇ�́A�e�^�v���͔z��Ƃ��ĕԂ���܂��B
+ Hibernateのクエリでは、時々、オブジェクトの組を返すことがあります。 その場合は、各タプルは配列として返されます。
</para>
@@ -306,12 +308,12 @@
</sect3>
<sect3 id="objectstate-querying-executing-scalar"
revision="1">
- <title>�X�J���[�̌���</title>
+ <title>スカラーの結果</title>
<para>
- �N�G���ł́A <literal>select</literal>
�߂ŃN���X�̃v���p�e�B��w��ł��܂��B
- SQL�̏W������ĂԂ��Ƃ�ł��܂��B�v���p�e�B��W�����́A
- �i�i����Ԃ̃G���e�B�e�B�ł͂Ȃ��j�u�X�J���[�l�v�ł���ƌ��Ȃ���܂��B
</para>
+ クエリでは、 <literal>select</literal> 節でクラスのプロパティを指定できます。
+ SQLの集合関数を呼ぶこともできます。プロパティや集合関数は、
+ (永続状態のエンティティではなく)「スカラー値」であると見なされます。 </para>
<programlisting><![CDATA[Iterator results = sess.createQuery(
@@ -331,25 +333,25 @@
</sect3>
<sect3 id="objectstate-querying-executing-parameters">
- <title>�p�����[�^�̃o�C���h</title>
+ <title>パラメータのバインド</title>
<para>
<literal>Query</literal>
- �́A���O�t���̃p�����[�^��JDBC�X�^�C����
<literal>?</literal>
- �p�����[�^�ɒl��o�C���h���邽�߂̃��\�b�h�����Ă��܂��B
-
<emphasis>JDBC�Ƃ͈Ⴂ�AHibernate�̓p�����[�^�Ƀ[������ԍ���U���Ă����܂��B</emphasis>
- ���O�t���̃p�����[�^�Ƃ́A�N�G��������̂Ȃ��ɂ���
<literal>:name</literal> �`���̎��ʎq�ł��B
- ���O�t���p�����[�^�̗��_�͎��̒ʂ�ł��B </para>
+ は、名前付きのパラメータやJDBCスタイルの <literal>?</literal>
+ パラメータに値をバインドするためのメソッドを持っています。
+
<emphasis>JDBCとは違い、Hibernateはパラメータにゼロから番号を振っていきます。</emphasis>
+ 名前付きのパラメータとは、クエリ文字列のなかにある <literal>:name</literal>
形式の識別子です。
+ 名前付きパラメータの利点は次の通りです。 </para>
<itemizedlist spacing="compact">
<listitem>
- <para> ���O�t���p�����[�^�́A�N�G��������ɓo�ꂷ�鏇�ԂƖ��W�ł�
</para>
+ <para> 名前付きパラメータは、クエリ文字列に登場する順番と無関係です </para>
</listitem>
<listitem>
- <para> �����N�G����ɕ�����o�ꂷ�邱�Ƃ��ł��܂� </para>
+ <para> 同じクエリ内に複数回登場することができます </para>
</listitem>
<listitem>
- <para> �������g�������܂� </para>
+ <para> 自分自身を説明します </para>
</listitem>
</itemizedlist>
@@ -377,12 +379,12 @@
</sect3>
<sect3 id="objectstate-querying-executing-pagination">
- <title>�y�[�W����
+ <title>ページ分け
</title>
<para>
- ResultSet�ɐ����i�����������ő�s���╜���������ŏ��̍s�j�������K�v������A
- �ȉ��̂悤�ɁA <literal>Query</literal>
�C���^�[�t�F�C�X�̃��\�b�h��g���܂��B </para>
+ ResultSetに制限(復元したい最大行数や復元したい最初の行)を加える必要があれば、
+ 以下のように、 <literal>Query</literal> インターフェイスのメソッドを使います。
</para>
<programlisting><![CDATA[Query q = sess.createQuery("from
DomesticCat cat");
@@ -390,19 +392,19 @@
q.setMaxResults(10);
List cats = q.list();]]></programlisting>
- <para>
�����t���̃N�G����DBMS�̃l�C�e�B�u��SQL�ɕϊ�������@��AHibernate�͒m���Ă��܂��B
+ <para> 制限付きのクエリをDBMSのネイティブなSQLに変換する方法を、Hibernateは知っています。
</para>
</sect3>
<sect3 id="objectstate-querying-executing-scrolling">
- <title>�X�N���[���\�ȃC�e���[�V����</title>
+ <title>スクロール可能なイテレーション</title>
<para>
- JDBC�h���C�o���X�N���[���\��
<literal>ResultSet</literal> ��T�|�[�g������A
+ JDBCドライバがスクロール可能な <literal>ResultSet</literal>
をサポートしていれば、
<literal>Query</literal>
- �C���^�[�t�F�C�X��g���āA
<literal>ScrollableResults</literal> �I�u�W�F�N�g��
- �擾�ł��܂��B�����g���ƁA�N�G���̌��ʂɑ��ď_��Ƀi�r�Q�[�V�����ł��܂��B
</para>
+ インターフェイスを使って、 <literal>ScrollableResults</literal>
オブジェクトを
+ 取得できます。それを使うと、クエリの結果に対して柔軟にナビゲーションできます。 </para>
<programlisting><![CDATA[Query q = sess.createQuery("select
cat.name, cat from DomesticCat cat " +
@@ -428,19 +430,19 @@
cats.close()]]></programlisting>
<para>
-
���̋@�\�ɂ̓I�[�v����Ԃ̃f�[�^�x�[�X�R�l�N�V�������K�v�ł��邱�Ƃɒ��ӂ��Ă��������B
- ����A�I�t���C���̃y�[�W�����@�\���K�v�ł���A
<literal>setMaxResult()</literal> /
- <literal>setFirstResult()</literal> ��g���܂��傤�B
</para>
+ この機能にはオープン状態のデータベースコネクションが必要であることに注意してください。
+ もし、オフラインのページ分け機能が必要であれば、
<literal>setMaxResult()</literal> /
+ <literal>setFirstResult()</literal> を使いましょう。
</para>
</sect3>
<sect3 id="objectstate-querying-executing-named"
revision="1">
- <title>���O�t���N�G���̊O�o��</title>
+ <title>名前付きクエリの外出し</title>
<para>
- �}�b�s���O�h�L�������g�ɖ��O�t���̃N�G�����`���邱�Ƃ��ł��܂��B
- �i�}�[�N�A�b�v�Ɖ�߂���镶�����N�G���Ɋ܂܂��Ȃ�A
<literal>CDATA</literal> �Z�N�V������
- �g�����Ƃ�Y��Ȃ��悤�ɂ��܂��傤�B�j </para>
+ マッピングドキュメントに名前付きのクエリを定義することができます。
+ (マークアップと解釈される文字がクエリに含まれるなら、 <literal>CDATA</literal>
セクションを
+ 使うことを忘れないようにしましょう。) </para>
<programlisting><![CDATA[<query
name="ByNameAndMaximumWeight"><![CDATA[
@@ -449,7 +451,7 @@
and cat.weight > ?
] ]></query>]]></programlisting>
- <para>�p�����[�^�̃o�C���f�B���O�Ǝ��s�́A�ȉ��̂悤�ȃv���O�����ōs���܂��B
</para>
+ <para>パラメータのバインディングと実行は、以下のようなプログラムで行われます。 </para>
<programlisting><![CDATA[Query q =
sess.getNamedQuery("ByNameAndMaximumWeight");
@@ -457,23 +459,23 @@
q.setInt(1, minWeight);
List cats = q.list();]]></programlisting>
- <para>
���ۂ̃v���O�����R�[�h�́A�g����N�G������Ɉˑ����Ă��Ȃ����Ƃɒ��ӂ��܂��傤�B
- ���^�f�[�^�ɂ́A�l�C�e�B�uSQL�N�G�����`���邱�Ƃ�ł��܂��B
�܂��A�����̃N�G����}�b�s���O�t�@�C���Ɉڂ����ƂŁA
- Hibernate�Ɉڍs���邱�Ƃ�ł��܂��B </para>
+ <para> 実際のプログラムコードは、使われるクエリ言語に依存していないことに注意しましょう。
+ メタデータには、ネイティブSQLクエリを定義することもできます。 また、既存のクエリをマッピングファイルに移すことで、
+ Hibernateに移行することもできます。 </para>
<para>
- <literal><hibernate-mapping></literal>
�̒��̃N�G����`�́A�N�G���ɑ���
- ���j�[�N�Ȗ��O���K�v�Ȃ��Ƃɂ���ӂ��Ă��������B����ɑ��āA
<literal><class></literal> �̒���
-
�N�G����`�́A�N���X�̊��S���薼���O�ɕt������̂ŁA�����I�Ƀ��j�[�N�Ȗ��O�ɂȂ�܂��B
- ��F <literal>eg.Cat.ByNameAndMaximumWeight</literal>
+ <literal><hibernate-mapping></literal>
の中のクエリ定義は、クエリに対する
+ ユニークな名前が必要なことにも注意してください。それに対して、
<literal><class></literal> の中の
+ クエリ定義は、クラスの完全限定名が前に付けられるので、自動的にユニークな名前になります。
+ 例: <literal>eg.Cat.ByNameAndMaximumWeight</literal>
</para>
</sect3>
</sect2>
<sect2 id="objectstate-filtering" revision="1">
- <title>�R���N�V�����̃t�B���^�����O</title>
- <para> �R���N�V���� <emphasis>�t�B���^</emphasis>
�́A�i��������Ă���R���N�V������z��ɓK�p�����
-
����ȃ^�C�v�̃N�G���ł��B���̃N�G��������ł́A�R���N�V�����̂��̎��_�ł̗v�f��Ӗ�����
- <literal>this</literal> ��g���܂��B </para>
+ <title>コレクションのフィルタリング</title>
+ <para> コレクション <emphasis>フィルタ</emphasis>
は、永続化されているコレクションや配列に適用される
+ 特殊なタイプのクエリです。そのクエリ文字列では、コレクションのその時点での要素を意味する
+ <literal>this</literal> を使います。 </para>
<programlisting><![CDATA[Collection blackKittens =
session.createFilter(
@@ -483,12 +485,12 @@
.list()
);]]></programlisting>
- <para>
�Ԃ����R���N�V������Bag�Ƃ݂Ȃ���܂��B�����āA����͂�Ƃ̃R���N�V�����̃R�s�[�ɂȂ�܂��B
-
���̃R���N�V�����͏C������܂���i����́A"filter"�Ƃ������O�̈Ӗ��Ƃ͈قȂ�܂����A
���҂���铮���Ƃ͈�v���Ă��܂��j�B
+ <para> 返されるコレクションはBagとみなされます。そして、それはもとのコレクションのコピーになります。
+ 元のコレクションは修正されません(これは、"filter"という名前の意味とは異なりますが、
期待される動きとは一致しています)。
</para>
- <para> �t�B���^�ɂ� <literal>from</literal>
- �߂��s�v�ł��邱�ƂɋC�Â��ł��傤�i�K�v�Ȃ�A�����Ƃ�\�ł����j�B
�t�B���^�́A�R���N�V�����̗v�f���̂�Ԃ��č\���܂���B
+ <para> フィルタには <literal>from</literal>
+ 節が不要であることに気づくでしょう(必要なら、持つことも可能ですが)。 フィルタは、コレクションの要素自体を返して構いません。
</para>
@@ -497,8 +499,8 @@
"select this.mate where this.color = eg.Color.BLACK.intValue")
.list();]]></programlisting>
- <para> �N�G����܂܂Ȃ��t�B���^���ɗ����܂��B
- �Ⴆ�A���ɑ傫�ȃR���N�V�����̕����W�����[�h���邽�߂Ɏg���܂��B </para>
+ <para> クエリを含まないフィルタも役に立ちます。
+ 例えば、非常に大きなコレクションの部分集合をロードするために使えます。 </para>
<programlisting><![CDATA[Collection tenKittens =
session.createFilter(
@@ -509,11 +511,11 @@
</sect2>
<sect2 id="objecstate-querying-criteria" revision="1">
- <title>�N���C�e���A�̃N�G��</title>
+ <title>クライテリアのクエリ</title>
- <para>
HQL�͔��ɋ��͂ł����A�N�G��������������A�I�u�W�F�N�g�w����API��g����
- ���I�ɃN�G���������D�ފJ���҂���܂��B �����������ꍇ�̂��߂ɁAHibernate�͒����I��
- <literal>Criteria</literal> �N�G��API����Ă��܂��B
</para>
+ <para> HQLは非常に強力ですが、クエリ文字列を作るよりも、オブジェクト指向のAPIを使って
+ 動的にクエリを作る方を好む開発者もいます。 こういった場合のために、Hibernateは直感的な
+ <literal>Criteria</literal> クエリAPIを提供しています。 </para>
<programlisting><![CDATA[Criteria crit =
session.createCriteria(Cat.class);
@@ -521,21 +523,21 @@
crit.setMaxResults(10);
List cats = crit.list();]]></programlisting>
- <para> <literal>Criteria</literal> ��
- <literal>Example</literal> API�̏ڍׂ́A <xref
linkend="querycriteria"/>
- �ɏq�ׂ��Ă��܂��B </para>
+ <para> <literal>Criteria</literal> と
+ <literal>Example</literal> APIの詳細は、 <xref
linkend="querycriteria"/>
+ に述べられています。 </para>
</sect2>
<sect2 id="objectstate-querying-nativesql"
revision="2">
- <title>�l�C�e�B�uSQL�̃N�G��</title>
+ <title>ネイティブSQLのクエリ</title>
<para>
- <literal>createSQLQuery()</literal>
��g���āASQL�ŃN�G����\�����邱�Ƃ�ł��܂��B
- �����āAHibernate�ɁAResultSet ����I�u�W�F�N�g�ւ̃}�b�s���O��܂����܂��B
- <literal>session.connection()</literal>
��Ăׂǂ�ȂƂ��ł�A���ځAJDBC
- <literal>Connection</literal> ��g�p�ł��邱�Ƃ�o���Ă����܂��傤�B
����AHibernate
- API��g���̂ł���A���L�̂悤��SQL�̕ʖ����ʂł�����Ȃ���Ȃ�܂���B </para>
+ <literal>createSQLQuery()</literal>
を使って、SQLでクエリを表現することもできます。
+ そして、Hibernateに、ResultSet からオブジェクトへのマッピングをまかせます。
+ <literal>session.connection()</literal> を呼べばどんなときでも、直接、JDBC
+ <literal>Connection</literal> を使用できることを覚えておきましょう。
もし、Hibernate
+ APIを使うのであれば、下記のようにSQLの別名を括弧でくくらなければなりません。 </para>
<programlisting><![CDATA[List cats =
session.createSQLQuery("SELECT {cat.*} FROM CAT {cat} WHERE ROWNUM<10")
.addEntity("cat", Cat.class)
@@ -549,27 +551,27 @@
.list()]]></programlisting>
<para>
-
SQL�N�G���́AHibernate�N�G���Ɠ����悤�ɁA���O�t���̃p�����[�^�ƈʒu�p�����[�^�����Ƃ��ł��܂��B
- Hibernate�ɂ�����l�C�e�B�u��SQL�N�G���̏ڍׂɂ��ẮA <xref
linkend="querysql"/>
- ��Q�Ƃ��Ă��������B </para>
+ SQLクエリは、Hibernateクエリと同じように、名前付きのパラメータと位置パラメータを持つことができます。
+ HibernateにおけるネイティブなSQLクエリの詳細については、 <xref
linkend="querysql"/>
+ を参照してください。 </para>
</sect2>
</sect1>
<sect1 id="objectstate-modifying" revision="1">
- <title>�i���I�u�W�F�N�g�̏C��</title>
+ <title>永続オブジェクトの修正</title>
<para>
- <emphasis>�������̉i���C���X�^���X</emphasis>
- �i��F <literal>Session</literal> �ɂ���āA
- ���[�h�A�Z�[�u�A�쐬�A�N�G�����ꂽ�I�u�W�F�N�g�j�́A�A�v���P�[�V�����ɑ��삳��܂��B
- ���̍ۂɕύX���ꂽ�i����Ԃ́A <literal>Session</literal> ��
<emphasis>�t���b�V��</emphasis>
- �����Ƃ��ɁA�i��������܂��i����́A���̏͂̌㔼�ŏq�ׂĂ��܂��j�B
- �ύX��i�������邽�߂ɁA����ȃ��\�b�h�i <literal>update()</literal>
- �̂悤�Ȃ�́B����́A�ʂ̖ړI�Ŏg�p���܂��j�� �ĂԕK�v�͂���܂���B
�I�u�W�F�N�g�̏�Ԃ�X�V�����ԊȒP�ȕ��@�́A�I�u�W�F�N�g��
- <literal>load()</literal> ���A
<literal>Session</literal>
- ��I�[�v���ɂ��Ă���ԂɁA���ڑ��삷�邱�Ƃł��B </para>
+ <emphasis>処理中の永続インスタンス</emphasis>
+ (例: <literal>Session</literal> によって、
+ ロード、セーブ、作成、クエリされたオブジェクト)は、アプリケーションに操作されます。
+ その際に変更された永続状態は、 <literal>Session</literal> が
<emphasis>フラッシュ</emphasis>
+ されるときに、永続化されます(これは、この章の後半で述べています)。
+ 変更を永続化するために、特殊なメソッド( <literal>update()</literal>
+ のようなもの。これは、別の目的で使用します)を 呼ぶ必要はありません。 オブジェクトの状態を更新する一番簡単な方法は、オブジェクトを
+ <literal>load()</literal> し、
<literal>Session</literal>
+ をオープンにしている間に、直接操作することです。 </para>
<programlisting><![CDATA[DomesticCat cat = (DomesticCat) sess.load(
Cat.class, new Long(69) );
@@ -578,40 +580,40 @@
]]></programlisting>
<para>
- �i�I�u�W�F�N�g���[�h���邽�߂́jSQL�� <literal>SELECT</literal>
�Ɓi�X�V���ꂽ��Ԃ�i�������邽�߂́j
- SQL�� <literal>UPDATE</literal>
�������Z�b�V�����ŕK�v�ƂȂ�̂ŁA���̃v���O���~���O���f���́A
- �����������Ȃ�ꍇ������܂��B
-
���̂��߁AHibernate�͕ʂ̕��@��p�ӂ��Ă��܂��B����́A�C���X�^���X������idetached�j���@�ł��B
</para>
+ (オブジェクトをロードするための)SQLの <literal>SELECT</literal>
と(更新された状態を永続化するための)
+ SQLの <literal>UPDATE</literal> が同じセッションで必要となるので、このプログラミングモデルは、
+ 効率が悪くなる場合があります。
+ そのため、Hibernateは別の方法を用意しています。それは、インスタンスを分離する(detached)方法です。 </para>
<para>
- <emphasis>Hibernate�́A <literal>UPDATE</literal> ����
- <literal>DELETE</literal> ���ڎ��s����API��p�ӂ��Ă��܂���B
- Hibernate�́A <emphasis>��ԊǗ�</emphasis> �T�[�r�X�ł���A�g����SQL
- <emphasis>��</emphasis> �̂��Ƃ�J���҂��l����K�v�͂���܂���B
- JDBC��SQL������s���銮����API�ł���A
<literal>session.connection()</literal>
- ��ĂԂ��Ƃ� ���ł�AJDBC <literal>Connection</literal>
��J���҂͎擾�ł��܂��B
-
����ɁA��ʂ̃f�[�^����̍l�����́A�I�����C���g�����U�N�V�������������A�v���P�[�V������
- �I�u�W�F�N�g/�����[�V���i���}�b�s���O�ƏՓ˂��܂��B
- �������AHibernate�̍���̃o�[�W�����ł́A��ʃf�[�^����������ʂȋ@�\����邩�����܂���B
- �o�b�`����ɗ��p�ł��邢�����̍H�v�ɂ��ẮA <xref linkend="batch"/>
��Q�Ƃ��Ă��������B </emphasis>
+ <emphasis>Hibernateは、 <literal>UPDATE</literal> 文や
+ <literal>DELETE</literal> 文を直接実行するAPIを用意していません。
+ Hibernateは、 <emphasis>状態管理</emphasis> サービスであり、使われるSQL
+ <emphasis>文</emphasis> のことを開発者が考える必要はありません。
+ JDBCはSQL文を実行する完璧なAPIであり、 <literal>session.connection()</literal>
+ を呼ぶことで いつでも、JDBC <literal>Connection</literal> を開発者は取得できます。
+ さらに、大量のデータ操作の考え方は、オンライントランザクション処理向きアプリケーションの
+ オブジェクト/リレーショナルマッピングと衝突します。
+ しかし、Hibernateの今後のバージョンでは、大量データを処理する特別な機能を提供するかもしれません。
+ バッチ操作に利用できるいくつかの工夫については、 <xref linkend="batch"/> を参照してください。
</emphasis>
</para>
</sect1>
<sect1 id="objectstate-detached" revision="2">
- <title>�����I�u�W�F�N�g�̏C��</title>
+ <title>分離オブジェクトの修正</title>
<para>
- �����̃A�v���P�[�V�����ł͎��̂��Ƃ��K�v�ɂȂ�܂��B
- ����́A����g�����U�N�V�����ŃI�u�W�F�N�g�����A���삷�邽�߂ɂ����UI�w�ɑ���A
- ���̌�ɁA�V�����g�����U�N�V�����ŕύX��Z�[�u����Ƃ��������Ƃł��B
- ���s���̍������ŁA���̃^�C�v�̃A�v���[�`��g���A�v���P�[�V�����ł́A
"���Ԃ̒���"
- ��ƒP�ʂ̊u������ۏ��邽�߂ɁA�o�[�W�����f�[�^���ʏ�g���܂��B </para>
+ 多くのアプリケーションでは次のことが必要になります。
+ それは、あるトランザクションでオブジェクトを復元し、操作するためにそれをUI層に送り、
+ その後に、新しいトランザクションで変更をセーブするといったことです。
+ 並行性の高い環境で、このタイプのアプローチを使うアプリケーションでは、 "期間の長い"
+ 作業単位の隔離性を保証するために、バージョンデータが通常使われます。 </para>
<para>
- Hibernate�́A <literal>Session.update()</literal> ��
- <literal>Session.merge()</literal> ���\�b�h��
- �g���āA�����C���X�^���X��Ēlj����邱�ƂŁA���̃��f���ɑΉ����܂��B </para>
+ Hibernateは、 <literal>Session.update()</literal> や
+ <literal>Session.merge()</literal> メソッドを
+ 使って、分離インスタンスを再追加することで、このモデルに対応します。 </para>
<programlisting><![CDATA[// in the first session
@@ -627,25 +629,25 @@
secondSession.update(mate); // update mate]]></programlisting>
<para>
- ���ʎq<literal>catId</literal> ����
<literal>Cat</literal> ���A����
- <literal>secondSession</literal>
�Ń��[�h����Ă����ꍇ�́A�Ēlj����悤�Ƃ����Ƃ��ɁA��O���������܂��B
+ 識別子<literal>catId</literal> を持つ
<literal>Cat</literal> が、既に
+ <literal>secondSession</literal>
でロードされていた場合は、再追加しようとしたときに、例外が投げられます。
</para>
<para>
- �������ʎq���i���C���X�^���X��Z�b�V���������ɕێ����Ă��Ȃ����Ƃ�
- �m�M�ł���Ȃ� <literal>update()</literal> ��g���܂��傤�B
- �����āA�Z�b�V�����̏�Ԃ�l�����ɁA�ǂ�ȏꍇ�ł�ύX��}�[�W�������ꍇ�́A
<literal>merge()</literal>
- ��g���܂��傤�B ���Ȃ킿�A�����I�u�W�F�N�g�̍Ēlj����삪�A�ŏ��Ɏ��s����邱�Ƃ�m���ɂ��邽�߂ɁA
�ʏ��
- <literal>update()</literal>
���V�����Z�b�V�����̂Ȃ��ōŏ��ɌĂ�郁�\�b�h�ɂȂ�܂��B </para>
+ 同じ識別子を持つ永続インスタンスをセッションが既に保持していないことを
+ 確信できるなら <literal>update()</literal> を使いましょう。
+ そして、セッションの状態を考えずに、どんな場合でも変更をマージしたい場合は、 <literal>merge()</literal>
+ を使いましょう。 すなわち、分離オブジェクトの再追加操作が、最初に実行されることを確実にするために、 通常は
+ <literal>update()</literal> が新しいセッションのなかで最初に呼ばれるメソッドになります。
</para>
<para>
- �����C���X�^���X���瓞�B�\�ȁA�����C���X�^���X��A�v���P�[�V�����͌ʂ�
<literal>update()</literal>
- ���ׂ��ł��B����́A���̏�Ԃ�X�V�������ꍇ�� <emphasis>����</emphasis>
�܂��B
- <emphasis>�J�ړI�ȉi����</emphasis> ��g���A���������ł��܂��B
<xref
- linkend="objectstate-transitive"/> ��Q�Ƃ��Ă��������B
</para>
+ 分離インスタンスから到達可能な、分離インスタンスをアプリケーションは個別に
<literal>update()</literal>
+ すべきです。それは、その状態を更新したい場合に <emphasis>限り</emphasis> ます。
+ <emphasis>遷移的な永続化</emphasis> を使えば、もちろん自動化できます。 <xref
+ linkend="objectstate-transitive"/> を参照してください。 </para>
<para>
- ���\�b�h�ł�܂��A�V�����Z�b�V�����ɃI�u�W�F�N�g��Ċ֘A�t���ł��܂��B
�������A�����C���X�^���X�͖��C���łȂ���Ȃ�܂���B
+ メソッドでもまた、新しいセッションにオブジェクトを再関連付けできます。 しかし、分離インスタンスは無修正でなければなりません。
</para>
@@ -657,24 +659,24 @@
sess.lock(pk, LockMode.UPGRADE);]]></programlisting>
<para>
- <literal>lock()</literal> �́A���܂��܂�
- <literal>LockMode</literal> �ƂƂ�Ɏg�����Ƃ��ł��܂��B
- �ڍׂ́AAPI�h�L�������g�ƃg�����U�N�V���������̏͂�Q�Ƃ��Ă��������B
- �Ēlj��̂Ƃ��ɂ����A <literal>lock()</literal> ���g����킯�ł͂���܂���B
</para>
+ <literal>lock()</literal> は、さまざまな
+ <literal>LockMode</literal> とともに使うことができます。
+ 詳細は、APIドキュメントとトランザクション処理の章を参照してください。
+ 再追加のときにだけ、 <literal>lock()</literal> が使われるわけではありません。
</para>
<para>
- ���Ԃ̒�����ƒP�ʂ́A���̑��̃��f���́A<xref
linked="transactions-optimistic"/> �ŏq�ׂĂ��܂��B </para>
+ 期間の長い作業単位の、その他のモデルは、<xref linked="transactions-optimistic"/>
で述べています。 </para>
</sect1>
<sect1 id="objectstate-saveorupdate">
- <title>�����I�ȏ�Ԍ��o</title>
+ <title>自動的な状態検出</title>
<para>
- Hibernate�̃��[�U�͎���2�̃P�[�X�̂ǂ���ɂ�g����ėp�I�ȃ��\�b�h��v�����Ă��܂����B
- ����́A�V�������ʎq�����Ĉꎞ�I�ȃC���X�^���X��Z�[�u���邱�ƂƁA
- ���̎��_�̎��ʎq�Ɗ֘A�Â��Ă��镪���C���X�^���X��X�V/�Ēlj����邱�Ƃ̂ł��郁�\�b�h�ł��B
- <literal>saveOrUpdate()</literal>
�͂��̂悤�ȋ@�\������������\�b�h�ł��B </para>
+ Hibernateのユーザは次の2つのケースのどちらにも使える汎用的なメソッドを要求していました。
+ それは、新しい識別子を生成して一時的なインスタンスをセーブすることと、
+ その時点の識別子と関連づいている分離インスタンスを更新/再追加することのできるメソッドです。
+ <literal>saveOrUpdate()</literal> はこのような機能を実現したメソッドです。
</para>
<programlisting><![CDATA[// in the first session
@@ -689,90 +691,90 @@
secondSession.saveOrUpdate(mate); // save the new instance (mate has a null
id)]]></programlisting>
<para>
- <literal>saveOrUpdate()</literal> �̎g�p���@�ƈӖ��́A
- �V�������[�U�ɂƂ��č��������������܂���B
-
�܂����ɁA����Z�b�V�����Ŏg�p�����C���X�^���X��ʂ̐V�����Z�b�V�����Ŏg�����Ƃ��Ȃ�����A
- <literal>update()</literal> ��
<literal>saveOrUpdate()</literal> ��
- <literal>merge()</literal> ��g���K�v�͂���܂���B
- �A�v���P�[�V�����S�̂�ʂ��āA�����̃��\�b�h��S���g��Ȃ����Ƃ����܂��B </para>
+ <literal>saveOrUpdate()</literal> の使用方法と意味は、
+ 新しいユーザにとって混乱を招くかもしれません。
+ まず第一に、あるセッションで使用したインスタンスを別の新しいセッションで使おうとしない限り、
+ <literal>update()</literal> や
<literal>saveOrUpdate()</literal> や
+ <literal>merge()</literal> を使う必要はありません。
+ アプリケーション全体を通じて、これらのメソッドを全く使わないこともあります。 </para>
<para>
- �ʏ�A <literal>update()</literal> ��
<literal>saveOrUpdate()</literal>
- �͎��̃V�i���I�� �g���܂��B </para>
+ 通常、 <literal>update()</literal> や
<literal>saveOrUpdate()</literal>
+ は次のシナリオで 使われます。 </para>
<itemizedlist spacing="compact">
<listitem>
- <para>�A�v���P�[�V�������ŏ��̃Z�b�V�����ŃI�u�W�F�N�g���[�h���܂��B
</para>
+ <para>アプリケーションが最初のセッションでオブジェクトをロードします。 </para>
</listitem>
<listitem>
- <para>�I�u�W�F�N�g��UI�w�ɑ����܂��B </para>
+ <para>オブジェクトがUI層に送られます。 </para>
</listitem>
<listitem>
- <para>�I�u�W�F�N�g�ɑ��ĕύX���������܂��B
+ <para>オブジェクトに対して変更が加えられます。
</para>
</listitem>
<listitem>
- <para> �I�u�W�F�N�g���r�W�l�X���W�b�N�w�ɑ����܂��B </para>
+ <para> オブジェクトがビジネスロジック層に送られます。 </para>
</listitem>
<listitem>
<para>
- �A�v���P�[�V�����́A2�Ԗڂ̃Z�b�V������
<literal>update()</literal>
- ��ĂԂ��ƂŁA�����̕ύX��i�������܂��B </para>
+ アプリケーションは、2番目のセッションで <literal>update()</literal>
+ を呼ぶことで、これらの変更を永続化します。 </para>
</listitem>
</itemizedlist>
- <para> <literal>saveOrUpdate()</literal> �͈ȉ��̂��Ƃ�s���܂��B
</para>
+ <para> <literal>saveOrUpdate()</literal> は以下のことを行います。
</para>
<itemizedlist spacing="compact">
<listitem>
- <para>�I�u�W�F�N�g�����̃Z�b�V�����ŁA���łɉi��������Ă���A������܂���B
</para>
+ <para>オブジェクトがこのセッションで、すでに永続化されていれば、何もしません。 </para>
</listitem>
<listitem>
<para>
- ���̃Z�b�V�����Ɋ֘A�Â��Ă���ʂ̃I�u�W�F�N�g���������ʎq�����Ă���Ȃ�A
��O�𓊂��܂��B </para>
+ そのセッションに関連づいている別のオブジェクトが同じ識別子を持っているなら、 例外を投げます。 </para>
</listitem>
<listitem>
<para>
- �I�u�W�F�N�g�̎��ʎq���l�����Ȃ��Ȃ�A
<literal>save()</literal> ���܂��B </para>
+ オブジェクトの識別子が値を持たないならば、 <literal>save()</literal> します。
</para>
</listitem>
<listitem>
<para>
-
�I�u�W�F�N�g�̎��ʎq���l�����A���̒l���V���ɃC���X�^���X�����ꂽ�I�u�W�F�N�g�̂��߂̒l�ł���ꍇ�A
���̃I�u�W�F�N�g��
- <literal>save()</literal> ���܂��B </para>
+ オブジェクトの識別子が値を持ち、その値が新たにインスタンス化されたオブジェクトのための値である場合、 そのオブジェクトを
+ <literal>save()</literal> します。 </para>
</listitem>
<listitem>
<para>
- �I�u�W�F�N�g���i
<literal><version></literal> ��
- <literal><timestamp></literal> �ɂ���āj
- �o�[�W�����Â�����Ă��āA�o�[�W�����̃v���p�e�B���l�����A
- ���̒l���V�����C���X�^���X�����ꂽ�I�u�W�F�N�g�̂��߂̒l�ł���ꍇ�A
���̃I�u�W�F�N�g��
- <literal>save()</literal> ���܂��B </para>
+ オブジェクトが( <literal><version></literal> や
+ <literal><timestamp></literal> によって)
+ バージョンづけされていて、バージョンのプロパティが値を持ち、
+ その値が新しくインスタンス化されたオブジェクトのための値である場合、 そのオブジェクトを
+ <literal>save()</literal> します。 </para>
</listitem>
<listitem>
<para>
- �����łȂ��ꍇ�́A���̃I�u�W�F�N�g��
<literal>update()</literal> ���܂��B </para>
+ そうでない場合は、そのオブジェクトを <literal>update()</literal> します。
</para>
</listitem>
</itemizedlist>
<para>
- �����āA <literal>merge()</literal> �͈ȉ��̂悤�ɂƂĂ�قȂ�܂��B
</para>
+ そして、 <literal>merge()</literal> は以下のようにとても異なります。 </para>
<itemizedlist spacing="compact">
<listitem>
<para>
- �������ʎq���i�����C���X�^���X�����̎��_�ŃZ�b�V�����Ɗ֘A�t���Ă���Ȃ�A
- �����Ŏ�����I�u�W�F�N�g�̏�Ԃ�i�����C���X�^���X�ɃR�s�[���܂��B
</para>
+ 同じ識別子を持つ永続化インスタンスがその時点でセッションと関連付いているならば、
+ 引数で受け取ったオブジェクトの状態を永続化インスタンスにコピーします。 </para>
</listitem>
<listitem>
<para>
- �i�����C���X�^���X�����̎��_�ŃZ�b�V�����Ɋ֘A�t���Ă��Ȃ��Ȃ�A
-
�f�[�^�x�[�X���炻����[�h���邩�A���邢�́A�V�����i�����C���X�^���X��쐬���܂��B </para>
+ 永続化インスタンスがその時点でセッションに関連付いていないなら、
+ データベースからそれをロードするか、あるいは、新しい永続化インスタンスを作成します。 </para>
</listitem>
<listitem>
- <para>�i�����C���X�^���X���Ԃ���܂��B </para>
+ <para>永続化インスタンスが返されます。 </para>
</listitem>
<listitem>
- <para> �����Ƃ��ė^�����C���X�^���X�̓Z�b�V�����Ɗ֘A�����܂���B
����́A������Ԃ̂܂܂ł��B
+ <para> 引数として与えたインスタンスはセッションと関連を持ちません。 それは、分離状態のままです。
</para>
</listitem>
</itemizedlist>
@@ -780,28 +782,28 @@
</sect1>
<sect1 id="objectstate-deleting" revision="1">
- <title>�i���I�u�W�F�N�g�̍폜</title>
+ <title>永続オブジェクトの削除</title>
<para>
<literal>Session.delete()</literal>
- �̓I�u�W�F�N�g�̏�Ԃ�f�[�^�x�[�X����폜���܂��B
������A�폜�����I�u�W�F�N�g��A�v���P�[�V�������ێ������܂܂ł�悢�ł��B
- ���̂��߁A <literal>delete()</literal>
�͉i���C���X�^���X��ꎞ�I�ɂ����̂ƍl����̂���Ԃł��B </para>
+ はオブジェクトの状態をデータベースから削除します。 もちろん、削除したオブジェクトをアプリケーションが保持したままでもよいです。
+ そのため、 <literal>delete()</literal> は永続インスタンスを一時的にするものと考えるのが一番です。
</para>
<programlisting><![CDATA[sess.delete(cat);]]></programlisting>
<para>
- �O���L�[����Ɉᔽ���郊�X�N��Ȃ��A�D���ȏ��ԂŃI�u�W�F�N�g��폜���邱�Ƃ��ł��܂��B
- �������A�Ԉ�������ԂŃI�u�W�F�N�g��폜����ƁA�O���L�[�J������ <literal>NOT
NULL</literal>
- ����Ɉᔽ����\��������܂��B
�Ⴆ�A�e�I�u�W�F�N�g��폜�����Ƃ��ɁA�q���I�u�W�F�N�g��폜���Y�ꂽ�ꍇ�ł��B </para>
+ 外部キー制約に違反するリスクもなく、好きな順番でオブジェクトを削除することができます。
+ ただし、間違った順番でオブジェクトを削除すると、外部キーカラムの <literal>NOT NULL</literal>
+ 制約に違反する可能性があります。 例えば、親オブジェクトを削除したときに、子供オブジェクトを削除し忘れた場合です。 </para>
</sect1>
<sect1 id="objectstate-replicating" revision="1">
- <title>�قȂ��̃f�[�^�X�g�A�Ԃł̃I�u�W�F�N�g�̃��v���P�[�V����</title>
+ <title>異なる二つのデータストア間でのオブジェクトのレプリケーション</title>
<para>
- �i���C���X�^���X�̃O���t��ʂ̃f�[�^�X�g�A�ɉi��������ꍇ�ɁA
- ���ʎq�̒l��Đ��������ɂ��ނƕ֗��ȏꍇ������܂��B </para>
+ 永続インスタンスのグラフを別のデータストアに永続化する場合に、
+ 識別子の値を再生成せずにすむと便利な場合があります。 </para>
<programlisting><![CDATA[//retrieve a cat from one database
@@ -819,110 +821,110 @@
session2.close();]]></programlisting>
<para>
- ���v���P�[�V������̃f�[�^�x�[�X�ɍs�����ɂ���ꍇ�A
<literal>replicate()</literal>
- ���Փ˂�ǂ̂悤�Ɉ������� <literal>ReplicationMode</literal> �Ŏw�肵�܂��B
</para>
+ レプリケーション先のデータベースに行が既にある場合、 <literal>replicate()</literal>
+ が衝突をどのように扱うかを <literal>ReplicationMode</literal> で指定します。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
<literal>ReplicationMode.IGNORE</literal> -
- �������ʎq���s���f�[�^�x�[�X�ɑ��݂���Ȃ�A ���̃I�u�W�F�N�g�����܂��B
</para>
+ 同じ識別子を持つ行がデータベースに存在するなら、 そのオブジェクトを無視します。 </para>
</listitem>
<listitem>
<para>
- <literal>ReplicationMode.OVERWRITE</literal> -
�������ʎq�������̍s��
- ���ׂď㏑�����܂��B </para>
+ <literal>ReplicationMode.OVERWRITE</literal> -
同じ識別子を持つ既存の行を
+ すべて上書きします。 </para>
</listitem>
<listitem>
<para>
<literal>ReplicationMode.EXCEPTION</literal> -
- �������ʎq���s���f�[�^�x�[�X�ɑ��݂���Ȃ�A ��O�𓊂��܂��B </para>
+ 同じ識別子を持つ行がデータベースに存在するなら、 例外を投げます。 </para>
</listitem>
<listitem>
<para>
<literal>ReplicationMode.LATEST_VERSION</literal> -
- �s�ɕۑ�����Ă���o�[�W�����ԍ����A
�����̃I�u�W�F�N�g�̃o�[�W�����ԍ����Â��Ȃ�A���̍s��㏑�����܂��B
+ 行に保存されているバージョン番号が、 引数のオブジェクトのバージョン番号より古いならば、その行を上書きします。
</para>
</listitem>
</itemizedlist>
<para>
- ���̂悤�ȃP�[�X�ŁA���̋@�\��g�p���܂��B
�قȂ�f�[�^�x�[�X�C���X�^���X�ɓ����ꂽ�f�[�^�̓����A
-
���i�X�V���ɂ�����V�X�e���ݒ���̍X�V�A��ACID�g�����U�N�V�����̂Ȃ��ʼn�����ꂽ�ύX�̃��[���o�b�N�Ȃǂł��B
</para>
+ 次のようなケースで、この機能を使用します。 異なるデータベースインスタンスに入れられたデータの同期、
+ 製品更新時におけるシステム設定情報の更新、非ACIDトランザクションのなかで加えられた変更のロールバックなどです。 </para>
</sect1>
<sect1 id="objectstate-flushing">
- <title>�Z�b�V�����̃t���b�V��</title>
+ <title>セッションのフラッシュ</title>
<para>
- JDBC�R�l�N�V�����̏�Ԃƃ�������̃I�u�W�F�N�g�̏�Ԃ������邽�߂ɕK�v��
- SQL���� <literal>Session</literal> �����s���邱�Ƃ��Ƃ��ǂ�����܂��B
���̏���
- <emphasis>flush</emphasis> �́A�f�t�H���g�ł͎��̂Ƃ��ɋN����܂��B
</para>
+ JDBCコネクションの状態とメモリ上のオブジェクトの状態を同期させるために必要な
+ SQL文を <literal>Session</literal> が実行することがときどきあります。 この処理
+ <emphasis>flush</emphasis> は、デフォルトでは次のときに起こります。 </para>
<itemizedlist spacing="compact">
<listitem>
- <para> �N�G������s����O </para>
+ <para> クエリを実行する前 </para>
</listitem>
<listitem>
<para>
- <literal>org.hibernate.Transaction.commit()</literal>
����s�����Ƃ�
+ <literal>org.hibernate.Transaction.commit()</literal>
を実行したとき
</para>
</listitem>
<listitem>
<para>
- <literal>Session.flush()</literal> ����s�����Ƃ�
</para>
+ <literal>Session.flush()</literal> を実行したとき </para>
</listitem>
</itemizedlist>
- <para> SQL���͈ȉ��̏��ԂŔ��s����܂��B
+ <para> SQL文は以下の順番で発行されます。
</para>
<orderedlist spacing="compact">
<listitem>
<para>
- ���ׂẴG���e�B�e�B�̑}���B����́A
<literal>Session.save()</literal> ��g���ăZ�[�u����
- �I�u�W�F�N�g�̏��Ɏ��s���Ă����܂��B </para>
+ すべてのエンティティの挿入。これは、 <literal>Session.save()</literal>
を使ってセーブした
+ オブジェクトの順に実行していきます。 </para>
</listitem>
<listitem>
- <para> ���ׂẴG���e�B�e�B�̍X�V </para>
+ <para> すべてのエンティティの更新 </para>
</listitem>
<listitem>
- <para> ���ׂẴR���N�V�����̍폜 </para>
+ <para> すべてのコレクションの削除 </para>
</listitem>
<listitem>
<para>
- ���ׂẴR���N�V�����̗v�f�ɑ���폜�A�X�V�A�}�� </para>
+ すべてのコレクションの要素に対する削除、更新、挿入 </para>
</listitem>
<listitem>
- <para>���ׂẴR���N�V�����̑}�� </para>
+ <para>すべてのコレクションの挿入 </para>
</listitem>
<listitem>
<para>
-
���ׂẴG���e�B�e�B�̍폜�B����́A<literal>Session.delete()</literal> ��g����
- �폜�����I�u�W�F�N�g�̏��Ɏ��s���Ă����܂��B </para>
+ すべてのエンティティの削除。これは、<literal>Session.delete()</literal>
を使って
+ 削除したオブジェクトの順に実行していきます。 </para>
</listitem>
</orderedlist>
<para>
- (�P��O������܂��B <literal>native</literal> ID
������g�����I�u�W�F�N�g�́A
- ����炪�Z�[�u���ꂽ�Ƃ��ɑ}������܂��B�j </para>
+ (1つ例外があります。 <literal>native</literal> ID 生成を使ったオブジェクトは、
+ それらがセーブされたときに挿入されます。) </para>
<para>
- �����I��
- <literal>flush()</literal> ����Ƃ������āA
<emphasis>����</emphasis>
- <literal>Session</literal> ��JDBC��R�[������̂��ɂ���
- ��ΓI�ȕۏ͂���܂���B�������A����炪���s�����
<emphasis>����</emphasis> ������ �ۏ���܂��B
- �܂��AHibernate �́A <literal>Query.list(..)</literal>
���Â��f�[�^��Ԉ�����f�[�^�Ԃ��Ȃ����Ƃ�
- �ۏ��Ă��܂��B </para>
+ 明示的に
+ <literal>flush()</literal> するときを除いて、
<emphasis>いつ</emphasis>
+ <literal>Session</literal> がJDBCをコールするのかについて
+ 絶対的な保証はありません。ただし、それらが実行される <emphasis>順番</emphasis> だけは 保証されます。
+ また、Hibernate は、 <literal>Query.list(..)</literal>
が古いデータや間違ったデータ返さないことを
+ 保証しています。 </para>
<para>
- �t���b�V�����p�ɂɋN����Ȃ��悤�Ƀf�t�H���g�̐U�镑����ς��邱�Ƃ��ł��܂��B
<literal>FlushMode</literal>
- �N���X��3�̈قȂ郂�[�h���`���܂��B ����́A�R�~�b�g���ɂ����t���b�V�����郂�[�h
�iHibernate��
- <literal>Transaction</literal> API���g����ꍇ�����ł��j�A
- ����̂������������Ɋ�Â��Ď����Ńt���b�V�����郂�[�h�A
<literal>flush()</literal>
- �������I�ɌĂ�Ȃ�����t���b�V�����Ȃ����[�h�̂R�ł��B
�Ō�̃��[�h�́A��ƒP�ʂ������Ԃɋy�ԏꍇ�ɖ�ɗ����܂� ( <xref
- linkend="transactions-optimistic-longsession"/>
��Q�Ƃ��Ă�������)�B
+ フラッシュが頻繁に起こらないようにデフォルトの振る舞いを変えることができます。
<literal>FlushMode</literal>
+ クラスは3つの異なるモードを定義します。 それは、コミット時にだけフラッシュするモード (Hibernateの
+ <literal>Transaction</literal> APIが使われる場合だけです)、
+ 説明のあった処理順に基づいて自動でフラッシュするモード、 <literal>flush()</literal>
+ が明示的に呼ばれない限りフラッシュしないモードの3つです。 最後のモードは、作業単位が長期間に及ぶ場合に役に立ちます ( <xref
+ linkend="transactions-optimistic-longsession"/> を参照してください)。
</para>
@@ -941,162 +943,162 @@
tx.commit(); // flush occurs
sess.close();]]></programlisting>
- <para>�t���b�V���̂Ƃ��A��O���������邩�����܂���B
- �i�Ⴆ�ADML���삪�����ᔽ����悤�ȏꍇ�ł��B�j
- ��O�����𗝉��邽�߂ɂ́AHibernate�̃g�����U�N�V�����̐U�镑���𗝉���K�v�����邽�߁A <xref
- linkend="transactions"/> �Ő�����܂��B </para>
+ <para>フラッシュのとき、例外が発生するかもしれません。
+ (例えば、DML操作が制約を違反するような場合です。)
+ 例外処理を理解するためには、Hibernateのトランザクションの振る舞いを理解する必要があるため、 <xref
+ linkend="transactions"/> で説明します。 </para>
</sect1>
<sect1 id="objectstate-transitive" revision="1">
- <title>�A���I�ȉi����</title>
+ <title>連鎖的な永続化</title>
<para>
- �X�̃I�u�W�F�N�g��Z�[�u������A�폜������A�Ēlj������肷�邱�Ƃ�
- ���Ȃ�ʓ|�ł��B���ɁA�֘A����I�u�W�F�N�g�����悤�ȏꍇ�ɂ͍ۗ����܂��B
�悭����̂́A�e�q�W�����P�[�X�ł��B
- �ȉ��̗��l���Ă݂܂��傤�B </para>
+ 個々のオブジェクトをセーブしたり、削除したり、再追加したりすることは
+ かなり面倒です。特に、関連するオブジェクトを扱うような場合には際立ちます。 よくあるのは、親子関係を扱うケースです。
+ 以下の例を考えてみましょう。 </para>
<para>
- ����A�e�q�W�̎q���l�^�Ȃ�i�Ⴆ�A�Z���╶����̃R���N�V�����j�A
-
�����̃��C�t�T�C�N���͐e�Ɉˑ����Ă���A�֗��ȏ�ԕω���"�J�X�P�[�h"��g�����߂ɁA
�lj��̍�Ƃ͕K�v�͂���܂���B
- �e���Z�[�u���ꂽ�Ƃ��A�l�^�̎q�I�u�W�F�N�g������悤�ɃZ�[�u����܂����A
�e���폜���ꂽ�Ƃ��́A�q��폜����܂��B���̑��̑��������ł��B
- �R���N�V��������1�̎q��폜����悤�ȑ���ł���܂������܂��B
���Ȃ킿�AHibernate�͂��̍폜������o����ƁA
- �l�^�̃I�u�W�F�N�g�͎Q�Ƃ��L�ł��Ȃ��̂ŁA�f�[�^�x�[�X���炻�̎q����폜���܂��B
</para>
+ もし、親子関係の子が値型なら(例えば、住所や文字列のコレクション)、
+ それらのライフサイクルは親に依存しており、便利な状態変化の"カスケード"を使うために、 追加の作業は必要はありません。
+ 親がセーブされたとき、値型の子オブジェクトも同じようにセーブされますし、 親が削除されたときは、子も削除されます。その他の操作も同じです。
+ コレクションから1つの子を削除するような操作でもうまくいきます。 すなわち、Hibernateはこの削除操作を検出すると、
+ 値型のオブジェクトは参照を共有できないので、データベースからその子供を削除します。 </para>
- <para>�����ŁA�e�Ǝq���l�^�łȂ��G���e�B�e�B�ł���Ƃ��ē����V�i���I��l���Ă݂܂��傤�B
- �i�Ⴆ�A�J�e�S���[�ƕi�ڂ̊W��e�Ǝq�̔L�̊W�ł��B�j
�G���e�B�e�B�́A���ꎩ�g�����C�t�T�C�N�������A�Q�Ƃ̋��L��T�|�[�g���܂��B
- �i���̂��߁A�R���N�V��������G���e�B�e�B��폜���邱�Ƃ́A
�G���e�B�e�B���g�̍폜��Ӗ����܂���B�j
- �܂��A�G���e�B�e�B�́A�f�t�H���g�ł́A�֘A���鑼�̃G���e�B�e�B��
��Ԃ�J�X�P�[�h���邱�Ƃ͂���܂���B Hibernate��
- <emphasis>���B�\���ɂ��i����</emphasis>
��f�t�H���g�ł͎��s���܂���B </para>
+ <para>ここで、親と子が値型でなくエンティティであるとして同じシナリオを考えてみましょう。
+ (例えば、カテゴリーと品目の関係や親と子の猫の関係です。) エンティティは、それ自身がライフサイクルを持ち、参照の共有をサポートします。
+ (そのため、コレクションからエンティティを削除することは、 エンティティ自身の削除を意味しません。)
+ また、エンティティは、デフォルトでは、関連する他のエンティティへ 状態をカスケードすることはありません。 Hibernateは
+ <emphasis>到達可能性による永続化</emphasis> をデフォルトでは実行しません。 </para>
<para>
- Hibernate��Session�̊�{����i <literal>persist(), merge(),
saveOrUpdate(),
- delete(), lock(), refresh(), evict(), replicate()</literal>
���܂܂�܂��j�ɑ��āA
- ���ꂼ��ɑΉ�����J�X�P�[�h�X�^�C��������܂��B ���ꂼ��̃J�X�P�[�h�X�^�C���ɂ́A
<literal>create, merge,
+ HibernateのSessionの基本操作( <literal>persist(), merge(), saveOrUpdate(),
+ delete(), lock(), refresh(), evict(), replicate()</literal>
が含まれます)に対して、
+ それぞれに対応するカスケードスタイルがあります。 それぞれのカスケードスタイルには、 <literal>create, merge,
save-update, delete, lock, refresh, evict, replicate</literal>
- �Ƃ������O�����Ă��܂��B
����A�֘A�ɉ����ăJ�X�P�[�h�����������삪����Ȃ�A�}�b�s���O�t�@�C���ɂ����w�肵�Ȃ���Ȃ�܂���B
- �Ⴆ�A�ȉ��̂悤�ɂ��܂��B </para>
+ という名前がついています。 もし、関連に沿ってカスケードさせたい操作があるなら、マッピングファイルにそう指定しなければなりません。
+ 例えば、以下のようにします。 </para>
<programlisting><![CDATA[<one-to-one name="person"
cascade="persist"/>]]></programlisting>
- <para> �J�X�P�[�h�X�^�C���́A�g�ݍ��킹�邱�Ƃ��ł��܂��B </para>
+ <para> カスケードスタイルは、組み合わせることができます。 </para>
<programlisting><![CDATA[<one-to-one name="person"
cascade="persist,delete,lock"/>]]></programlisting>
<para>
- <emphasis>���ׂĂ�</emphasis>
- �����֘A�ɉ����ăJ�X�P�[�h����悤�w�肷��Ƃ��́A
<literal>cascade="all"</literal> ��g���܂��B
- �f�t�H���g�� <literal>cascade="none"</literal>
�́A�ǂ̑����J�X�P�[�h���Ȃ����Ƃ�Ӗ����܂��B
+ <emphasis>すべての</emphasis>
+ 操作を関連に沿ってカスケードするよう指定するときは、
<literal>cascade="all"</literal> を使います。
+ デフォルトの <literal>cascade="none"</literal>
は、どの操作もカスケードしないことを意味します。
</para>
<para>
- ����ȃJ�X�P�[�h�X�^�C��
- <literal>delete-orphan</literal> �́A��Α��֘A�ɂ��� �K�p�ł��܂��B
- ����́A�֘A����폜���ꂽ�q���̃I�u�W�F�N�g�ɑ��āA
<literal>delete()</literal>
- ���삪�K�p����邱�Ƃ�Ӗ����܂��B </para>
+ 特殊なカスケードスタイル
+ <literal>delete-orphan</literal> は、一対多関連にだけ 適用できます。
+ これは、関連から削除された子供のオブジェクトに対して、 <literal>delete()</literal>
+ 操作が適用されることを意味します。 </para>
- <para>�������߁F </para>
+ <para>おすすめ: </para>
<itemizedlist spacing="compact">
<listitem>
<para>
- ���ʁA <literal><many-to-one></literal> ��
- <literal><many-to-many></literal>
�֘A�ɑ��ẮA
- �J�X�P�[�h��ݒ肷��Ӗ��͂���܂���B
<literal><one-to-one></literal> ��
- <literal><one-to-many></literal>
�֘A�ɑ��ẮA
- �J�X�P�[�h����ɗ����Ƃ�����܂��B </para>
+ 普通、 <literal><many-to-one></literal> や
+ <literal><many-to-many></literal>
関連に対しては、
+ カスケードを設定する意味はありません。
<literal><one-to-one></literal> と
+ <literal><one-to-many></literal> 関連に対しては、
+ カスケードが役に立つことがあります。 </para>
</listitem>
<listitem>
<para>
- �q���I�u�W�F�N�g�̎������e�I�u�W�F�N�g�̎����ɐ������Ȃ�A
- <literal>cascade="all,delete-orphan"</literal>
��w�肵�A �q���I�u�W�F�N�g��
- <emphasis>���C�t�T�C�N���I�u�W�F�N�g</emphasis> �ɂ��܂��B
</para>
+ 子供オブジェクトの寿命が親オブジェクトの寿命に制限を受けるならば、
+ <literal>cascade="all,delete-orphan"</literal>
を指定し、 子供オブジェクトを
+ <emphasis>ライフサイクルオブジェクト</emphasis> にします。 </para>
</listitem>
<listitem>
<para> .
- ����ȊO�̏ꍇ�́A�J�X�P�[�h�͂قƂ�ǕK�v�Ȃ��ł��傤�B
- �������A�����g�����U�N�V�����̂Ȃ��Őe�Ǝq���ꏏ�ɓ��삷�邱�Ƃ������Ǝv���A
- �����炩�̃R�[�h������Ԃ�Ȃ������̂ł���A
+ それ以外の場合は、カスケードはほとんど必要ないでしょう。
+ しかし、同じトランザクションのなかで親と子が一緒に動作することが多いと思い、
+ いくらかのコードを書く手間を省きたいのであれば、
<literal>cascade="persist,merge,save-update"</literal>
- ��g�����Ƃ�l���܂��傤�B </para>
+ を使うことを考えましょう。 </para>
</listitem>
</itemizedlist>
- <para> <literal>cascade="all"</literal>
�Ń}�b�s���O�����֘A�i�P�l�֘A��R���N�V�����j�́A
- <emphasis>�e�q</emphasis> �X�^�C���̊֘A�ƃ}�[�N����܂��B
- ����́A�e�̃Z�[�u/�X�V/�폜���A�q�̃Z�[�u/�X�V/�폜������N�����W�̂��Ƃł��B
</para>
+ <para> <literal>cascade="all"</literal>
でマッピングした関連(単値関連やコレクション)は、
+ <emphasis>親子</emphasis> スタイルの関連とマークされます。
+ それは、親のセーブ/更新/削除が、子のセーブ/更新/削除を引き起こす関係のことです。 </para>
<para>
- ����ɁA�i�������ꂽ�e���q��P�ɎQ�Ƃ��Ă��邾���ŁA�q�̃Z�[�u/�X�V������N�����܂��B
- �������A���̃��^�t�@�[�͕s���S�ł��B�e����Q�Ƃ���Ȃ��Ȃ����q�́A�����I�ɍ폜
<emphasis>����܂���</emphasis> �B
- �������A <literal>cascade="delete-orphan"</literal>
�Ń}�b�s���O���ꂽ
- <literal><one-to-many></literal> �֘A�� �����Ăł��B
- �e�q�W�̃J�X�P�[�h����̐��m�ȈӖ��͈ȉ��̂悤�ɂȂ�܂��B </para>
+ さらに、永続化された親が子を単に参照しているだけで、子のセーブ/更新を引き起こします。
+ しかし、このメタファーは不完全です。親から参照されなくなった子は、自動的に削除
<emphasis>されません</emphasis> 。
+ ただし、 <literal>cascade="delete-orphan"</literal>
でマッピングされた
+ <literal><one-to-many></literal> 関連を 除いてです。
+ 親子関係のカスケード操作の正確な意味は以下のようになります。 </para>
<itemizedlist spacing="compact">
<listitem>
<para>
- �e��
- <literal>persist()</literal> �ɓn���ꂽ�Ȃ�A ���ׂĂ̎q��
- <literal>persist()</literal> �ɓn����܂��B </para>
+ 親が
+ <literal>persist()</literal> に渡されたならば、 すべての子は
+ <literal>persist()</literal> に渡されます。 </para>
</listitem>
<listitem>
<para>
- <literal>merge()</literal> �ɓn���ꂽ�Ȃ�A ���ׂĂ̎q��
- <literal>merge()</literal> �ɓn����܂��B </para>
+ <literal>merge()</literal> に渡されたならば、 すべての子は
+ <literal>merge()</literal> に渡されます。 </para>
</listitem>
<listitem>
<para>
- �e�� <literal>save()</literal>
- �A <literal>update()</literal>
- �A <literal>saveOrUpdate()</literal>
�ɓn���ꂽ�Ȃ�A���ׂĂ̎q��
- <literal>saveOrUpdate()</literal> �ɓn����܂��B
</para>
+ 親が <literal>save()</literal>
+ 、 <literal>update()</literal>
+ 、 <literal>saveOrUpdate()</literal> に渡されたならば、すべての子は
+ <literal>saveOrUpdate()</literal> に渡されます。 </para>
</listitem>
<listitem>
<para>
- �ꎞ�I�܂��͕�����Ԃ̎q���A�i�������ꂽ�e�ɎQ�Ƃ��ꂽ�Ȃ�A
- <literal>saveOrUpdate()</literal> �ɓn����܂��B
</para>
+ 一時的または分離状態の子が、永続化された親に参照されたならば、
+ <literal>saveOrUpdate()</literal> に渡されます。 </para>
</listitem>
<listitem>
<para>
- �e���폜���ꂽ�Ȃ�A���ׂĂ̎q�́A <literal>delete()</literal>
�ɓn����܂��B </para>
+ 親が削除されたならば、すべての子は、 <literal>delete()</literal> に渡されます。
</para>
</listitem>
<listitem>
<para>
- �q���i�������ꂽ�e����Q�Ƃ���Ȃ��Ȃ����Ƃ��́A
<emphasis>���ɉ���N����܂���</emphasis> �B
- ����āA�A�v���P�[�V�������K�v�ł���A�����I�ɍ폜����K�v������܂��B
- �������A
<literal>cascade="delete-orphan"</literal> �̏ꍇ�����܂��B
- ���̏ꍇ�A�u�e�̂Ȃ��v�q�͍폜����܂��B </para>
+ 子が永続化された親から参照されなくなったときは、 <emphasis>特に何も起こりません</emphasis>
。
+ よって、アプリケーションが必要であれば、明示的に削除する必要があります。
+ ただし、 <literal>cascade="delete-orphan"</literal>
の場合を除きます。
+ この場合、「親のない」子は削除されます。 </para>
</listitem>
</itemizedlist>
<para>
- �Ō�ɁA����̃J�X�P�[�h���I�u�W�F�N�g�O���t�ɓK�p�����̂́A
<emphasis>�R�[��������</emphasis>
- ���邢�́A <emphasis>flush������</emphasis>
�ł��邱�Ƃɒ��ӂ��Ă��������B
- ���ׂĂ̑���́A���̑��삪���s���ꂽ�Ƃ��ɁA���B�\�Ȋ֘A����G���e�B�e�B�ɑ���
- �J�X�P�[�h���\�Ȃ�J�X�P�[�h���܂��B
- �������A <literal>save-upate</literal> ��
- <literal>delete-orphan</literal> �́A
<literal>Session</literal>
- ��flush���Ă���ԂɁA ���ׂĂ̓��B�\�Ȋ֘A����G���e�B�e�B�ɓ`�d���܂��B</para>
+ 最後に、操作のカスケードがオブジェクトグラフに適用されるのは、 <emphasis>コールした時</emphasis>
+ あるいは、 <emphasis>flushした時</emphasis> であることに注意してください。
+ すべての操作は、その操作が実行されたときに、到達可能な関連するエンティティに対して
+ カスケードが可能ならカスケードします。
+ しかし、 <literal>save-upate</literal> と
+ <literal>delete-orphan</literal> は、
<literal>Session</literal>
+ がflushしている間に、 すべての到達可能な関連するエンティティに伝播します。</para>
</sect1>
<sect1 id="objectstate-metadata">
- <title>���^�f�[�^�̎g�p</title>
+ <title>メタデータの使用</title>
<para>
- Hibernate�́A���ׂẴG���e�B�e�B�ƒl�^�̔��Ƀ��b�`�ȃ��^���x���̃��f����K�v�Ƃ��܂��B
- �Ƃ��ǂ��A���̃��f���̓A�v���P�[�V�����ɂƂ��ĂƂĂ��ɗ����܂��B
- �Ⴆ�A�A�v���P�[�V�����́AHibernate�̃��^�f�[�^��g���āA"����"
�f�B�[�v�R�s�[�A���S���Y����
-
�����ł��邩����܂���B���̃A���S���Y���Ƃ́A�ǂ̃I�u�W�F�N�g���R�s�[�����ׂ����i��F�ς̒l�^�j��
- �ǂ̃I�u�W�F�N�g�̓R�s�[����Ȃ��ׂ����i��F�s�ςȒl�^��\�Ȃ�֘A����G���e�B�e�B�j��
���f�ł����̂ł��B </para>
+ Hibernateは、すべてのエンティティと値型の非常にリッチなメタレベルのモデルを必要とします。
+ ときどき、このモデルはアプリケーションにとってとても役に立ちます。
+ 例えば、アプリケーションは、Hibernateのメタデータを使って、"賢い" ディープコピーアルゴリズムを
+ 実装できるかもしません。そのアルゴリズムとは、どのオブジェクトがコピーされるべきか(例:可変の値型)や
+ どのオブジェクトはコピーされないべきか(例:不変な値型や可能なら関連するエンティティ)を 判断できるものです。 </para>
<para>
- Hibernate��<literal>ClassMetadata</literal>
- ��<literal>CollectionMetadata</literal> �C���^�t�F�[�X��
- <literal>Type</literal> �K�w��ʂ��ă��^�f�[�^����J���܂��B
- ���^�f�[�^�C���^�[�t�F�C�X�̃C���X�^���X�́A
<literal>SessionFactory</literal> ���瓾���܂��B
+ Hibernateは<literal>ClassMetadata</literal>
+ と<literal>CollectionMetadata</literal> インタフェースと
+ <literal>Type</literal> 階層を通してメタデータを公開します。
+ メタデータインターフェイスのインスタンスは、 <literal>SessionFactory</literal>
から得られます。
</para>
@@ -1117,4 +1119,4 @@
</sect1>
-</chapter>
\ No newline at end of file
+</chapter>
Modified:
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/toolset_guide.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/toolset_guide.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/toolset_guide.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,39 +1,41 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="toolsetguide" revision="2">
<title>Toolset Guide
- �c�[���Z�b�g�K�C�h
+ ツールセットガイド
</title>
<para>
- Hibernate��g�������E���h�g���b�v�G���W�j�A�����O�́A
- Eclipse�v���O�C����R�}���h���C���c�[���A������Ant�^�X�N��g�����Ƃʼn\�ł��B
+ Hibernateを使ったラウンドトリップエンジニアリングは、
+ Eclipseプラグインやコマンドラインツール、もちろんAntタスクを使うことで可能です。
</para>
<para>
- <emphasis>Hibernate Tools</emphasis>
�͌��݁A�����f�[�^�x�[�X�̃��o�[�X�G���W�j�A�����O��Ant�^�X�N�ɉ����āAEclipseIDE�̃v���O�C����܂݂܂��B
+ <emphasis>Hibernate Tools</emphasis>
は現在、既存データベースのリバースエンジニアリングのAntタスクに加えて、EclipseIDEのプラグインを含みます。
</para>
<itemizedlist>
<listitem><para>
- <emphasis>�}�b�s���O�G�f�B�^:</emphasis>
- Hibernate��XML�}�b�s���O�t�@�C���p�̃G�f�B�^�ŁA
-
�����⊮�ƍ\�������\����T�|�[�g���Ă��܂��B�N���X����v���p�e�B/�t�B�[���h���ɑ��鎩���⊮��T�|�[�g���A
- �ʏ��XML�G�f�B�^������͂ł��B
+ <emphasis>マッピングエディタ:</emphasis>
+ HibernateのXMLマッピングファイル用のエディタで、
+ 自動補完と構文強調表示をサポートしています。クラス名やプロパティ/フィールド名に対する自動補完もサポートし、
+ 通常のXMLエディタよりも強力です。
</para></listitem>
<listitem><para>
<emphasis>Console:</emphasis>
- �R���\�[���̓G�N���v�X�̐V�����r���[�ł��B
-
�R���\�[���R���t�B�M�����[�V�����̃c���[�I�[�o�[�r���[�ɉ����āA�i���N���X�Ƃ��̊֘A�̑��ݍ�p�r���[������܂��B
- �f�[�^�x�[�X��HQL����s���A���ʂڃG�N���v�X��Ō��邱�Ƃ��ł��܂��B
+ コンソールはエクリプスの新しいビューです。
+ コンソールコンフィギュレーションのツリーオーバービューに加えて、永続クラスとその関連の相互作用ビューも得られます。
+ データベースにHQLを実行し、結果を直接エクリプス上で見ることができます。
</para></listitem>
<listitem><para>
- <emphasis>�J���E�B�U�[�h</emphasis>
- Hibernate��Eclipse�c�[���͂������̃E�B�U�[�h����܂��B
- �E�B�U�[�h��g����Hibernate�̐ݒ�t�@�C��(cfg.xml)���₭����������A
-
�����̃f�[�^�x�[�X�X�L�[�}��POJO�̃\�[�X�t�@�C����Hibernate�̃}�b�s���O�t�@�C���ւƁA
- ���S�Ƀ��o�[�X�G���W�j�A�����O���邱�Ƃ��ł��܂��B
-
���o�[�X�G���W�j�A�����O�E�B�U�[�h�̓J�X�^�}�C�Y�\�ȃe���v���[�g��T�|�[�g���܂��B
+ <emphasis>開発ウィザード</emphasis>
+ HibernateのEclipseツールはいくつかのウィザードを提供します。
+ ウィザードを使ってHibernateの設定ファイル(cfg.xml)をすばやく生成したり、
+ 既存のデータベーススキーマをPOJOのソースファイルとHibernateのマッピングファイルへと、
+ 完全にリバースエンジニアリングすることができます。
+ リバースエンジニアリングウィザードはカスタマイズ可能なテンプレートをサポートします。
</para></listitem>
<listitem><para>
<emphasis>Ant Tasks:</emphasis>
@@ -42,43 +44,43 @@
</itemizedlist>
<para>
- ���ڂ������� <emphasis>Hibernate Tools</emphasis>
�p�b�P�[�W�Ƃ��̃h�L�������g��Q�Ƃ��Ă��������B
+ より詳しい情報は <emphasis>Hibernate Tools</emphasis>
パッケージとそのドキュメントを参照してください。
</para>
<para>
- �������AHibernate�̃��C���p�b�P�[�W��
<emphasis>SchemaExport</emphasis> �A
- �ʖ� <literal>hbm2ddl</literal>
��܂݂܂�(Hibernate��ŃI���U�t���C�Ŏg�p�ł��܂�)�B
+ しかし、Hibernateのメインパッケージは <emphasis>SchemaExport</emphasis> 、
+ 別名 <literal>hbm2ddl</literal> も含みます(Hibernate内でオンザフライで使用できます)。
</para>
<sect1 id="toolsetguide-s1" revision="2">
- <title>�X�L�[�}�̎�������</title>
+ <title>スキーマの自動生成</title>
<para>
- DDL��Hibernate���[�e�B���e�B�ɂ��}�b�s���O�t�@�C�����琶�����邱�Ƃ��ł��܂��B
-
�������ꂽ�X�L�[�}�̓G���e�B�e�B��R���N�V�����̃e�[�u���ɑ���Q�Ɛ���������(��L�[�ƊO���L�[)��܂݂܂��B
- �e�[�u���ƃV�[�P���X�̓}�b�s���O���鎯�ʎq�W�F�l���[�^�ɑ��Đ�������܂��B
+ DDLはHibernateユーティリティによりマッピングファイルから生成することができます。
+ 生成されたスキーマはエンティティやコレクションのテーブルに対する参照整合性制約(主キーと外部キー)を含みます。
+ テーブルとシーケンスはマッピングする識別子ジェネレータに対して生成されます。
</para>
<para>
-
DDL�̓x���_�[�ˑ��Ȃ̂ŁA���̃c�[����g���Ƃ��́A<literal>hibernate.dialect</literal>
- �v���p�e�B��SQL�� <literal>����</literal> ��w��
<emphasis>���Ȃ���Ȃ�܂���</emphasis> �B
+ DDLはベンダー依存なので、このツールを使うときは、<literal>hibernate.dialect</literal>
+ プロパティでSQLの <literal>方言</literal> を指定
<emphasis>しなければなりません</emphasis> 。
</para>
<para>
-
�܂��A���������X�L�[�}����P����悤�ɁA�}�b�s���O�t�@�C����J�X�^�}�C�Y���Ă��������B
+ まず、生成されるスキーマを改善するように、マッピングファイルをカスタマイズしてください。
</para>
<sect2 id="toolsetguide-s1-2" revision="3">
- <title>�X�L�[�}�̃J�X�^�}�C�Y</title>
+ <title>スキーマのカスタマイズ</title>
<para>
- ������Hibernate�̃}�b�s���O�v�f�ł́A�I�v�V������
<literal>length</literal> �Ƃ������̑������`���Ă��܂��B
-
���̑����ŃJ��������ݒ肷�邱�Ƃ��ł��܂�(�܂���NUMERIC/DECIMAL�^�̃f�[�^�̐��x��ݒ�ł��܂�)�B
+ 多くのHibernateのマッピング要素では、オプションの <literal>length</literal>
という名の属性を定義しています。
+ この属性でカラム長を設定することができます(またはNUMERIC/DECIMAL型のデータの精度を設定できます)。
</para>
<para>
- <literal>not-null</literal> �����i�e�[�u���̃J������
<literal>NOT NULL</literal> ���������j��
- <literal>unique</literal> �����i�e�[�u���̃J������
<literal>UNIQUE</literal> ���������j���ݒ�ł���^�O�����܂��B
+ <literal>not-null</literal> 属性(テーブルのカラムへ <literal>NOT
NULL</literal> 制約を生成する)と
+ <literal>unique</literal> 属性(テーブルのカラムへ
<literal>UNIQUE</literal> 制約を生成する)が設定できるタグもあります。
</para>
<programlisting><![CDATA[<many-to-one name="bar"
column="barId" not-null="true"/>]]></programlisting>
@@ -86,9 +88,9 @@
<programlisting><![CDATA[<element column="serialNumber"
type="long" not-null="true"
unique="true"/>]]></programlisting>
<para>
- <literal>unique-key</literal>
�����̓J������O���[�v�����Ĉ�̃L�[����ɂ��邽�߂Ɏg���܂��B
- ���݁A<literal>unique-key</literal> �����Ŏw�肳�ꂽ�l�͐���̎w��ɂ�
<emphasis>�g��ꂸ</emphasis> �A
- �}�b�s���O�t�@�C���ŃJ������O���[�v�����邱�Ƃɂ̂ݎg���܂��B
+ <literal>unique-key</literal>
属性はカラムをグループ化して一つのキー制約にするために使われます。
+ 現在、<literal>unique-key</literal> 属性で指定された値は制約の指定には
<emphasis>使われず</emphasis> 、
+ マッピングファイルでカラムをグループ化することにのみ使われます。
</para>
<programlisting><![CDATA[<many-to-one name="org"
column="orgId" unique-key="OrgEmployeeId"/>
@@ -97,21 +99,21 @@
<para>
- <literal>index</literal>
�����̓}�b�s���O����J������g���Đ��������C���f�b�N�X�̖��O��w�肵�܂��B
-
�����J������P�̃C���f�b�N�X�ɃO���[�v���ł��܂��B�P�ɁA�����C���f�b�N�X����w�肷�邾���ł��B
+ <literal>index</literal>
属性はマッピングするカラムを使って生成したインデックスの名前を指定します。
+ 複数カラムを1つのインデックスにグループ化できます。単に、同じインデックス名を指定するだけです。
</para>
<programlisting><![CDATA[<property name="lastName"
index="CustName"/>
<property name="firstName"
index="CustName"/>]]></programlisting>
<para>
- <literal>foreign-key</literal>
�����́A�������ꂽ�O���L�[����̖��O��I�[�o�[���C�h���邽�߂Ɏg�p�ł��܂��B
+ <literal>foreign-key</literal>
属性は、生成された外部キー制約の名前をオーバーライドするために使用できます。
</para>
<programlisting><![CDATA[<many-to-one name="bar"
column="barId"
foreign-key="FKFooBar"/>]]></programlisting>
<para>
- �����̃}�b�s���O�v�f�́A�q
<literal><column></literal>
�v�f��L�q�ł��܂��B����͕����J�����^�̃}�b�s���O�ɂ͓��ɗL�p�ł��B
+ 多くのマッピング要素は、子 <literal><column></literal>
要素を記述できます。これは複数カラム型のマッピングには特に有用です。
</para>
<programlisting><![CDATA[<property name="name"
type="my.customtypes.Name"/>
@@ -121,9 +123,9 @@
</property>]]></programlisting>
<para>
- <literal>default</literal> �����̓J�����̃f�t�H���g�l��w�肵�܂�
- (�}�b�s���O�����N���X�̐V�����C���X�^���X��ۑ�����O�ɁA
- �}�b�s���O�����v���p�e�B�֓����l�������ׂ��ł�)�B
+ <literal>default</literal> 属性はカラムのデフォルト値を指定します
+ (マッピングしたクラスの新しいインスタンスを保存する前に、
+ マッピングしたプロパティへ同じ値を代入すべきです)。
</para>
<programlisting><![CDATA[<property name="credits"
type="integer" insert="false">
@@ -135,7 +137,7 @@
</property>]]></programlisting>
<para>
- <literal>sql-type</literal>
�����ŁA�f�t�H���g��Hibernate�^����SQL�̃f�[�^�^�ւ̃}�b�s���O��I�[�o�[���C�h�ł��܂��B
+ <literal>sql-type</literal>
属性で、デフォルトのHibernate型からSQLのデータ型へのマッピングをオーバーライドできます。
</para>
@@ -145,7 +147,7 @@
<para>
- <literal>check</literal> �����Ń`�F�b�N�����w�肷�邱�Ƃ��ł��܂��B
+ <literal>check</literal> 属性でチェック制約を指定することができます。
</para>
<programlisting><![CDATA[<property name="foo"
type="integer">
@@ -159,94 +161,94 @@
<table frame="topbot" id="schemattributes-summary"
revision="2">
- <title>�܂Ƃ�</title>
+ <title>まとめ</title>
<tgroup cols="3">
<colspec colwidth="1*"/>
<colspec colwidth="1*"/>
<colspec colwidth="2.5*"/>
<thead>
<row>
- <entry>����</entry>
- <entry>�l</entry>
- <entry>���</entry>
+ <entry>属性</entry>
+ <entry>値</entry>
+ <entry>説明</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>length</literal></entry>
- <entry>���l</entry>
- <entry>�J�����̒���</entry>
+ <entry>数値</entry>
+ <entry>カラムの長さ</entry>
</row>
<row>
<entry><literal>precision</literal></entry>
- <entry>���l</entry>
-
<entry>�J������DECIMAL�^�̐��x�iprecision�j</entry>
+ <entry>数値</entry>
+ <entry>カラムのDECIMAL型の精度(precision)</entry>
</row>
<row>
<entry><literal>scale</literal></entry>
- <entry>���l</entry>
-
<entry>�J������DECIMAL�^�̃X�P�[���iscale�j</entry>
+ <entry>数値</entry>
+ <entry>カラムのDECIMAL型のスケール(scale)</entry>
</row>
<row>
<entry><literal>not-null</literal></entry>
<entry><literal>true|false</literal></entry>
- <entry>�J������null�l����Ȃ����Ƃ�w�肵�܂�
+ <entry>カラムがnull値を取らないことを指定します
</entry>
</row>
<row>
<entry><literal>unique</literal></entry>
<entry><literal>true|false</literal></entry>
- <entry>�J���������j�[�N��������Ƃ�w�肵�܂�
+ <entry>カラムがユニーク制約を持つことを指定します
</entry>
</row>
<row>
<entry><literal>index</literal></entry>
- <entry><literal>�C���f�b�N�X��</literal>
</entry>
- <entry>(�����J������)�C���f�b�N�X�̖��O��w�肵�܂�
+ <entry><literal>インデックス名</literal>
</entry>
+ <entry>(複数カラムの)インデックスの名前を指定します
</entry>
</row>
<row>
<entry><literal>unique-key</literal></entry>
-
<entry><literal>���j�[�N�L�[��</literal></entry>
- <entry>�����J�����̃��j�[�N����̖��O��w�肵�܂�
+
<entry><literal>ユニークキー名</literal></entry>
+ <entry>複数カラムのユニーク制約の名前を指定します
</entry>
</row>
<row>
<entry><literal>foreign-key</literal></entry>
-
<entry><literal>�O���L�[��</literal></entry>
+
<entry><literal>外部キー名</literal></entry>
<entry>
-
<one-to-one>�A<many-to-one>�A<many-to-many>�}�b�s���O�v�f��g���āA
- �֘A�ɑ��������ꂽ�O���L�[����̖��O��w�肵�܂��B
- <literal>SchemaExport</literal> ��
<literal>inverse="true"</literal> ����l�����Ȃ����Ƃɒ��ӂ��Ă��������B
+
<one-to-one>、<many-to-one>、<many-to-many>マッピング要素を使って、
+ 関連に対し生成された外部キー制約の名前を指定します。
+ <literal>SchemaExport</literal> は
<literal>inverse="true"</literal> 側を考慮しないことに注意してください。
</entry>
</row>
<row>
<entry><literal>sql-type</literal></entry>
-
<entry><literal>SQL�̃J�����^</literal></entry>
+
<entry><literal>SQLのカラム型</literal></entry>
<entry>
- �f�t�H���g�̃J�����^��I�[�o�[���C�h���܂�(
<literal><column></literal> �v�f�̑����̂�)
+ デフォルトのカラム型をオーバーライドします(
<literal><column></literal> 要素の属性のみ)
</entry>
</row>
<row>
<entry><literal>default</literal></entry>
- <entry>SQL��</entry>
+ <entry>SQL式</entry>
<entry>
- �J�����̃f�t�H���g�l��w�肵�܂�
+ カラムのデフォルト値を指定します
</entry>
</row>
<row>
<entry><literal>check</literal></entry>
- <entry>SQL��</entry>
+ <entry>SQL式</entry>
<entry>
- �J�������e�[�u����SQL�̃`�F�b�N�����쐬���܂�
+ カラムかテーブルにSQLのチェック制約を作成します
</entry>
</row>
</tbody>
@@ -254,7 +256,7 @@
</table>
<para>
- <literal><comment></literal>
�v�f�Ő�������X�L�[�}�ɃR�����g��w�肷�邱�Ƃ��ł��܂��B
+ <literal><comment></literal>
要素で生成するスキーマにコメントを指定することができます。
</para>
@@ -270,16 +272,16 @@
</property>]]></programlisting>
<para>
- ����ɂ��A��������DDL�� <literal>comment on table</literal> ��
<literal>comment on column</literal> ����������܂��B
+ これにより、生成したDDLに <literal>comment on table</literal> や
<literal>comment on column</literal> 文が書かれます。
</para>
</sect2>
<sect2 id="toolsetguide-s1-3" revision="2">
- <title>�c�[���̎��s</title>
+ <title>ツールの実行</title>
<para>
- <literal>SchemaExport</literal>
�͕W���o�͂ɑ���DDL�X�N���v�g�����o���ADDL������s���������܂��B
+ <literal>SchemaExport</literal>
は標準出力に対してDDLスクリプトを書き出し、DDL文を実行したりもします。
</para>
<para>
@@ -290,70 +292,70 @@
<table frame="topbot">
<title> <literal>SchemaExport</literal> Command Line
Options
- <literal>SchemaExport</literal> �̃R�}���h���C���I�v�V����
+ <literal>SchemaExport</literal> のコマンドラインオプション
</title>
<tgroup cols="2">
<colspec colwidth="1.5*"/>
<colspec colwidth="2*"/>
<thead>
<row>
- <entry>�I�v�V����</entry>
- <entry>���</entry>
+ <entry>オプション</entry>
+ <entry>説明</entry>
</row>
</thead>
<tbody>
<row>
<entry> <literal>--quiet</literal>
</entry>
- <entry>�X�N���v�g��W���o�͂ɏo�͂��܂���</entry>
+ <entry>スクリプトを標準出力に出力しません</entry>
</row>
<row>
<entry> <literal>--drop</literal>
</entry>
- <entry>�e�[�u���̍폜������s���܂�</entry>
+ <entry>テーブルの削除だけを行います</entry>
</row>
<row>
<entry> <literal>--create</literal>
</entry>
- <entry>�e�[�u���̐����݂̂�s���܂��B
+ <entry>テーブルの生成のみを行います。
</entry>
</row>
<row>
<entry> <literal>--text</literal>
</entry>
- <entry>�f�[�^�x�[�X�ɃG�N�X�|�[�g���܂���</entry>
+ <entry>データベースにエクスポートしません</entry>
</row>
<row>
<entry>
<literal>--output=my_schema.ddl</literal> </entry>
- <entry> DDL�X�N���v�g��t�@�C���ɏo�͂��܂�</entry>
+ <entry> DDLスクリプトをファイルに出力します</entry>
</row>
<row>
<entry>
<literal>--naming=eg.MyNamingStrategy</literal> </entry>
- <entry> <literal>NamingStrategy</literal>
��I���܂�
+ <entry> <literal>NamingStrategy</literal>
を選択します
</entry>
</row>
<row>
<entry><literal>--config=hibernate.cfg.xml</literal> </entry>
-
<entry>XML�t�@�C������Hibernate�̒�`����ǂݍ��݂܂�</entry>
+ <entry>XMLファイルからHibernateの定義情報を読み込みます</entry>
</row>
<row>
<entry>
<literal>--properties=hibernate.properties</literal> </entry>
-
<entry>�t�@�C������f�[�^�x�[�X�v���p�e�B��ǂݍ��݂܂�</entry>
+ <entry>ファイルからデータベースプロパティを読み込みます</entry>
</row>
<row>
<entry> <literal>--format</literal>
</entry>
-
<entry>�X�N���v�g��ɐ�������SQL��ǂ݂₷���悤�Ƀt�H�[�}�b�g���܂�</entry>
+ <entry>スクリプト内に生成するSQLを読みやすいようにフォーマットします</entry>
</row>
<row>
<entry> <literal>--delimiter=x</literal>
</entry>
- <entry>�X�N���v�g�̍s��蕶����ݒ肵�܂�</entry>
+ <entry>スクリプトの行区切り文字を設定します</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
- �A�v���P�[�V������ <literal>SchemaExport</literal>
��g�ݍ��ނ��Ƃ�ł��܂��F
+ アプリケーションに <literal>SchemaExport</literal> を組み込むこともできます:
</para>
<programlisting><![CDATA[Configuration cfg = ....;
@@ -363,69 +365,69 @@
<sect2 id="toolsetguide-s1-4">
- <title>�v���p�e�B</title>
+ <title>プロパティ</title>
<para>
- ���̂悤�ɁA�f�[�^�x�[�X�̃v���p�e�B��w�肷�邱�Ƃ��ł��܂��B
+ 次のように、データベースのプロパティを指定することができます。
</para>
<itemizedlist spacing="compact">
<listitem>
- <para><literal>-D</literal>
<emphasis><property></emphasis>
��g���āA�V�X�e���v���p�e�B�Ƃ���
+ <para><literal>-D</literal>
<emphasis><property></emphasis> を使って、システムプロパティとして
</para>
</listitem>
<listitem>
- <para><literal>hibernate.properties</literal>
�t�@�C�����
+ <para><literal>hibernate.properties</literal>
ファイル内で
</para>
</listitem>
<listitem>
- <para> <literal>--properties</literal>
��g���Ďw�肵���v���p�e�B�t�@�C�����
+ <para> <literal>--properties</literal>
を使って指定したプロパティファイル内で
</para>
</listitem>
</itemizedlist>
<para>
- �K�v�ȃv���p�e�B�͈ȉ��̂�̂ł��F
+ 必要なプロパティは以下のものです:
</para>
<table frame="topbot">
- <title>SchemaExport�R�l�N�V�����v���p�e�B</title>
+ <title>SchemaExportコネクションプロパティ</title>
<tgroup cols="2">
<colspec colwidth="1.5*"/>
<colspec colwidth="2*"/>
<thead>
<row>
- <entry>�v���p�e�B��
+ <entry>プロパティ名
</entry>
- <entry>���
+ <entry>説明
</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>hibernate.connection.driver_class</literal> </entry>
- <entry>jdbc�̃h���C�o�[�N���X
+ <entry>jdbcのドライバークラス
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.url</literal> </entry>
- <entry>jdbc��url
+ <entry>jdbcのurl
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.username</literal> </entry>
- <entry>�f�[�^�x�[�X�̃��[�U
+ <entry>データベースのユーザ
</entry>
</row>
<row>
<entry>
<literal>hibernate.connection.password</literal> </entry>
- <entry>���[�U�p�X���[�h
+ <entry>ユーザパスワード
</entry>
</row>
<row>
<entry> <literal>hibernate.dialect</literal>
</entry>
- <entry>�f�[�^�x�[�X����
+ <entry>データベース方言
</entry>
</row>
</tbody>
@@ -435,10 +437,10 @@
</sect2>
<sect2 id="toolsetguide-s1-5">
- <title>Ant��g�p����</title>
+ <title>Antを使用する</title>
<para>
- Ant�̃r���h�X�N���v�g���� <literal>SchemaExport</literal>
��Ăяo�����Ƃ��ł��܂��B:
+ Antのビルドスクリプトから <literal>SchemaExport</literal>
を呼び出すことができます。:
</para>
<programlisting><![CDATA[<target
name="schemaexport">
@@ -462,13 +464,13 @@
</sect2>
<sect2 id="toolsetguide-s1-6" revision="2">
- <title>�C���N�������^���ȃX�L�[�}�X�V
+ <title>インクリメンタルなスキーマ更新
</title>
<para>
- <literal>SchemaUpdate</literal>
�c�[���͊����̃X�L�[�}��C���N�������^���ɍX�V���܂��B
- <literal>SchemaUpdate</literal>
��JDBC�̃��^�f�[�^API�ɋ����ˑ����܂��B
- ���̂��߁A���ׂĂ�JDBC�h���C�o�ł��܂������Ƃ͌���Ȃ����Ƃɒ��ӂ��Ă��������B
+ <literal>SchemaUpdate</literal>
ツールは既存のスキーマをインクリメンタルに更新します。
+ <literal>SchemaUpdate</literal> はJDBCのメタデータAPIに強く依存します。
+ そのため、すべてのJDBCドライバでうまくいくとは限らないことに注意してください。
</para>
<para>
@@ -477,42 +479,42 @@
</para>
<table frame="topbot">
- <title> <literal>SchemaUpdate</literal>
�̃R�}���h���C����I�v�V����</title>
+ <title> <literal>SchemaUpdate</literal>
のコマンドライン・オプション</title>
<tgroup cols="2">
<colspec colwidth="1.5*"/>
<colspec colwidth="2*"/>
<thead>
<row>
- <entry>�I�v�V����</entry>
- <entry>���</entry>
+ <entry>オプション</entry>
+ <entry>説明</entry>
</row>
</thead>
<tbody>
<row>
<entry> <literal>--quiet</literal>
</entry>
- <entry>�W���o�͂ɃX�N���v�g��o�͂��܂���</entry>
+ <entry>標準出力にスクリプトを出力しません</entry>
</row>
<row>
<entry> <literal>--text</literal>
</entry>
- <entry>�f�[�^�x�[�X�ɃX�N���v�g��G�N�X�|�[�g���܂���
+ <entry>データベースにスクリプトをエクスポートしません
</entry>
</row>
<row>
<entry>
<literal>--naming=eg.MyNamingStrategy</literal> </entry>
- <entry><literal>NamingStrategy</literal>
��I���܂��B
+ <entry><literal>NamingStrategy</literal>
を選択します。
</entry>
</row>
<row>
<entry>
<literal>--properties=hibernate.properties</literal> </entry>
- <entry>�t�@�C������f�[�^�x�[�X�v���p�e�B��ǂݍ��݂܂�
+ <entry>ファイルからデータベースプロパティを読み込みます
</entry>
</row>
<row>
<entry>
<literal>--config=hibernate.cfg.xml</literal> </entry>
- <entry><literal>.cfg.xml</literal>
�t�@�C����w�肵�܂�
+ <entry><literal>.cfg.xml</literal>
ファイルを指定します
</entry>
</row>
@@ -521,7 +523,7 @@
</table>
<para>
- �A�v���P�[�V������ <literal>SchemaUpdate</literal>
��g�ݍ��ނ��Ƃ��ł��܂��B�F
+ アプリケーションに <literal>SchemaUpdate</literal> を組み込むことができます。:
</para>
<programlisting><![CDATA[Configuration cfg = ....;
@@ -531,10 +533,10 @@
<sect2 id="toolsetguide-s1-7">
- <title>�C���N�������^���ȃX�L�[�}�X�V�ɑ���Ant�̎g�p</title>
+ <title>インクリメンタルなスキーマ更新に対するAntの使用</title>
<para>
- Ant�X�N���v�g���� <literal>SchemaUpdate</literal>
��Ăяo�����Ƃ��ł��܂��F
+ Antスクリプトから <literal>SchemaUpdate</literal> を呼び出すことができます:
</para>
<programlisting><![CDATA[<target
name="schemaupdate">
@@ -557,7 +559,7 @@
<title>Schema validation</title>
<para>
- <literal>SchemaValidator</literal>
�c�[���́A�����̃f�[�^�x�[�X�X�L�[�}�ƍ쐬�����}�b�s���O�h�L�������g��"��v����"���Ƃ����܂��B
<literal>SchemaValidator</literal>
��JDBC�̃��^�f�[�^API�ɋ����ˑ����邱�Ƃɒ��ӂ��Ă��������B���̂��߁A���ׂĂ�JDBC�h���C�o�[�ō쓮�����̂ł͂���܂���B���̃c�[���̓e�X�g���ɔ��ɗL�p�ł��B
+ <literal>SchemaValidator</literal>
ツールは、既存のデータベーススキーマと作成したマッピングドキュメントが"一致する"ことを検証します。
<literal>SchemaValidator</literal>
はJDBCのメタデータAPIに強く依存することに注意してください。そのため、すべてのJDBCドライバーで作動するものではありません。このツールはテスト時に非常に有用です。
</para>
<para>
@@ -566,31 +568,31 @@
</para>
<table frame="topbot">
- <title> <literal>SchemaValidator</literal>
�̃R�}���h���C���E�I�v�V����
+ <title> <literal>SchemaValidator</literal>
のコマンドライン・オプション
</title>
<tgroup cols="2">
<colspec colwidth="1.5*"/>
<colspec colwidth="2*"/>
<thead>
<row>
- <entry>�I�v�V����</entry>
- <entry>���</entry>
+ <entry>オプション</entry>
+ <entry>説明</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>--naming=eg.MyNamingStrategy</literal> </entry>
- <entry><literal>NamingStrategy</literal>
��I���܂�
+ <entry><literal>NamingStrategy</literal>
を選択します
</entry>
</row>
<row>
<entry>
<literal>--properties=hibernate.properties</literal> </entry>
- <entry>�t�@�C������f�[�^�x�[�X�̃v���p�e�B��ǂݍ��݂܂�
+ <entry>ファイルからデータベースのプロパティを読み込みます
</entry>
</row>
<row>
<entry>
<literal>--config=hibernate.cfg.xml</literal> </entry>
- <entry><literal>.cfg.xml</literal>
�t�@�C����w�肵�܂�
+ <entry><literal>.cfg.xml</literal>
ファイルを指定します
</entry>
</row>
</tbody>
@@ -598,7 +600,7 @@
</table>
<para>
- <literal>SchemaValidator</literal>
��A�v���P�[�V�����ɑg�ݍ��ނ��Ƃ��o���܂�:
+ <literal>SchemaValidator</literal> をアプリケーションに組み込むことが出来ます:
</para>
<programlisting><![CDATA[Configuration cfg = ....;
@@ -607,10 +609,10 @@
</sect2>
<sect2 id="toolsetguide-s1-9">
- <title>�X�L�[�}�̃o���f�[�V������Ant��g�p���܂�</title>
+ <title>スキーマのバリデーションにAntを使用します</title>
<para>
- Ant�X�N���v�g���� <literal>SchemaValidator</literal>
��Ăяo���܂�:
+ Antスクリプトから <literal>SchemaValidator</literal> を呼び出せます:
</para>
<programlisting><![CDATA[<target
name="schemavalidate">
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/transactions.xml
===================================================================
---
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/transactions.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++
core/trunk/documentation/manual/ja-JP/src/main/docbook/content/transactions.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,299 +1,301 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="transactions" revision="2">
- <title>�g�����U�N�V�����ƕ��s��</title>
+ <title>トランザクションと並行性</title>
<para>
- Hibernate�Ɠ������s����ɂ��čł�d�v�ȓ_�́A�e�Ղɗ���ł��邱�Ƃł��B
-
Hibernate�͐V���ȃ��b�N�̐U�镑����lj����Ă��炸�A����JDBC�R�l�N�V������JTA���\�[�X��g�p���܂��B
- JDBC�AANSI�A����уf�[�^�x�[�X�Ǘ��V�X�e���iDBMS�j�̃g�����U�N�V���������̎d�l��
- �������Ԃ����ĕ����邱�Ƃ����������܂��B
+ Hibernateと同時実行制御について最も重要な点は、容易に理解できることです。
+ Hibernateは新たなロックの振る舞いを追加しておらず、直接JDBCコネクションとJTAリソースを使用します。
+ JDBC、ANSI、およびデータベース管理システム(DBMS)のトランザクション分離の仕様を
+ 少し時間をかけて勉強することを強く推奨します。
</para>
<para>
- Hibernate�̓�������̃I�u�W�F�N�g���b�N���܂���B
- �A�v���P�[�V�����́A�f�[�^�x�[�X�g�����U�N�V�����̕������x����
- ��`�����U�镑������҂ł��܂��B
- �g�����U�N�V�����X�R�[�v�̃L���b�V���ł���� <literal>Session</literal>
�̂��A�ŁA
- ���ʎq��N�G���ɂ�茟�������G���e�B�e�B�̓��s�[�^�u�����[�h�ɂȂ�܂�
- �i�X�J���[�l��Ԃ��悤�ȃ��|�[�g�N�G���͈Ⴂ�܂��j�B
+ Hibernateはメモリ内のオブジェクトをロックしません。
+ アプリケーションは、データベーストランザクションの分離レベルで
+ 定義した振る舞いを期待できます。
+ トランザクションスコープのキャッシュでもある <literal>Session</literal> のお陰で、
+ 識別子やクエリにより検索したエンティティはリピータブルリードになります
+ (スカラー値を返すようなレポートクエリは違います)。
</para>
<para>
- �o�[�W���j���O�ɂ�鎩���I�Ȋy�ϓI�������s����ɉ����āA
- <literal>SELECT FOR UPDATE</literal> ����g�p���āA
- �s��ߊϓI���b�N���邽�߂́i�}�C�i�[�ȁjAPI����܂��B
- �y�ϓI�������s����Ƃ���API�ɂ��ẮA���̏͂̌�̂ق��ŋc�_���܂��B
+ バージョニングによる自動的な楽観的同時実行制御に加えて、
+ <literal>SELECT FOR UPDATE</literal> 文を使用して、
+ 行を悲観的ロックするための(マイナーな)APIも提供します。
+ 楽観的同時実行制御とこのAPIについては、この章の後のほうで議論します。
</para>
<para>
-
�f�[�^�x�[�X�g�����U�N�V�����Ⓑ���Θb�iconversation�A�����O�g�����U�N�V�����j�����łȂ��A
-
<literal>Configuration</literal>�A<literal>SessionFactory</literal>�A�����
+ データベーストランザクションや長い対話(conversation、ロングトランザクション)だけでなく、
+
<literal>Configuration</literal>、<literal>SessionFactory</literal>、および
<literal>Session</literal>
- �Ƃ������x��Hibernate���s���������s����̋c�_��n�߂܂��B
+ という粒度でHibernateが行う同時実行制御の議論を始めます。
</para>
<sect1 id="transactions-basics" revision="1">
- <title>session�X�R�[�v��transaction�X�R�[�v</title>
+ <title>sessionスコープとtransactionスコープ</title>
<para>
- <literal>SessionFactory</literal> �͐������邱�Ƃ������ŁA
- �X���b�h�Z�[�t�ȃI�u�W�F�N�g�ł��B
- ����āA�A�v���P�[�V�����̂��ׂẴX���b�h�ŋ��L���ׂ��ł��B
- �ʏ�A�A�v���P�[�V�����̋N�����ɁA
- <literal>Configuration</literal>
�C���X�^���X����P�x�����������܂��B
+ <literal>SessionFactory</literal> は生成することが高価で、
+ スレッドセーフなオブジェクトです。
+ よって、アプリケーションのすべてのスレッドで共有すべきです。
+ 通常、アプリケーションの起動時に、
+ <literal>Configuration</literal> インスタンスから1度だけ生成します。
</para>
<para>
- <literal>Session</literal>
�͍����ł͂Ȃ��A�X���b�h�Z�[�t�ȃI�u�W�F�N�g�ł����܂���B
- ����āA�P�̗v����P�̑Θb�A�P�̍�ƒP�ʁiunit of work�j�ɑ��ĂP�x�����g���A
- ���̌�Ŏ̂Ă�ׂ��ł��B
- <literal>Session</literal> �͕K�v�ɂȂ�܂ŁA
- JDBC <literal>Connection</literal>�i�������
<literal>DataSource</literal>�j��l�����܂���B
- �䂦�ɁA���ۂɎg�p����Ƃ��܂Ń��\�[�X�����܂���B
+ <literal>Session</literal> は高価ではなく、スレッドセーフなオブジェクトでもありません。
+ よって、1つの要求や1つの対話、1つの作業単位(unit of work)に対して1度だけ使い、
+ その後で捨てるべきです。
+ <literal>Session</literal> は必要になるまで、
+ JDBC <literal>Connection</literal>(もしくは
<literal>DataSource</literal>)を獲得しません。
+ ゆえに、実際に使用するときまでリソースを消費しません。
</para>
<para>
- ���̏��������邽�߂ɁA �f�[�^�x�[�X�g�����U�N�V�����ɂ��Ă�l���Ȃ���Ȃ�܂���B
- �f�[�^�x�[�X��̃��b�N�̋������Ȃ����邽�߂ɁA
- �f�[�^�x�[�X�g�����U�N�V�����͉\�Ȍ���Z������ׂ��ł��B
-
�����f�[�^�x�[�X�g�����U�N�V�����́A�A�v���P�[�V�����̍���������s����j�Q���܂��B
- �䂦�ɁA���[�U�[���l���Ă���ԁi��ƒP�ʂ���������܂Łj�f�[�^�x�[�X�g�����U�N�V������
- �J�����܂܂ɂ���̂́A�����Ă��̏ꍇ�悢�v�Ƃ͂����܂���B
+ この状況を完了させるために、 データベーストランザクションについても考えなければなりません。
+ データベース内のロックの競合を少なくするために、
+ データベーストランザクションは可能な限り短くするべきです。
+ 長いデータベーストランザクションは、アプリケーションの高い並列実行性を阻害します。
+ ゆえに、ユーザーが考えている間(作業単位が完了するまで)データベーストランザクションを
+ 開いたままにするのは、たいていの場合よい設計とはいえません。
</para>
<para>
- ��ƒP�ʂƂ����X�R�[�v�Ƃ͉��ł��傤���H
- �P��Hibernate <literal>Session</literal> �́A
- �������̃f�[�^�x�[�X�g�����U�N�V������܂����邱�Ƃ��ł���ł��傤���H
- �܂��́A�X�R�[�v�ƈ�Έ�̊W�ł��傤���H
- ���� <literal>Session</literal> ��J���A����ׂ��ł��傤���H
- �����āA�f�[�^�x�[�X�g�����U�N�V�������E��ǂ̂悤�ɕ�����̂ł��傤���H
+ 作業単位というスコープとは何でしょうか?
+ 1つのHibernate <literal>Session</literal> は、
+ いくつかのデータベーストランザクションをまたがることができるでしょうか?
+ または、スコープと一対一の関係でしょうか?
+ いつ <literal>Session</literal> を開き、閉じるべきでしょうか?
+ そして、データベーストランザクション境界をどのように分けるのでしょうか?
</para>
<sect2 id="transactions-basics-uow" revision="1">
- <title>��ƒP�ʁiUnit of work�j</title>
+ <title>作業単位(Unit of work)</title>
<para>
- �P�ڂ́A<emphasis>session-per-operation</emphasis>
�A���`�p�^�[����g���Ă͂����܂���B
- ���Ȃ킿�A�P�̃X���b�h�̒��ŁA�P���ȃf�[�^�x�[�X�Ăяo���̂��т�
- <literal>Session</literal> ��J���āA���Ă͂����܂���I
- ������A�f�[�^�x�[�X�g�����U�N�V�����ɂ��Ă���l�ł��B
- �A�v���P�[�V�������̃f�[�^�x�[�X�Ăяo���́A
- �v�悳�ꂽ�V�[�P���X�iplanned sequence�j��g���A
- �A�g�~�b�N�ȍ�ƒP�ʂɕ��ނ���܂��B
- �i�P��SQL�����ƂɃR�~�b�g���鎩���R�~�b�g���A
- �g���Ȃ��Ƃ����Ӗ��ł���邱�Ƃɒ��ӂ��Ă��������B
- �����R�~�b�g�́ASQL�R���\�[���ŃA�h�z�b�N�ȍ�Ƃ���ۂɎg����̂ł��B
- Hibernate�͒����Ɏ����R�~�b�g���[�h���ɂ��܂��B
- ������́A�A�v���P�[�V�����T�[�o�[�����������邱�Ƃ���҂��܂��B�j
- �f�[�^�x�[�X�g�����U�N�V�����̓I�v�V�����ł͂���܂���B
- �f�[�^�x�[�X�Ƃ̂��ׂĂ̒ʐM�́A�f�[�^�̓ǂݍ��݂ł����Ă�A�������݂ł����Ă�A
- �g�����U�N�V�����̒��ōs��Ȃ���Ȃ�܂���B
- �������ƁA�f�[�^�ǂݍ��݂ɑ��āA�����R�~�b�g�͔���ׂ��ł��B
- �Ȃ��Ȃ�A�����̏����ȃg�����U�N�V�����́A���m�ɒ�`���ꂽ�P�̍�ƒP�ʂƔ�ׂāA
- �p�t�H�[�}���X���悭�Ȃ邱�Ƃ͂���܂���B
- ��҂͕ێ琫��g�������肷����Ă��܂��B
+ 1つ目は、<emphasis>session-per-operation</emphasis>
アンチパターンを使ってはいけません。
+ すなわち、1つのスレッドの中で、単純なデータベース呼び出しのたびに
+ <literal>Session</literal> を開いて、閉じてはいけません!
+ もちろん、データベーストランザクションについても同様です。
+ アプリケーション中のデータベース呼び出しは、
+ 計画されたシーケンス(planned sequence)を使い、
+ アトミックな作業単位に分類されます。
+ (1つのSQL文ごとにコミットする自動コミットが、
+ 使われないという意味でもあることに注意してください。
+ 自動コミットは、SQLコンソールでアドホックな作業をする際に使うものです。
+ Hibernateは直ちに自動コミットモードを無効にします。
+ もしくは、アプリケーションサーバーが無効化することを期待します。)
+ データベーストランザクションはオプションではありません。
+ データベースとのすべての通信は、データの読み込みであっても、書き込みであっても、
+ トランザクションの中で行わなければなりません。
+ 説明すると、データ読み込みに対して、自動コミットは避けるべきです。
+ なぜなら、多数の小さなトランザクションは、明確に定義された1つの作業単位と比べて、
+ パフォーマンスがよくなることはありません。
+ 後者は保守性や拡張性もよりすぐれています。
</para>
<para>
- �}���`���[�U�[�̃N���C�A���g�^�T�[�o�[�A�v���P�[�V�����̒��ŁA
- �ł�悭�g����p�^�[���́A<emphasis>session-per-request</emphasis>
�ł��B
- ���̃��f���̒��ł́A
- �N���C�A���g����iHibernate�i�����w�����삷��j�T�[�o�[�փ��N�G�X�g�������A
- �V����Hibernate <literal>Session</literal> ���J����܂��B
- �����āA���̍�ƒP�ʂ̒��ł��ׂẴf�[�^�x�[�X���������s����܂��B
- ��Ƃ����������i�����āA�N���C�A���g�ւ̃��X�|���X�������ł����j���_�ŁA
- session ��t���b�V�����A���܂��B
-
�N���C�A���g�̗v���������邽�߂ɁA�P�̃f�[�^�x�[�X�g�����U�N�V������g�p����ł��傤�B
- <literal>Session</literal> ��J���A����ۂɁA
- �f�[�^�x�[�X�g�����U�N�V������J�n���A�R�~�b�g���܂��B
- ��̊W�͈�Έ�ł��B
- ���̃��f���͑����̃A�v���P�[�V�����Ɋ��S�ɓK�����܂��B
+ マルチユーザーのクライアント/サーバーアプリケーションの中で、
+ 最もよく使われるパターンは、<emphasis>session-per-request</emphasis> です。
+ このモデルの中では、
+ クライアントから(Hibernate永続化層が動作する)サーバーへリクエストが送られ、
+ 新しいHibernate <literal>Session</literal> が開かれます。
+ そして、この作業単位の中ですべてのデータベース処理が実行されます。
+ 作業が完了した(そして、クライアントへのレスポンスが準備できた)時点で、
+ session をフラッシュし、閉じます。
+ クライアントの要求を処理するために、1つのデータベーストランザクションを使用するでしょう。
+ <literal>Session</literal> を開き、閉じる際に、
+ データベーストランザクションを開始し、コミットします。
+ 二つの関係は一対一です。
+ このモデルは多くのアプリケーションに完全に適合します。
</para>
<para>
- �ȍ~�̎����Ƀ`�������W���Ă��������B
- <literal>Session</literal>
�����A�g�����U�N�V�����𐳊m�ɊJ�n���A�I��点�邾���łȂ��A
- �f�[�^�A�N�Z�X�������₷������K�v������܂��B
-
���N�G�X�g���T�[�o�[�Ƀq�b�g�����ۂƁA���X�|���X�𑗐M����O�ɁA���s�����interceptor
-
�i�Ⴆ�A<literal>ServletFilter</literal>�j��g���āA��ƒP�ʂ̋��E���������̂����z�I�ł��B
- <literal>ThreadLocal</literal> �ϐ���g���āA
- ���N�G�X�g��������X���b�h�� <literal>Session</literal>
���т��邱�Ƃ𐄏����܂��B
- ����ɂ��A�X���b�h��Ŏ��s����邷�ׂẴR�[�h�ŁA
- �istatic�ϐ��ɃA�N�Z�X����悤�Ɂj�ȒP�� <literal>Session</literal>
�ɃA�N�Z�X�ł���悤�ɂȂ�܂��B
-
�I�����f�[�^�x�[�X�g�����U�N�V�������E�̋@�\����ŁA<literal>ThreadLocal</literal>
- �ϐ��̒��Ƀg�����U�N�V�����R���e�L�X�g��ێ����邩�����܂���B
- ���̎����p�^�[���́A<emphasis>ThreadLocal Session</emphasis>
�����
- <emphasis>Open Session in View</emphasis>
�Ƃ������O�Œm���Ă��܂��B
- �{�h�L�������g�Ő�Ɍ����� <literal>HibernateUtil</literal>
�w���p�[�N���X��g�����邱�ƂŁA
- ���̃p�^�[����e�ՂɎ����ł��܂��B
- ������Ainterceptor �����������@�����A����Z�b�g�A�b�v����K�v������܂��B
- Hibernate��Web�T�C�g�ɂ���tips�Ɨ��Q�Ƃ��Ă��������B
+ 以降の実装にチャレンジしてください。
+ <literal>Session</literal> を持ち、トランザクションを正確に開始し、終わらせるだけでなく、
+ データアクセス操作も得やすくする必要があります。
+ リクエストがサーバーにヒットした際と、レスポンスを送信する前に、実行されるinterceptor
+
(例えば、<literal>ServletFilter</literal>)を使って、作業単位の境界を実装するのが理想的です。
+ <literal>ThreadLocal</literal> 変数を使って、
+ リクエストを処理するスレッドに <literal>Session</literal> を結びつけることを推奨します。
+ これにより、スレッド内で実行されるすべてのコードで、
+ (static変数にアクセスするように)簡単に <literal>Session</literal>
にアクセスできるようになります。
+ 選択したデータベーストランザクション境界の機構次第で、<literal>ThreadLocal</literal>
+ 変数の中にトランザクションコンテキストを保持するかもしれません。
+ この実装パターンは、<emphasis>ThreadLocal Session</emphasis> および
+ <emphasis>Open Session in View</emphasis> という名前で知られています。
+ 本ドキュメントで先に見せた <literal>HibernateUtil</literal>
ヘルパークラスを拡張することで、
+ このパターンを容易に実装できます。
+ もちろん、interceptor を実装する方法を見つけ、環境をセットアップする必要があります。
+ HibernateのWebサイトにあるtipsと例を参照してください。
</para>
<para>
- �ȍ~�̎����Ƀ`�������W���Ă��������B
- Hibernate�͒P���Ȃ��̃p�^�[���̂��߂ɁA�\�ߑg�ݍ��܂ꂽ
- �ucurrent session�v�̊Ǘ�����܂��B
- �T�[�o�[���N�G�X�g��������ۂ̓g�����U�N�V������J�n���Ȃ���Ȃ�܂���B
- �����āA���X�|���X��N���C�A���g�ɑ��M����O�Ƀg�����U�N�V������I��点�܂��B
- �D���ȕ��@�Ŏ����ł��܂��B��ʓI�ȉ����
<literal>ServletFilter</literal> ��
- �T�[�r�X���\�b�h��|�C���g�J�b�g����AOP�C���^�[�Z�v�^�[�A
- proxy/interception �R���e�i�ł��B
- EJB�R���e�i��EJB�Z�b�V�����r�[����g�����U�N�V�������E�Ƃ���
- �A�X�y�N�g��N���X�J�b�g��������̕W���I�ȕ��@�ł��iCMT�ɂ��錾�I�j�B
- �v���O�����ɂ��g�����U�N�V�������E��g���ƌ��߂��ꍇ�A
- �ȒP�Ɏg�����߁A�݊����̂���R�[�h�ɂ��邽�߂ɁA
- ���̏͂̌�̂ق��ɂ���Hibernate <literal>Transaction</literal>
API�̂ق����悢�ł��B
+ 以降の実装にチャレンジしてください。
+ Hibernateは単純なこのパターンのために、予め組み込まれた
+ 「current session」の管理を提供します。
+ サーバーリクエストを処理する際はトランザクションを開始しなければなりません。
+ そして、レスポンスをクライアントに送信する前にトランザクションを終わらせます。
+ 好きな方法で実現できます。一般的な解決策は <literal>ServletFilter</literal> や
+ サービスメソッドをポイントカットしてAOPインターセプター、
+ proxy/interception コンテナです。
+ EJBコンテナはEJBセッションビーンをトランザクション境界として
+ アスペクトをクロスカットする実装の標準的な方法です(CMTによる宣言的)。
+ プログラムによるトランザクション境界を使うと決めた場合、
+ 簡単に使うため、互換性のあるコードにするために、
+ この章の後のほうにあるHibernate <literal>Transaction</literal>
APIのほうがよいです。
</para>
<para>
- �A�v���P�[�V�����̃R�[�h�́A�K�v�ȂƂ��ɂǂ��ł�A����ł�A
- �P�� <literal>sessionFactory.getCurrentSession()</literal>
��Ăяo��������
- �u���݂̃Z�b�V�����v�ɃA�N�Z�X�ł��܂��B
- ���݂̃f�[�^�x�[�X�g�����U�N�V�����ւ�
<literal>�Z�b�V����</literal> ���Ɏ擾���܂��B
- ���\�[�X�E���[�J���Ȋ��A�������JTA����\�����Ȃ���Ȃ�܂���
- �i<xref linkend="architecture-current-session"/>
��Q�Ƃ��Ă��������j�B
+ アプリケーションのコードは、必要なときにどこでも、何回でも、
+ 単に <literal>sessionFactory.getCurrentSession()</literal>
を呼び出すだけで
+ 「現在のセッション」にアクセスできます。
+ 現在のデータベーストランザクションへの <literal>セッション</literal> を常に取得します。
+ リソース・ローカルな環境、もしくはJTA環境を構成しなければなりません
+ (<xref linkend="architecture-current-session"/>
を参照してください)。
</para>
<para>
- �Ƃ��ǂ��A�u�r���[��`�悷��v�܂� <literal>�Z�b�V����</literal>
- �ƃf�[�^�x�[�X�g�����U�N�V�����̃X�R�[�v��g������ƕ֗��Ȃ��Ƃ�����܂��B
- ����́A�v���̏����ƕ`��̃t�F�[�Y���Ă���
- �T�[�u���b�g�A�v���P�[�V�����ɂ����ē��ɖ𗧂��܂��B
- �Ǝ��̃C���^�[�Z�v�^���������A
- �r���[��`�悷��܂Ńf�[�^�x�[�X�g�����U�N�V������g������̂͊ȒP�ł��B
- �������A�R���e�i�Ǘ��g�����U�N�V������EJB�ɗ���ꍇ�́A�ȒP�ɂ͂ł��܂���B
- �Ȃ��Ȃ�A�r���[�̕`���J�n����O�ɁAEJB�̃��\�b�h�����^�[�������ۂɁA
- �g�����U�N�V�������������邽�߂ł��B
- ���� <emphasis>Open Session in View</emphasis>
�p�^�[���Ɋ֘A����q���g�Ɨ�ɂ��ẮA
- Hibernate��Web�T�C�g��t�H�[������Q�Ƃ��Ă��������B
+ ときどき、「ビューを描画する」まで <literal>セッション</literal>
+ とデータベーストランザクションのスコープを拡張すると便利なことがあります。
+ これは、要求の処理と描画のフェーズを分けている
+ サーブレットアプリケーションにおいて特に役立ちます。
+ 独自のインターセプタを実装すれば、
+ ビューを描画するまでデータベーストランザクションを拡張するのは簡単です。
+ しかし、コンテナ管理トランザクションのEJBに頼る場合は、簡単にはできません。
+ なぜなら、ビューの描画を開始する前に、EJBのメソッドがリターンした際に、
+ トランザクションが完了するためです。
+ この <emphasis>Open Session in View</emphasis>
パターンに関連するヒントと例については、
+ HibernateのWebサイトやフォーラムを参照してください。
</para>
</sect2>
<sect2 id="transactions-basics-apptx" revision="1">
- <title>�����Θb</title>
+ <title>長い対話</title>
<para>
- session-per-request�p�^�[���́A��ƒP�ʂ�v����ۂɖ𗧂l���Ƃ��������ł͂���܂���B
- �����̃r�W�l�X�v���Z�X�́A���[�U�[�Ƃ̈�A�̑��ݍ�p�S�̂�v�����܂��B
- ���̑��ݍ�p�ɂ́A�f�[�^�x�[�X�A�N�Z�X���܂܂�܂��B
+ session-per-requestパターンは、作業単位を設計する際に役立つ考えというだけではありません。
+ 多くのビジネスプロセスは、ユーザーとの一連の相互作用全体を要求します。
+ その相互作用には、データベースアクセスが含まれます。
- Web�ƃG���^�[�v���C�Y�A�v���P�[�V�����ł́A�f�[�^�x�[�X�g�����U�N�V������
- ���[�U�Ƃ̑��ݍ�p�ɂ܂œn�邱�Ƃ͋�����܂���B
+ Webとエンタープライズアプリケーションでは、データベーストランザクションが
+ ユーザとの相互作用にまで渡ることは許されません。
- ���̗��悭�l���Ă݂Ă��������B
+ 次の例をよく考えてみてください。
</para>
<itemizedlist>
<listitem>
<para>
- �_�C�A���O�̍ŏ��̉�ʂ��J���A�X��
<literal>Session</literal>
-
�ƃf�[�^�x�[�X�g�����U�N�V�����̒��Ń��[�h���ꂽ�f�[�^���[�U�[�Ɍ����܂��B
- ���[�U�[�̓I�u�W�F�N�g���R�ɏC���ł��܂��B
+ ダイアログの最初の画面が開き、個々の <literal>Session</literal>
+ とデータベーストランザクションの中でロードされたデータをユーザーに見せます。
+ ユーザーはオブジェクトを自由に修正できます。
</para>
</listitem>
<listitem>
<para>
- 5����Ƀ��[�U�[�́uSave�v��N���b�N���A�C�����i���������̂���҂��܂��B
- �܂��A���̏���ҏW�����͎̂����P�l�����ŁA
- �C���̃R���t���N�g�͔������Ȃ��Ɗ��҂��܂��B
+ 5分後にユーザーは「Save」をクリックし、修正が永続化されるのを期待します。
+ また、この情報を編集したのは自分1人だけで、
+ 修正のコンフリクトは発生しないと期待します。
</para>
</listitem>
</itemizedlist>
<para>
- ���̍�ƒP�ʂ�i���[�U�[�̎��_�Łj������ <emphasis>�Θb</emphasis>
-
�i������́A<emphasis>�A�v���P�[�V�����g�����U�N�V����</emphasis> �j�ƌĂт܂��B
- �A�v���P�[�V�����ɂ�������������@�͂�������܂��B
+ この作業単位を(ユーザーの視点で)長期の <emphasis>対話</emphasis>
+ (もしくは、<emphasis>アプリケーショントランザクション</emphasis> )と呼びます。
+ アプリケーションにこれを実装する方法はたくさんあります。
</para>
<para>
-
�ŏ��Ɏv���������́A���[�U�[���l���Ă���ԁA<literal>Session</literal>
- �ƃf�[�^�x�[�X�g�����U�N�V������J�����܂܂ɂ��Ă������Ƃł��B
- �����ɏC�����ꂸ�A�����ƌ��q�����ۏ����悤�ɁA
- �f�[�^�x�[�X��̃��b�N�͕ێ������܂܂ɂ��܂��B
- ������A����̓A���`�p�^�[���ł��B
- �Ȃ��Ȃ�A���b�N�̋�������������ƁA
- �A�v���P�[�V�������������[�U�[���ɉ����ăX�P�[���A�b�v�ł��Ȃ��Ȃ邩��ł��B
+ 最初に思いつく実装は、ユーザーが考えている間、<literal>Session</literal>
+ とデータベーストランザクションを開いたままにしておくことです。
+ 同時に修正されず、分離と原子性が保証されるように、
+ データベース内のロックは保持したままにします。
+ もちろん、これはアンチパターンです。
+ なぜなら、ロックの競合が発生すると、
+ アプリケーションが同時ユーザー数に応じてスケールアップできなくなるからです。
</para>
<para>
- ���炩�ɁA�Θb��������邽�߂ɂ́A
- �������̃f�[�^�x�[�X�g�����U�N�V������g�p����ׂ��ł��B
- ���̏ꍇ�A�r�W�l�X�v���Z�X�̕�����ێ����邱�Ƃ́A
- �A�v���P�[�V�����w�̐Ӗ��̂P�ɂȂ�܂��B
- �P�̑Θb�́A
- �ʏ킢�����̃f�[�^�x�[�X�g�����U�N�V�����ɋy�т܂��B
- �f�[�^�x�[�X�g�����U�N�V�����̂P�̂݁i�Ō�̂P�j���X�V�����f�[�^��ۑ����A
- ���̓f�[�^��ǂނ����ł���A����̓A�g�~�b�N�ł�
- �i�Ⴆ�A�������̗v���^������J��Ԃ��E�B�U�[�h�`���̃_�C�A���O�j�B
- ����͕������A���������ق����ȒP�ł��B
- Hibernate�̋@�\��g���̂ł���A���ɊȒP�ł��B
+ 明らかに、対話を実装するためには、
+ いくつかのデータベーストランザクションを使用するべきです。
+ この場合、ビジネスプロセスの分離を維持することは、
+ アプリケーション層の責務の1つになります。
+ 1つの対話は、
+ 通常いくつかのデータベーストランザクションに及びます。
+ データベーストランザクションの1つのみ(最後の1つ)が更新したデータを保存し、
+ 他はデータを読むだけであれば、それはアトミックです
+ (例えば、いくつかの要求/応答を繰り返すウィザード形式のダイアログ)。
+ これは聞くより、実装したほうが簡単です。
+ Hibernateの機能を使うのであれば、特に簡単です。
</para>
<itemizedlist>
<listitem>
<para>
- <emphasis>�����o�[�W���j���O</emphasis>
- - Hibernate�͎����I�Ɋy�ϓI�������s���䂪�ł��܂��B
- ���[�U�[���l���Ă���Ԃɓ����ɏC�����������ꍇ�A�����I�Ɍ��o�ł��܂��B
- �ʏ�A�Θb�̏I�����Ƀ`�F�b�N���邾���ł��B
+ <emphasis>自動バージョニング</emphasis>
+ - Hibernateは自動的に楽観的同時実行制御ができます。
+ ユーザーが考えている間に同時に修正がおきた場合、自動的に検出できます。
+ 通常、対話の終了時にチェックするだけです。
</para>
</listitem>
<listitem>
<para>
- <emphasis>�����iDetached�j�I�u�W�F�N�g</emphasis> -
���łɋc�_����
- <emphasis>session-per-request</emphasis>
�p�^�[����g���ƌ��肵���ꍇ�A
- ���[�h���ꂽ���ׂẴC���X�^���X�́A���[�U���l���Ă���Ԃ́A
- �Z�b�V�������番�����ꂽ��ԂɂȂ�܂��B
- �I�u�W�F�N�g��Z�b�V�����ɍĒlj����A�C����i�����ł��܂��B
- �����
<emphasis>session-per-request-with-detached-objects</emphasis>
- �p�^�[���ƌĂт܂��B
- �����o�[�W���j���O��g�����ƂŁA�����ɍs����C�����ł��܂��B
+ <emphasis>分離(Detached)オブジェクト</emphasis> - すでに議論した
+ <emphasis>session-per-request</emphasis>
パターンを使うと決定した場合、
+ ロードされたすべてのインスタンスは、ユーザが考えている間は、
+ セッションから分離された状態になります。
+ オブジェクトをセッションに再追加し、修正を永続化できます。
+ これを
<emphasis>session-per-request-with-detached-objects</emphasis>
+ パターンと呼びます。
+ 自動バージョニングを使うことで、同時に行われる修正を分離できます。
</para>
</listitem>
<listitem>
<para>
- <emphasis>�g���i������́A�����j�Z�b�V����</emphasis>
- - Hibernate�� <literal>Session</literal> �́A
- �f�[�^�x�[�X�g�����U�N�V������R�~�b�g������A
- ���Ō��т��Ă���JDBC�R�l�N�V������ؒf�ł��܂��B
- �����āA�N���C�A���g����̐V�����v�������������ۂɁA�Đڑ��ł��܂��B
-
���̃p�^�[���́A<emphasis>session-per-conversation</emphasis>
-
�Ƃ������Œm���Ă���A�I�u�W�F�N�g��Z�b�V�����֍Ēlj����邱�Ƃ����s�v�ɂ��܂��B
- �����o�[�W���j���O��g�����ƂŁA�����ɍs����C�����ł��܂��B
+ <emphasis>拡張(もしくは、長い)セッション</emphasis>
+ - Hibernateの <literal>Session</literal> は、
+ データベーストランザクションをコミットした後、
+ 裏で結びついているJDBCコネクションを切断できます。
+ そして、クライアントからの新しい要求が発生した際に、再接続できます。
+
このパターンは、<emphasis>session-per-conversation</emphasis>
+ という名で知られており、オブジェクトをセッションへ再追加することさえ不要にします。
+ 自動バージョニングを使うことで、同時に行われる修正を分離できます。
- �ʏ� <literal>Session</literal>
�����I�Ƀt���b�V���������A
- �����I�Ƀt���b�V�����܂��B
+ 通常 <literal>Session</literal> を自動的にフラッシュさせず、
+ 明示的にフラッシュします。
</para>
</listitem>
</itemizedlist>
<para>
-
<emphasis>session-per-request-with-detached-objects</emphasis> ��
- <emphasis>session-per-conversation</emphasis> �̂Q�́A
- ���_�ƌ��_�����Ă��܂��B
- ����ɂ��ẮA���̏͂̌�̂ق��ŁA�y�ϓI�������s����̕����̒��ŋc�_���܂��B
+
<emphasis>session-per-request-with-detached-objects</emphasis> と
+ <emphasis>session-per-conversation</emphasis> の2つは、
+ 利点と欠点を持っています。
+ これについては、この章の後のほうで、楽観的同時実行制御の文脈の中で議論します。
</para>
</sect2>
<sect2 id="transactions-basics-identity">
- <title>�I�u�W�F�N�g���ʎq��l����</title>
+ <title>オブジェクト識別子を考える</title>
<para>
- �A�v���P�[�V�����́A�Q�̈قȂ� <literal>Session</literal> ����
- �����i����Ԃɓ����ɃA�N�Z�X�ł��܂��B
- �������A�Q�� <literal>Session</literal> �C���X�^���X��
- �i�����N���X�̂P�̃C���X�^���X���L���邱�Ƃ͂ł��܂���B
- �䂦�ɁA���ʎq�ɂ͂Q�̈قȂ�T�O������Ƃ������ƂɂȂ�܂��B
+ アプリケーションは、2つの異なる <literal>Session</literal> から
+ 同じ永続状態に同時にアクセスできます。
+ しかし、2つの <literal>Session</literal> インスタンスが
+ 永続性クラスの1つのインスタンスを共有することはできません。
+ ゆえに、識別子には2つの異なる概念があるということになります。
</para>
<variablelist spacing="compact">
<varlistentry>
- <term>�f�[�^�x�[�X���ʎq</term>
+ <term>データベース識別子</term>
<listitem>
<para>
<literal>foo.getId().equals( bar.getId()
)</literal>
@@ -301,7 +303,7 @@
</listitem>
</varlistentry>
<varlistentry>
- <term>JVM���ʎq</term>
+ <term>JVM識別子</term>
<listitem>
<para>
<literal>foo==bar</literal>
@@ -311,105 +313,105 @@
</variablelist>
<para>
- <emphasis>�X��</emphasis>
<literal>Session</literal> �ɒlj����ꂽ�I�u�W�F�N�g�ɂƂ���
- �i���Ȃ킿�A�P�� <literal>Session</literal>
�̃X�R�[�v�̒��ł́j�A�Q�̊T�O�͓����ł��B
- �f�[�^�x�[�X���ꐫ��JVM���ꐫ����v���邱�Ƃ�AHibernate���ۏ��܂��B
- �������A�A�v���P�[�V�������Q�̈قȂ�Z�b�V��������
- �u�����v�i�i�������ʎq�́j�r�W�l�X�I�u�W�F�N�g�ɓ����ɃA�N�Z�X�������A
- �Q�̃C���X�^���X�͎��ۂɁiJVM���ʎq���j�u�قȂ�v�܂��B
- �y�ϓI�A�v���[�`�ɂ���āA�i�����o�[�W���j���O�́j�t���b�V���^�R�~�b�g����
- �R���t���N�g��������܂��B
+ <emphasis>個々の</emphasis>
<literal>Session</literal> に追加されたオブジェクトにとって
+ (すなわち、1つの <literal>Session</literal> のスコープの中では)、2つの概念は同じです。
+ データベース同一性とJVM同一性が一致することを、Hibernateが保証します。
+ しかし、アプリケーションが2つの異なるセッションから
+ 「同じ」(永続性識別子の)ビジネスオブジェクトに同時にアクセスする限り、
+ 2つのインスタンスは実際に(JVM識別子が)「異なり」ます。
+ 楽観的アプローチによって、(自動バージョニングの)フラッシュ/コミット時に
+ コンフリクトが解決されます。
</para>
<para>
- ���̃A�v���[�`�ł́AHibernate�ƃf�[�^�x�[�X�ɓ������s�ɂ��Ă̐S�z���c��܂��B
- ����ŁA�ō��̃X�P�[���r���e�B������܂��B
- �Ȃ��Ȃ�A�P�X���b�h�̍�ƒP�ʂ̒��ň�Ӑ����ۏ����A
- �����ȃ��b�N�⓯�������s�v�ɂȂ邽�߂ł��B
- <literal>Session</literal> ���ƂɂP�̃X���b�h��\��t�������A
- �A�v���P�[�V�����̓r�W�l�X�I�u�W�F�N�g��synchronize����K�v�͂���܂���B
- <literal>Session</literal>
��ł́A�A�v���P�[�V�����̓I�u�W�F�N�g���r���邽�߂ɁA
- <literal>==</literal> ����S�Ɏg�p�ł��܂��B
+ このアプローチでは、Hibernateとデータベースに同時実行についての心配が残ります。
+ 一方で、最高のスケーラビリティが提供されます。
+ なぜなら、1スレッドの作業単位の中で一意性が保証されれば、
+ 高価なロックや同期化が不要になるためです。
+ <literal>Session</literal> ごとに1つのスレッドを貼り付ける限り、
+ アプリケーションはビジネスオブジェクトをsynchronizeする必要はありません。
+ <literal>Session</literal> 内では、アプリケーションはオブジェクトを比較するために、
+ <literal>==</literal> を安全に使用できます。
</para>
<para>
- ����ǂ�A<literal>Session</literal> �̊O��
<literal>==</literal>
- ��g���A�v���P�[�V�����́A�\�����Ȃ����ʂɑ������܂��B
- ����͗\�����Ȃ��ꏊ�ŋN���肦�܂��B
- �Ⴆ�A�Q�̕����C���X�^���X�� <literal>Set</literal> ��
- put�����Ƃ��Ȃǂł��B
- �����Ƃ�����f�[�^�x�[�X���ʎq�����܂��i���Ȃ킿�A�����s��\���܂��j�B
- �������A������Ԃ̃C���X�^���X��JVM���ʎq�͓��R�ۏ���܂���B
- �J���҂́A�i�����N���X�� <literal>equals()</literal> ��
<literal>hashCode()</literal>
- ���\�b�h��I�[�o�[���C�h���A�I�u�W�F�N�g�������̊T�O��������ׂ��ł��B
- �x�����P����܂��B�������̎����Ƀf�[�^�x�[�X���ʎq��g��Ȃ��ł��������B
- ���j�[�N�ȁi���ʂ͕s�ς́j�����̑g�ݍ��킹�ł���r�W�l�X�L�[��g���Ă��������B
- ����A�ꎞ�I�u�W�F�N�g���i�������ꂽ�ꍇ�A�f�[�^�x�[�X���ʎq���ς��܂��B
- �ꎞ�I�u�W�F�N�g��i�ʏ핪���C���X�^���X�Ƌ��Ɂj
<literal>Set</literal>
-
�ɕێ�����ꍇ�A�n�b�V���R�[�h���ς��Ƃ������Ƃ́A<literal>Set</literal>
- �̌_���j��Ƃ������Ƃł��B
- �r�W�l�X�L�[�̂��߂̑����́A�f�[�^�x�[�X�̎�L�[�قLj��肷�ׂ��ł͂Ȃ��ł��B
- �I�u�W�F�N�g������ <literal>Set</literal>
�̒��ɂ���Ԃ����A�����ۏ��ׂ��ł��B
- ���̖��̂��O��I�ȋc�_�́AHibernate��Web�T�C�g��Q�Ƃ��Ă��������B
- �܂��A�����Hibernate�̖��ł͂Ȃ��A�P��Java�I�u�W�F�N�g�̎��ʎq�ⓙ������
- �ǂ̂悤�Ɏ������ׂ����Ƃ������Ƃł��B
+ けれども、<literal>Session</literal> の外で
<literal>==</literal>
+ を使うアプリケーションは、予期しない結果に遭遇します。
+ これは予期しない場所で起こりえます。
+ 例えば、2つの分離インスタンスを同じ <literal>Set</literal> に
+ putしたときなどです。
+ 両方とも同じデータベース識別子を持ちます(すなわち、同じ行を表します)。
+ しかし、分離状態のインスタンスのJVM識別子は当然保証されません。
+ 開発者は、永続性クラスの <literal>equals()</literal> と
<literal>hashCode()</literal>
+ メソッドをオーバーライドし、オブジェクト等価性の概念を実装すべきです。
+ 警告が1つあります。等価性の実装にデータベース識別子を使わないでください。
+ ユニークな(普通は不変の)属性の組み合わせであるビジネスキーを使ってください。
+ もし、一時オブジェクトが永続化された場合、データベース識別子が変わります。
+ 一時オブジェクトを(通常分離インスタンスと共に) <literal>Set</literal>
+ に保持する場合、ハッシュコードが変わるということは、<literal>Set</literal>
+ の契約を破るということです。
+ ビジネスキーのための属性は、データベースの主キーほど安定すべきではないです。
+ オブジェクトが同じ <literal>Set</literal> の中にいる間だけ、安定を保証すべきです。
+ この問題のより徹底的な議論は、HibernateのWebサイトを参照してください。
+ また、これはHibernateの問題ではなく、単にJavaオブジェクトの識別子や等価性を
+ どのように実装すべきかということです。
</para>
</sect2>
<sect2 id="transactions-basics-issues">
- <title>��ʓI�Ȗ��</title>
+ <title>一般的な問題</title>
<para>
- <emphasis>session-per-user-session</emphasis> ��
- <emphasis>session-per-application</emphasis> �A���`�p�^�[��
- �͎g���Ă͂����܂���i������A�܂�ɗ�O������܂��j�B
- ���ӁF���L�̖��̂������́A���������p�^�[���Ƃ��Ă�o�����܂��B
- �v���肷��O�ɁA���̈Ӗ��𗝉���悤�ɂ��Ă��������B
+ <emphasis>session-per-user-session</emphasis> と
+ <emphasis>session-per-application</emphasis> アンチパターン
+ は使ってはいけません(もちろん、まれに例外があります)。
+ 注意:下記の問題のいくつかは、推奨されるパターンとしても出現します。
+ 設計を決定する前に、裏の意味を理解するようにしてください。
</para>
<itemizedlist>
<listitem>
<para>
- <literal>Session</literal>
�̓X���b�h�Z�[�t�ł͂���܂���B
- HTTP���N�G�X�g�A�Z�b�V����Bean�ASwing���[�J�[�̂悤�ɁA
- �������s���\�Ȃ�̂� <literal>Session</literal>
�C���X�^���X���L����ƁA
- ������Ԃ�����N�����܂��B
- �i��ŋc�_����j<literal>HttpSession</literal> �̒���
- Hibernate <literal>Session</literal> ��ێ�����ꍇ�A
- HttpSession�ւ̃A�N�Z�X�������邱�Ƃ�l�����ׂ��ł��B
- ����Ȃ���A���[�U�[���\�����������[�h��N���b�N����ƁA
- �����ɑ���Q�̃X���b�h�̒��ŁA����
<literal>Session</literal> ���g���܂��B
+ <literal>Session</literal> はスレッドセーフではありません。
+ HTTPリクエスト、セッションBean、Swingワーカーのように、
+ 同時実行が可能なものが <literal>Session</literal> インスタンスを共有すると、
+ 競合状態を引き起こします。
+ (後で議論する)<literal>HttpSession</literal> の中で
+ Hibernate <literal>Session</literal> を保持する場合、
+ HttpSessionへのアクセスを同期化することを考慮すべきです。
+ さもなければ、ユーザーが十分早くリロードをクリックすると、
+ 同時に走る2つのスレッドの中で、同じ <literal>Session</literal>
が使われます。
</para>
</listitem>
<listitem>
<para>
-
Hibernate����O�𓊂����ꍇ�́A�f�[�^�x�[�X�g�����U�N�V�������[���o�b�N���A
- ������ <literal>Session</literal>
�����ׂ��ł��i�ڍׂ��ŋc�_���܂��j�B
- <literal>Session</literal>
���A�v���P�[�V�����Ɍ��ѕt�����Ă���̂ł���A
- �A�v���P�[�V�������~���ׂ��ł��B
-
�f�[�^�x�[�X�g�����U�N�V�������[���o�b�N����A�r�W�l�X�I�u�W�F�N�g��
- �g�����U�N�V������J�n�����Ƃ��̏�Ԃɖ߂�܂���B
-
����́A�f�[�^�x�[�X�̏�Ԃƃr�W�l�X�I�u�W�F�N�g�͓������Ă��Ȃ����Ƃ�Ӗ����܂��B
- �ʏ킱��͖��ɂȂ�܂���B
- �Ȃ��Ȃ�A��O�͉ł��Ȃ�����ł��B
- �Ƃɂ������[���o�b�N������ɂ�蒼���ׂ��ł��B
+ Hibernateが例外を投げた場合は、データベーストランザクションをロールバックし、
+ 直ちに <literal>Session</literal> を閉じるべきです(詳細を後で議論します)。
+ <literal>Session</literal> がアプリケーションに結び付けられているのであれば、
+ アプリケーションを停止すべきです。
+ データベーストランザクションをロールバックしても、ビジネスオブジェクトは
+ トランザクションを開始したときの状態に戻りません。
+ これは、データベースの状態とビジネスオブジェクトは同期していないことを意味します。
+ 通常これは問題になりません。
+ なぜなら、例外は回復できないからです。
+ とにかくロールバックした後にやり直すべきです。
</para>
</listitem>
<listitem>
<para>
- <literal>Session</literal>
�͉i���ipersistent�j��Ԃ̂��ׂẴI�u�W�F�N�g��
- �L���b�V�����܂��iHibernate�͊Ď����A�_�[�e�B��Ԃ��`�F�b�N���܂��j�B
- ����́A�����ԃZ�b�V������J�����܂܂ɂ��邩�A
- ���ɑ����̃f�[�^���[�h�������邩�����ꍇ�́A
- OutOfMemoryException����������܂Ŗ����ɑ傫���Ȃ邱�Ƃ�Ӗ����܂��B
- ����̂P�́A<literal>Session</literal>
�L���b�V����Ǘ����邽�߂ɁA
- <literal>clear()</literal> ��
<literal>evict()</literal> ��ĂԂ��Ƃł��B
- �������A�傫�ȃf�[�^��������K�v������Ȃ�A
- ���Ԃ�X�g�A�h�v���V�[�W����l������ׂ��ł��傤�B
- �������̉���́A<xref linkend="batch"/>
�ŏЉ��Ă��܂��B
- ���[�U�[�Z�b�V�����̊ԁA<literal>Session</literal>
��J�����܂܂ɂ���Ƃ������Ƃ́A
- �f�[�^���V�N�łȂ��Ȃ�m���������Ȃ邱�Ƃ�Ӗ����܂��B
+ <literal>Session</literal>
は永続(persistent)状態のすべてのオブジェクトを
+ キャッシュします(Hibernateは監視し、ダーティ状態かチェックします)。
+ これは、長い間セッションを開いたままにするか、
+ 非常に多くのデータをロードし続けるかした場合は、
+ OutOfMemoryExceptionが発生するまで無限に大きくなることを意味します。
+ 解決策の1つは、<literal>Session</literal> キャッシュを管理するために、
+ <literal>clear()</literal> か
<literal>evict()</literal> を呼ぶことです。
+ しかし、大きなデータを処理する必要があるなら、
+ たぶんストアドプロシージャを考慮するべきでしょう。
+ いくつかの解決策は、<xref linkend="batch"/> で紹介されています。
+ ユーザーセッションの間、<literal>Session</literal>
を開いたままにするということは、
+ データが新鮮でなくなる確率が高くなることを意味します。
</para>
</listitem>
</itemizedlist>
@@ -419,90 +421,90 @@
</sect1>
<sect1 id="transactions-demarcation">
- <title>�f�[�^�x�[�X�g�����U�N�V�������E</title>
+ <title>データベーストランザクション境界</title>
<para>
- �f�[�^�x�[�X�i������̓V�X�e���j�g�����U�N�V�����̋��E�́A��ɕK�v�ł��B
- �f�[�^�x�[�X�g�����U�N�V�����̊O�ŁA�f�[�^�x�[�X�Ƃ̒ʐM�͋N���܂���
- �i����͎����R�~�b�g���[�h�Ɋ���Ă��鑽���̊J���҂��������邩�����܂���j�B
- �ǂݍ��ނ����̑���ɂł�A������m�ȃg�����U�N�V�������E��g�p���Ă��������B
- �������x���ƃf�[�^�x�[�X�̔\�͎���ŁA����͕K�v�Ȃ��������܂��A
- ��Ƀg�����U�N�V�������E���I�Ɏw�肵�Ă�A�}�C�i�X�ʂ͑S������܂���B
+ データベース(もしくはシステム)トランザクションの境界は、常に必要です。
+ データベーストランザクションの外で、データベースとの通信は起きません
+ (これは自動コミットモードに慣れている多くの開発者を混乱させるかもしれません)。
+ 読み込むだけの操作にでも、いつも明確なトランザクション境界を使用してください。
+ 分離レベルとデータベースの能力次第で、これは必要ないかもしれませんが、
+ 常にトランザクション境界を明示的に指定しても、マイナス面は全くありません。
- �m���ɁA�P�̃f�[�^�x�[�X�g�����U�N�V�����͑����̏����ȃg�����U�N�V�������
- �i�f�[�^�̓ǂݍ��݂ł����Ă�j�p�t�H�[�}���X��������Ă��܂��B
+ 確かに、1つのデータベーストランザクションは多数の小さなトランザクションより
+ (データの読み込みであっても)パフォーマンスがすぐれています。
</para>
<para>
- J2EE���ɊǗ�����Ă��Ȃ����
- �i���Ȃ킿�A�X�^���h�A�����A�P����Web��Swing�A�v���P�[�V�����j�ł�A
- �Ǘ����ꂽ��Ԃł�AHibernate�A�v���P�[�V��������s�ł��܂��B
- �Ǘ�����Ă��Ȃ����ł́AHiberante���f�[�^�x�[�X�̃R�l�N�V�����v�[������܂��B
- �A�v���P�[�V�����J���҂́A�g�����U�N�V�������E��蓮�Őݒ肵�Ȃ���Ȃ�܂���B
- ����������ƁA�f�[�^�x�[�X�g�����U�N�V�����̊J�n�A�R�~�b�g�A���[���o�b�N��
- �J���Ҏ��g���ݒ肷��K�v������Ƃ������Ƃł��B
+ J2EE環境に管理されていない状態
+ (すなわち、スタンドアロン、単純なWebやSwingアプリケーション)でも、
+ 管理された状態でも、Hibernateアプリケーションを実行できます。
+ 管理されていない環境では、Hiberanteがデータベースのコネクションプールを提供します。
+ アプリケーション開発者は、トランザクション境界を手動で設定しなければなりません。
+ 言い換えると、データベーストランザクションの開始、コミット、ロールバックを
+ 開発者自身が設定する必要があるということです。
- �ʏ�A�Ǘ����ꂽ���ł́A�R���e�i�Ǘ��ɂ��g�����U�N�V�����iCMT�j������܂��B
- �Ⴆ�A�Z�b�V����Bean�̃f�v���C�����g�f�B�X�N���v�^�Ő錾�I�ɒ�`���A
- �g�����U�N�V������g�ݗ��Ă܂��B
- �v���O�����ɂ��g�����U�N�V�������E�͂���K�v����܂���B
+ 通常、管理された環境では、コンテナ管理によるトランザクション(CMT)が提供されます。
+ 例えば、セッションBeanのデプロイメントディスクリプタで宣言的に定義し、
+ トランザクションを組み立てます。
+ プログラムによるトランザクション境界はもう必要ありません。
</para>
<para>
- �������Ȃ���A�Ǘ�����Ă��Ȃ����\�[�X�E���[�J���Ȋ���
- JTA�Ɉˑ������V�X�e���iCMT�ł͂Ȃ�BMT�j�̗����ɁA
- �i�����w��|�[�^�u���ɕۂ̂́A�����Ζ]�܂������Ƃł��B
+ しかしながら、管理されていないリソース・ローカルな環境と
+ JTAに依存したシステム(CMTではなくBMT)の両方に、
+ 永続化層をポータブルに保つのは、しばしば望ましいことです。
- �f�v���C���̃l�C�e�B�u�̃g�����U�N�V�����V�X�e����Ăяo��
- <literal>Transaction</literal>
�Ƃ������b�p�[API��Hibernate�����܂��B
-
����API��g�����͔C�ӂł����ACMT�̃Z�b�V����Bean��g��Ȃ��̂ł���A�g�����Ƃ����������܂��B
+ デプロイ環境のネイティブのトランザクションシステムを呼び出す
+ <literal>Transaction</literal> というラッパーAPIをHibernateが提供します。
+ このAPIを使うかは任意ですが、CMTのセッションBeanを使わないのであれば、使うことを強く推奨します。
</para>
<para>
- �ʏ�A<literal>Session</literal> �I���́A�S�̈قȂ�t�F�[�Y��܂݂܂��B
+ 通常、<literal>Session</literal> 終了は、4つの異なるフェーズを含みます。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- �Z�b�V�����̃t���b�V��
+ セッションのフラッシュ
</para>
</listitem>
<listitem>
<para>
- �g�����U�N�V�����̃R�~�b�g
+ トランザクションのコミット
</para>
</listitem>
<listitem>
<para>
- �Z�b�V�����̃N���[�Y
+ セッションのクローズ
</para>
</listitem>
<listitem>
<para>
- ��O�̃n���h�����O
+ 例外のハンドリング
</para>
</listitem>
</itemizedlist>
<para>
- �Z�b�V�����̃t���b�V���ɂ��ẮA�O�̂ق��ł��łɋc�_���܂����B
- �Ǘ����ꂽ���ƊǗ�����Ă��Ȃ����̗����ɂ��āA
- �g�����U�N�V�������E�Ɨ�O�n���h�����O�����Əڂ������Ă����܂��傤�B
+ セッションのフラッシュについては、前のほうですでに議論しました。
+ 管理された環境と管理されていない環境の両方について、
+ トランザクション境界と例外ハンドリングをもっと詳しく見ていきましょう。
</para>
<sect2 id="transactions-demarcation-nonmanaged"
revision="2">
- <title>�Ǘ�����Ă��Ȃ���</title>
+ <title>管理されていない環境</title>
<para>
- Hibernate�i�����w��Ǘ�����Ă��Ȃ����Ŏ�������ꍇ�́A
+ Hibernate永続化層を管理されていない環境で実装する場合は、
- �ʏ�P���ȃR�l�N�V�����v�[���i���Ȃ킿DataSource�ł͂Ȃ��j�ɂ���āA
- �f�[�^�x�[�X�R�l�N�V�����𐧌䂵�܂��B
- Hibernate�͂��̃R�l�N�V�����v�[������K�v�ȃR�l�N�V������擾���܂��B
+ 通常単純なコネクションプール(すなわちDataSourceではない)によって、
+ データベースコネクションを制御します。
+ Hibernateはそのコネクションプールから必要なコネクションを取得します。
- �Z�b�V�����^�g�����U�N�V��������̃C�f�B�I���͎��̂悤�ɂȂ�܂��B
+ セッション/トランザクション制御のイディオムは次のようになります。
</para>
<programlisting><![CDATA[// Non-managed environment idiom
@@ -525,21 +527,21 @@
}]]></programlisting>
<para>
- �����I�� <literal>Session</literal> ��
<literal>flush()</literal> ��Ăяo���ׂ��ł͂Ȃ��A
- <literal>commit()</literal>
��Ăяo�����Ƃɂ��A�����I�ɓ��������������s����܂�
- �i�Z�b�V������ <xref
linkend="objectstate-flushing">FlushMode</xref> �Ɉˑ����Ă���j�B
+ 明示的に <literal>Session</literal> の
<literal>flush()</literal> を呼び出すべきではなく、
+ <literal>commit()</literal> を呼び出すことにより、自動的に同期化処理が実行されます
+ (セッションの <xref
linkend="objectstate-flushing">FlushMode</xref> に依存している)。
- <literal>close()</literal>
��Ăяo�����Ƃɂ��A�Z�b�V�����̏I���m�ɂ��܂��B
- <literal>close()</literal> ���ÖٓI�ɍs����Ȃ��Ƃ́A
- �Z�b�V������JDBC�R�l�N�V������J�����邱�Ƃł��B
+ <literal>close()</literal> を呼び出すことにより、セッションの終わりを明確にします。
+ <literal>close()</literal> が暗黙的に行う主なことは、
+ セッションがJDBCコネクションを開放することです。
-
��L��Java�R�[�h�̓|�[�^�u���ł���A�Ǘ�����Ă��Ȃ�����JTA���̗����Ŏ��s�ł��܂��B
+ 上記のJavaコードはポータブルであり、管理されていない環境とJTA環境の両方で実行できます。
</para>
<para>
- ���K�����̂������́AHibernate�ɗ\�ߑg�ݍ��܂�Ă���
- �ucurrent session�v�R���e�L�X�g�Ǘ��ł��B
- ���t�Ő�������艺�L�����ق��������ł��傤�B
+ より適応性のある解決策は、Hibernateに予め組み込まれている
+ 「current session」コンテキスト管理です。
+ 言葉で説明するより下記を見たほうが速いでしょう。
</para>
<programlisting><![CDATA[// Non-managed environment idiom with
getCurrentSession()
@@ -557,43 +559,43 @@
}]]></programlisting>
<para>
- ���K�̃A�v���P�[�V�����̒��ł́A���̂悤�ȃR�[�h�̐�[�����Č��Ȃ��ł��傤�B
- �v���I�ȁi�V�X�e���j��O�́A��Ɂu�ŏ�ʁv�ŃL���b�`���ׂ��ł��B
- ����������A�i�i�����w�ŁjHibernate�Ăяo������s����R�[�h�ƁA
- <literal>RuntimeException</literal> �𐧌䂷��
- �i�ʏ�̓N���[���A�b�v�ƏI���̂ݍs�����Ƃ��ł���j�R�[�h�́A�ʁX�̑w�̒��ɂ���܂��B
- Hibernate�ɂ��J�����g�R���e�L�X�g�Ǘ��́A���̐v���Ȃ�P���ɂ��܂��B
- �K�v�Ȃ̂́A<literal>SessionFactory</literal>
�ɃA�N�Z�X���邱�Ƃ����ł��B
- ��O�����́A���̏͂̌�̂ق��ŋc�_���܂��B
+ 正規のアプリケーションの中では、このようなコードの切れ端を決して見ないでしょう。
+ 致命的な(システム)例外は、常に「最上位」でキャッチすべきです。
+ 言い換えれば、(永続化層で)Hibernate呼び出しを実行するコードと、
+ <literal>RuntimeException</literal> を制御する
+ (通常はクリーンアップと終了のみ行うことができる)コードは、別々の層の中にあります。
+ Hibernateによるカレントコンテキスト管理は、この設計をかなり単純にします。
+ 必要なのは、<literal>SessionFactory</literal> にアクセスすることだけです。
+ 例外処理は、この章の後のほうで議論します。
</para>
<para>
- ���ӁF�i�f�t�H���g�ł����j
+ 注意:(デフォルトですが)
<literal>org.hibernate.transaction.JDBCTransactionFactory</literal>
- ��I����ׂ��ł��B
- ��2�̗p��Ƃ��ẮA
- <literal>hibernate.current_session_context_class</literal>
��
- <literal>"thread"</literal> �Ƃ���Ƃ悢�ł��傤�B
+ を選択するべきです。
+ 第2の用例としては、
+ <literal>hibernate.current_session_context_class</literal> を
+ <literal>"thread"</literal> とするとよいでしょう。
</para>
</sect2>
<sect2 id="transactions-demarcation-jta" revision="3">
- <title>JTA��g�p����</title>
+ <title>JTAを使用する</title>
<para>
-
�i�����w��A�v���P�[�V�����T�[�o�[�i�Ⴆ�AEJB�Z�b�V����Bean�̔w��j�Ŏ��s����ꍇ�A
- Hibernate����擾���邷�ׂẴf�[�^�\�[�X�R�l�N�V�����́A
- �����I�ɃO���[�o��JTA�g�����U�N�V�����̈ꕔ�ɂȂ�܂��B
+ 永続化層をアプリケーションサーバー(例えば、EJBセッションBeanの背後)で実行する場合、
+ Hibernateから取得するすべてのデータソースコネクションは、
+ 自動的にグローバルJTAトランザクションの一部になります。
- EJB��g�킸�ɁA�X�^���h�A������JTA���������邱�Ƃ�ł��܂��B
- JTA�����̂��߂ɁAHibernate�͂Q�̐헪����܂��B
+ EJBを使わずに、スタンドアロンのJTA実装を導入することもできます。
+ JTA統合のために、Hibernateは2つの戦略を提供します。
</para>
<para>
-
Bean�Ǘ��g�����U�N�V�����iBMT�j��g���A<literal>Transaction</literal>
API��g���ꍇ�A
-
Hibernate�̓A�v���P�[�V�����T�[�o�[��BMT�g�����U�N�V�����̊J�n�ƏI�������܂��B
- ���Ȃ킿�A�g�����U�N�V�����Ǘ��̃R�[�h�́A�Ǘ�����Ȃ����Ɠ����ɂȂ�܂��B
+ Bean管理トランザクション(BMT)を使い、<literal>Transaction</literal>
APIを使う場合、
+ HibernateはアプリケーションサーバーにBMTトランザクションの開始と終わりを告げます。
+ すなわち、トランザクション管理のコードは、管理されない環境と同じになります。
</para>
<programlisting><![CDATA[// BMT idiom
@@ -616,9 +618,9 @@
}]]></programlisting>
<para>
- �g�����U�N�V�������E�Ƃ��� <literal>Session</literal>
��g�������ꍇ�A
- �ȒP�ɃR���e�L�X�g��`�d����@�\�ł���
<literal>getCurrentSession()</literal> ������̂ŁA
- JTA�� <literal>UserTransaction</literal>
API�ڎg�p���ׂ��ł��傤�B
+ トランザクション境界として <literal>Session</literal> を使いたい場合、
+ 簡単にコンテキストを伝播する機能である <literal>getCurrentSession()</literal>
があるので、
+ JTAの <literal>UserTransaction</literal> APIを直接使用すべきでしょう。
</para>
<programlisting><![CDATA[// BMT idiom with getCurrentSession()
@@ -640,9 +642,9 @@
}]]></programlisting>
<para>
-
CMT�ł́A�g�����U�N�V�������E��Z�b�V����Bean�̃f�v���C�����g�f�B�X�N���v�^�Œ�`���A
- �v���O�����ł͍s���܂���B
- �䂦�ɁA�R�[�h�͎��̂悤�ɏ��Ȃ��Ȃ�܂��B
+ CMTでは、トランザクション境界をセッションBeanのデプロイメントディスクリプタで定義し、
+ プログラムでは行いません。
+ ゆえに、コードは次のように少なくなります。
</para>
<programlisting><![CDATA[// CMT idiom
@@ -653,121 +655,121 @@
]]></programlisting>
<para>
- CMT/EJB�̒��ł́A��Ƀ��[���o�b�N�������I�Ɏ��{����܂��B
- �Ȃ��Ȃ�A�Z�b�V�����r�[���̃��\�b�h�ɂ�蓊����ꂽ���䂳��Ă��Ȃ�
- <literal>RuntimeException</literal>
�́A�O���[�o���g�����U�N�V������
- ���[���o�b�N����悤�ɃR���e�i�ɓ`���邽�߂ł��B
- <emphasis>����́ABMT�������CMT�Ƃ��������Hibernate
<literal>Transaction</literal>
- API��g���K�v�͏�����Ȃ��Ƃ����Ӗ��ł��B</emphasis>
+ CMT/EJBの中では、常にロールバックが自動的に実施されます。
+ なぜなら、セッションビーンのメソッドにより投げられた制御されていない
+ <literal>RuntimeException</literal> は、グローバルトランザクションを
+ ロールバックするようにコンテナに伝えるためです。
+ <emphasis>これは、BMTもしくはCMTといっしょにHibernate
<literal>Transaction</literal>
+ APIを使う必要は少しもないという意味です。</emphasis>
</para>
<para>
- Hibernate�̃g�����U�N�V�����t�@�N�g����ݒ肷��ۂɁA
- JTA�ڎg���iBMT�́j�ꍇ��
<literal>org.hibernate.transaction.JTATransactionFactory</literal> ��A
- CMT�Z�b�V�����r�[���̒��ł�
<literal>org.hibernate.transaction.CMTTransactionFactory</literal> ��
- �I���ׂ����Ƃ������Ƃɒ��ӂ��Ă��������B
+ Hibernateのトランザクションファクトリを設定する際に、
+ JTAを直接使う(BMTの)場合は
<literal>org.hibernate.transaction.JTATransactionFactory</literal> を、
+ CMTセッションビーンの中では
<literal>org.hibernate.transaction.CMTTransactionFactory</literal> を
+ 選択すべきだということに注意してください。
<literal>hibernate.transaction.manager_lookup_class</literal>
- ��Z�b�g���邱�Ƃ�v���o���Ă��������B
-
�Ȃ��A<literal>hibernate.current_session_context_class</literal> �́A
- �Z�b�g���Ȃ����i����݊��j�A<literal>"jta"</literal>
��Z�b�g�����������B
+ をセットすることも思い出してください。
+ なお、<literal>hibernate.current_session_context_class</literal>
は、
+ セットしないか(後方互換)、<literal>"jta"</literal> をセットしてください。
</para>
<para>
- <literal>getCurrentSession()</literal>
�I�y���[�V�����́AJTA���ł͂P�̌��_�����܂��B
+ <literal>getCurrentSession()</literal>
オペレーションは、JTA環境では1つの欠点を持ちます。
- �f�t�H���g�Ŏg���� <literal>after_statement</literal>
�R�l�N�V���������[�X���[�h��g�p�����ŁA
- �x�����P����܂��B
+ デフォルトで使われる <literal>after_statement</literal>
コネクションリリースモードを使用する上で、
+ 警告が1つあります。
- JTA�d�l�̋��Ȑ���̂��߂ɁA
- <literal>scroll()</literal> �܂���
<literal>iterate()</literal> ���Ԃ����A
- �����Ă��Ȃ� <literal>ScrollableResults</literal> �܂���
<literal>Iterator</literal>
- �C���X�^���X��Hibernate�������I�ɃN���[���A�b�v���邱�Ƃ͂ł��܂���B
+ JTA仕様の愚かな制約のために、
+ <literal>scroll()</literal> または
<literal>iterate()</literal> が返した、
+ 閉じられていない <literal>ScrollableResults</literal> または
<literal>Iterator</literal>
+ インスタンスをHibernateが自動的にクリーンアップすることはできません。
- <literal>finally</literal> �u���b�N�̒��ŁA
- <literal>ScrollableResults.close()</literal> �܂���
- <literal>Hibernate.close(Iterator)</literal> ���I�ɌĂяo���āA
- ���ɐ��f�[�^�x�[�X�J�[�\������
<emphasis>���Ȃ���Ȃ�܂���</emphasis>�B
+ <literal>finally</literal> ブロックの中で、
+ <literal>ScrollableResults.close()</literal> または
+ <literal>Hibernate.close(Iterator)</literal> を明示的に呼び出して、
+ 裏に潜んだデータベースカーソルを解放 <emphasis>しなければなりません</emphasis>。
- �i������A�����̃A�v���P�[�V�����ł́AJTA��CMT�R�[�h��
<literal>scroll()</literal>
- �� <literal>iterate()</literal> �̎g�p�����̂͗e�Ղł��B�j
+ (もちろん、多くのアプリケーションでは、JTAかCMTコードで <literal>scroll()</literal>
+ や <literal>iterate()</literal> の使用を避けるのは容易です。)
</para>
</sect2>
<sect2 id="transactions-demarcation-exceptions">
- <title>��O�n���h�����O</title>
+ <title>例外ハンドリング</title>
<para>
- <literal>Session</literal>
����O�i<literal>SQLException</literal>��܂ށj�𓊂����ꍇ�A
-
�����ɁA�f�[�^�x�[�X�g�����U�N�V�������[���o�b�N���A<literal>Session.close()</literal>
- ��ĂсA<literal>Session</literal> �C���X�^���X��j�����ׂ��ł��B
- <literal>Session</literal> �̂������̃��\�b�h�́A
- �Z�b�V�����̏�Ԃ� <emphasis>���������܂�</emphasis> �ɂ��܂��B
- Hibernate����������O��A�ł����̂Ƃ��Ĉ������Ƃ͂ł��܂���B
- <literal>finally</literal> �u���b�N�̒���
<literal>close()</literal> ��Ă�ŁA
- <literal>Session</literal> ��m���ɕ��Ă��������B
+ <literal>Session</literal>
が例外(<literal>SQLException</literal>を含む)を投げた場合、
+
直ちに、データベーストランザクションをロールバックし、<literal>Session.close()</literal>
+ を呼び、<literal>Session</literal> インスタンスを破棄すべきです。
+ <literal>Session</literal> のいくつかのメソッドは、
+ セッションの状態を <emphasis>矛盾したまま</emphasis> にします。
+ Hibernateが投げた例外を、回復できるものとして扱うことはできません。
+ <literal>finally</literal> ブロックの中で
<literal>close()</literal> を呼んで、
+ <literal>Session</literal> を確実に閉じてください。
</para>
<para>
- <literal>HibernateException</literal>
�́AHibernate�i�����w�̒��Ŕ������鑽���̃G���[��
- ���b�v����A��������Ȃ���O�ł��iHibernate�̌Â��o�[�W�����͈Ⴂ�܂����j�B
- �������̈ӌ��́A�A�v���P�[�V�����J���҂ɉs�\�ȗ�O��
- ���w�ŃL���b�`���邱�Ƃ��v���ׂ��ł͂Ȃ��Ƃ������Ƃł��B
- �����̃V�X�e���ł́A��������Ȃ���O�ƒv���I�ȗ�O�́A
- �R�[���X�^�b�N�̍ŏ��̃t���[���̂P�i�Ⴆ�A�ŏ�ʂ̑w�Łj�Ńn���h�����O���A
- �G���[���b�Z�[�W��A�v���P�[�V�������[�U�[�ɕ\�����܂�
- �i������́A���̓K�ȏ�������{���܂��j�B
- Hibernate�́A<literal>HibernateException</literal>
�ȊO�̌�������Ȃ���O��
- �����邱�Ƃɒ��ӂ��Ă��������B
- ������܂��A�s�\�ł���A�K�ȏ�������{���ׂ��ł��B
+ <literal>HibernateException</literal>
は、Hibernate永続化層の中で発生する多くのエラーを
+ ラップする、検査されない例外です(Hibernateの古いバージョンは違いました)。
+ 私たちの意見は、アプリケーション開発者に回復不可能な例外を
+ 下層でキャッチすることを強要すべきではないということです。
+ 多くのシステムでは、検査されない例外と致命的な例外は、
+ コールスタックの最初のフレームの1つ(例えば、最上位の層で)でハンドリングし、
+ エラーメッセージをアプリケーションユーザーに表示します
+ (もしくは、他の適切な処理を実施します)。
+ Hibernateは、<literal>HibernateException</literal>
以外の検査されない例外も
+ 投げることに注意してください。
+ これらもまた、回復不可能であり、適切な処理を実施すべきです。
</para>
<para>
- Hibernate�́A�f�[�^�x�[�X�Ƃ̑Θb���ɓ�����ꂽ
<literal>SQLException</literal> ��
- <literal>JDBCException</literal> �Ń��b�v���܂��B
- ���́A��O����Ӗ��̂��� <literal>JDBCException</literal>
�̃T�u�N���X��
- �ϊ����悤�Ǝ��݂܂��B
- ���� <literal>SQLException</literal>
�́A<literal>JDBCException.getCause()</literal>
- �ɂ�肢�ł�����܂��B
- Hibernate�́A<literal>SessionFactory</literal> �ɒlj�����Ă���
- <literal>SQLExceptionConverter</literal>
��g���A<literal>SQLException</literal> ��
- �K���� <literal>JDBCException</literal>
�T�u�N���X�ɕϊ����܂��B
- �f�t�H���g�ł́A<literal>SQLExceptionConverter</literal>
�͐ݒ肳��Ă���SQL�����ɂ��
- ��`����܂��B
- ����ŁA�Ǝ��̎����ɍ����ւ��邱�Ƃ�ł��܂�
- �i�ڍׂ́A<literal>SQLExceptionConverterFactory</literal>
�N���X��Javadoc��Q�Ƃ��Ă��������j�B
- �W���I�� <literal>JDBCException</literal>
�̃T�u�^�C�v���L�Ɏ����܂��B
+ Hibernateは、データベースとの対話中に投げられた <literal>SQLException</literal>
を
+ <literal>JDBCException</literal> でラップします。
+ 実は、例外をより意味のある <literal>JDBCException</literal> のサブクラスに
+ 変換しようと試みます。
+ 元の <literal>SQLException</literal>
は、<literal>JDBCException.getCause()</literal>
+ によりいつでも得られます。
+ Hibernateは、<literal>SessionFactory</literal> に追加されている
+ <literal>SQLExceptionConverter</literal>
を使い、<literal>SQLException</literal> を
+ 適当な <literal>JDBCException</literal> サブクラスに変換します。
+ デフォルトでは、<literal>SQLExceptionConverter</literal>
は設定されているSQL方言により
+ 定義されます。
+ 一方で、独自の実装に差し替えることもできます
+ (詳細は、<literal>SQLExceptionConverterFactory</literal>
クラスのJavadocを参照してください)。
+ 標準的な <literal>JDBCException</literal> のサブタイプを下記に示します。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
<literal>JDBCConnectionException</literal> -
- ��b�ƂȂ�JDBC�ʐM�̃G���[��\���܂��B
+ 基礎となるJDBC通信のエラーを表します。
</para>
</listitem>
<listitem>
<para>
<literal>SQLGrammarException</literal> -
- ���s����SQL�̕��@������͍\���̖���\���܂��B
+ 発行するSQLの文法もしくは構文の問題を表します。
</para>
</listitem>
<listitem>
<para>
<literal>ConstraintViolationException</literal> -
- ���炩�̌`���̊��S������ᔽ��\���܂��B
+ 何らかの形式の完全性制約違反を表します。
</para>
</listitem>
<listitem>
<para>
<literal>LockAcquisitionException</literal> -
- �v�����ꂽ�������{����̂ɕK�v�ȃ��b�N���x����ۂ̃G���[��\���܂��B
+ 要求された操作を実施するのに必要なロックレベルを得る際のエラーを表します。
</para>
</listitem>
<listitem>
<para>
<literal>GenericJDBCException</literal> -
- ���̃J�e�S���Ɉ�v���Ȃ�������ʓI�ȗ�O�ł��B
+ 他のカテゴリに一致しなかった一般的な例外です。
</para>
</listitem>
</itemizedlist>
@@ -775,22 +777,22 @@
</sect2>
<sect2 id="transactions-demarcation-timeout">
- <title>�g�����U�N�V�����̃^�C���A�E�g</title>
+ <title>トランザクションのタイムアウト</title>
<para>
- EJB�̂悤�ȊǗ����ꂽ�������邫��߂ďd�v�ȓ����̂P�́A
- �g�����U�N�V�����̃^�C���A�E�g�ł��B
- ����͊Ǘ�����Ă��Ȃ��R�[�h�ɂ͒ł��܂���B
- �g�����U�N�V�����^�C���A�E�g�́A�s�i�s�ȃg�����U�N�V������
- ���[�U�[�Ƀ��X�|���X��Ԃ��Ȃ��܂܁A�������Ƀ��\�[�X��g�������Ȃ�
- ���Ƃ�ۏႵ�܂��B
- �Ǘ����ꂽ���iJTA�j�̊O�ł́AHibernate�͂��̋@�\��t���ɒł��܂���B
- �������Ȃ���AHibernate�͎��̂悤�ȃf�[�^�A�N�Z�X����̐��䂭�炢�͂ł��܂��B
- �f�[�^�x�[�X���x���̃f�b�h���b�N��傫�ȃ��U���g�Z�b�g��Ԃ��N�G����
- ��`���ꂽ�^�C���A�E�g�ɂ���Ċm���ɐ������܂��B
- �Ǘ����ꂽ���ł́AHibernate�̓g�����U�N�V�����^�C���A�E�g��JTA�ɈϏ����܂��B
- ���̋@�\�́AHibernate�� <literal>Transaction</literal>
�I�u�W�F�N�g��
- ����Ē��ۉ�����Ă��܂��B
+ EJBのような管理された環境が提供するきわめて重要な特徴の1つは、
+ トランザクションのタイムアウトです。
+ これは管理されていないコードには提供できません。
+ トランザクションタイムアウトは、不品行なトランザクションが
+ ユーザーにレスポンスを返さないまま、無期限にリソースを使い続けない
+ ことを保障します。
+ 管理された環境(JTA)の外では、Hibernateはこの機能をフルに提供できません。
+ しかしながら、Hibernateは次のようなデータアクセス操作の制御くらいはできます。
+ データベースレベルのデッドロックや大きなリザルトセットを返すクエリを
+ 定義されたタイムアウトによって確実に制限します。
+ 管理された環境では、HibernateはトランザクションタイムアウトをJTAに委譲します。
+ この機能は、Hibernateの <literal>Transaction</literal> オブジェクトに
+ よって抽象化されています。
</para>
<programlisting><![CDATA[
@@ -814,9 +816,9 @@
}]]></programlisting>
<para>
- CMT�r�[���̒��ł� <literal>setTimeout()</literal> ��
- �Ăяo���Ȃ����Ƃɒ��ӂ��Ă��������B
- �g�����U�N�V�����^�C���A�E�g�͐錾�I�ɒ�`�����ׂ��ł��B
+ CMTビーンの中では <literal>setTimeout()</literal> を
+ 呼び出せないことに注意してください。
+ トランザクションタイムアウトは宣言的に定義されるべきです。
</para>
</sect2>
@@ -824,32 +826,32 @@
</sect1>
<sect1 id="transactions-optimistic">
- <title>�y�ϓI�������s����</title>
+ <title>楽観的同時実行制御</title>
<para>
- �������ƍ����X�P�[���r���e�B�̗������������A�v���[�`�́A
- �o�[�W���j���O��g�����y�ϓI�������s����݂̂ł��B
- �X�V�̏Փ˂����邽�߂Ɂi����сA�X�V��������̂�h�����߂Ɂj�A
- �o�[�W�����ԍ�������̓^�C���X�^���v��g���āA�o�[�W������`�F�b�N���܂��B
- Hibernate�́A�y�ϓI�������s��s���A�v���P�[�V�����R�[�h�������߂�
- �A�v���[�`��R���܂��B
- �������������郆�[�X�P�[�X�́A�����Θb�����܂����A
- �o�[�W�����`�F�b�N�͂܂��P�̃f�[�^�x�[�X�g�����U�N�V�����̒��ōX�V�������Ƃ�h��
- ���_������Ă��܂��B
+ 高い並列性と高いスケーラビリティの両方を実現するアプローチは、
+ バージョニングを使った楽観的同時実行制御のみです。
+ 更新の衝突を見つけるために(および、更新が失われるのを防ぐために)、
+ バージョン番号もしくはタイムスタンプを使って、バージョンをチェックします。
+ Hibernateは、楽観的同時実行を行うアプリケーションコードを書くための
+ アプローチを3つ提供します。
+ 私たちが見せるユースケースは、長い対話を持ちますが、
+ バージョンチェックはまだ1つのデータベーストランザクションの中で更新を失うことを防ぐ
+ 利点も持っています。
</para>
<sect2 id="transactions-optimistic-manual">
- <title>�A�v���P�[�V�����ɂ��o�[�W�����`�F�b�N</title>
+ <title>アプリケーションによるバージョンチェック</title>
<para>
- Hibernate�ɂقƂ�Ǐ����Ă��킸�Ɏ�������P�[�X�ł��B
- �f�[�^�x�[�X�Ƃ̂����́A���ꂼ��V���� <literal>Session</literal>
�̒��ŋN����܂��B
- �J���҂́A���ׂẲi�����C���X�^���X�𑀍삷��O�ɁA
- �f�[�^�x�[�X����ēǂݍ��݂���Ӗ�������܂��B
- ���̃A�v���[�`�ł́A�Θb�g�����U�N�V�����̕������邽�߂ɁA
- �A�v���P�[�V�������g���o�[�W�����`�F�b�N��s���K�v������܂��B
- ���̃A�v���[�`�́A�f�[�^�x�[�X�A�N�Z�X�̒��ł́A�ł������ł��B
- �G���e�B�e�BEJB�ƍł���Ă���A�v���[�`�ł��B
+ Hibernateにほとんど助けてもらわずに実装するケースです。
+ データベースとのやり取りは、それぞれ新しい <literal>Session</literal> の中で起こります。
+ 開発者は、すべての永続性インスタンスを操作する前に、
+ データベースから再読み込みする責務があります。
+ このアプローチでは、対話トランザクションの分離を守るために、
+ アプリケーション自身がバージョンチェックを行う必要があります。
+ このアプローチは、データベースアクセスの中では、最も非効率です。
+ エンティティEJBと最も似ているアプローチです。
</para>
<programlisting><![CDATA[// foo is an instance loaded by a previous
Session
@@ -865,54 +867,54 @@
session.close();]]></programlisting>
<para>
- <literal><version></literal>
��g���āA<literal>version</literal>
- �v���p�e�B��}�b�s���O���܂��B
- Hibernate�́A�G���e�B�e�B���_�[�e�B�ł���ꍇ�A�t���b�V�����A
- ���̊Ԃ� <literal>version</literal>
�v���p�e�B�����I�ɃC���N�������g���܂��B
+ <literal><version></literal>
を使って、<literal>version</literal>
+ プロパティをマッピングします。
+ Hibernateは、エンティティがダーティである場合、フラッシュし、
+ その間に <literal>version</literal> プロパティを自動的にインクリメントします。
</para>
<para>
- ������A�f�[�^�̕����Ⴂ���ʼn^�p���Ă���A�o�[�W�����`�F�b�N���s�v�Ȃ�A
- ���̃A�v���[�`��g���A�o�[�W�����`�F�b�N��X�L�b�v���邾���ł��B
- ���̏ꍇ�́A�����Θb�ɂ́A
- <emphasis>�u�Ō�ɃR�~�b�g������̂����v</emphasis>
���f�t�H���g�̐헪�ł��傤�B
- ���̃A�v���[�`�́A�A�v���P�[�V�����̃��[�U�[���������邩�����Ȃ����Ƃ�
- �S�ɗ��߂Ēu���Ă��������B����́A�G���[���b�Z�[�W�⋣�������ύX��}�[�W����@�
- �Ȃ��܂܁A�X�V�����o�����邽�߂ł��B
+ もちろん、データの並列性が低い環境で運用しており、バージョンチェックが不要なら、
+ このアプローチを使い、バージョンチェックをスキップするだけです。
+ その場合は、長い対話には、
+ <emphasis>「最後にコミットしたものが勝つ」</emphasis> がデフォルトの戦略でしょう。
+ このアプローチは、アプリケーションのユーザーを混乱させるかもしれないことを
+ 心に留めて置いてください。それは、エラーメッセージや競合した変更をマージする機会が
+ ないまま、更新を失う経験をするためです。
</para>
<para>
- �m���ɁA�}�j���A���ɂ��o�[�W�����`�F�b�N�́A���ׂȋV�������Ŏ��s�ł��܂����A
- �����̃A�v���P�[�V�����ɂƂ��Ď��p�I�ł͂���܂���B
- �����A�P�̃C���X�^���X�����łȂ��A
- �C�����ꂽ�I�u�W�F�N�g�̊��S�ȃO���t��`�F�b�N���Ȃ���Ȃ�܂���B
- Hibernate�́A�v�p���_�C���Ƃ��āA�g��
<literal>Session</literal> ��
- �������ꂽ�C���X�^���X�����I�Ƀo�[�W�����`�F�b�N���܂��B
+ 確かに、マニュアルによるバージョンチェックは、些細な儀式だけで実行できますが、
+ 多くのアプリケーションにとって実用的ではありません。
+ しばしば、1つのインスタンスだけでなく、
+ 修正されたオブジェクトの完全なグラフをチェックしなければなりません。
+ Hibernateは、設計パラダイムとして、拡張 <literal>Session</literal> か
+ 分離されたインスタンスを自動的にバージョンチェックします。
</para>
</sect2>
<sect2 id="transactions-optimistic-longsession">
- <title>�g���Z�b�V�����Ǝ����o�[�W���j���O</title>
+ <title>拡張セッションと自動バージョニング</title>
<para>
- �P�� <literal>Session</literal>
�C���X�^���X�Ƃ��̉i�����C���X�^���X�́A
- <emphasis>session-per-conversation</emphasis> �Ƃ��Ēm����A
- �Θb�S�̂Ŏg���܂��B
- Hibernate�̓t���b�V������ۂɁA�C���X�^���X�̃o�[�W������`�F�b�N���܂��B
- �����ɏC�����ꂽ���Ƃ��o����ƁA��O�𓊂��܂��B
- ���̗�O��L���b�`���Ĉ����̂́A�J���҂̐ӔC�ł�
- �i��ʓI�ȑI���́A�ύX��}�[�W���邩�Â��Ȃ��f�[�^�Ńr�W�l�X�Θb��
- �ăX�^�[�g����@����[�U�[�ɒ��邱�Ƃł��j�B
+ 1つの <literal>Session</literal> インスタンスとその永続性インスタンスは、
+ <emphasis>session-per-conversation</emphasis> として知られる、
+ 対話全体で使われます。
+ Hibernateはフラッシュする際に、インスタンスのバージョンをチェックします。
+ 同時に修正されたことを検出すると、例外を投げます。
+ この例外をキャッチして扱うのは、開発者の責任です
+ (一般的な選択肢は、変更をマージするか古くないデータでビジネス対話を
+ 再スタートする機会をユーザーに提供することです)。
</para>
<para>
- ���[�U�[�̑Θb��҂��Ă���Ƃ��́A
- <literal>Session</literal>
���b�ƂȂ�JDBC�R�l�N�V��������藣���܂��B
- ���̃A�v���[�`�́A�f�[�^�x�[�X�A�N�Z�X�̒��ł́A�ł�����I�ł��B
- �A�v���P�[�V�����́A�o�[�W�����`�F�b�N�╪�����ꂽ�C���X�^���X��Ēlj����邱��
- �ɊS���K�v�͂���܂���B�܂��A������f�[�^�x�[�X�g�����U�N�V�����̒���
- �C���X�^���X��ēǂݍ��݂���K�v�͂���܂���B
+ ユーザーの対話を待っているときは、
+ <literal>Session</literal> を基礎となるJDBCコネクションから切り離します。
+ このアプローチは、データベースアクセスの中では、最も効率的です。
+ アプリケーションは、バージョンチェックや分離されたインスタンスを再追加すること
+ に関心を持つ必要はありません。また、あらゆるデータベーストランザクションの中で
+ インスタンスを再読み込みする必要はありません。
</para>
<programlisting><![CDATA[// foo is an instance loaded earlier by the
old session
@@ -925,74 +927,74 @@
session.close(); // Only for last transaction in
conversation]]></programlisting>
<para>
- <literal>foo</literal> �I�u�W�F�N�g�́A�������[�h����
<literal>Session</literal>
- ��܂��m���Ă��܂��B
- �Â��Z�b�V�����̏�ŐV�����f�[�^�x�[�X�g�����U�N�V������J�n���邱�ƂŁA
- �V�����R�l�N�V������擾���A���̃Z�b�V�������ĊJ����܂��B
- �f�[�^�x�[�X�g�����U�N�V������R�~�b�g���邱�ƂŁA
- �Z�b�V��������JDBC�R�l�N�V������ؒf���A�R�l�N�V������v�[���ɕԂ��܂��B
- �Đڑ�������A�X�V���Ă��Ȃ��f�[�^�̃o�[�W�����`�F�b�N�������邽�߂ɁA
- ���̃g�����U�N�V�����ɂ��X�V����Ă��邩�����Ȃ��I�u�W�F�N�g�Ɋւ��āA
- <literal>LockMode.READ</literal> �����
<literal>Session.lock()</literal>
- ��Ăяo�����Ƃ��ł��܂��B
- �X�V���� <emphasis>����</emphasis>
�f�[�^���b�N����K�v�͂���܂���B
+ <literal>foo</literal> オブジェクトは、自分をロードした
<literal>Session</literal>
+ をまだ知っています。
+ 古いセッションの上で新しいデータベーストランザクションを開始することで、
+ 新しいコネクションを取得し、そのセッションが再開されます。
+ データベーストランザクションをコミットすることで、
+ セッションからJDBCコネクションを切断し、コネクションをプールに返します。
+ 再接続した後、更新していないデータのバージョンチェックを強制するために、
+ 他のトランザクションにより更新されているかもしれないオブジェクトに関して、
+ <literal>LockMode.READ</literal> をつけて
<literal>Session.lock()</literal>
+ を呼び出すことができます。
+ 更新して <emphasis>いる</emphasis> データをロックする必要はありません。
- �ʏ�A�g�� <literal>Session</literal> ��
<literal>FlushMode.MANUAL</literal>
- ��Z�b�g���܂��B
- �Ō�̃f�[�^�x�[�X�g�����U�N�V�����̎����ł̂݁A
- �Θb�̒��ŕύX���ꂽ���ׂĂ���ۂɉi���������邽�߂ł��B
- �䂦�ɁA�Ō�̃f�[�^�x�[�X�g�����U�N�V�����̂�
<literal>flush()</literal>
- �I�y���[�V������܂݂܂��B�����āA�Θb��I��点�邽�߂ɁA
- �Z�b�V������ <literal>close()</literal> ���܂��B
+ 通常、拡張 <literal>Session</literal> に
<literal>FlushMode.MANUAL</literal>
+ をセットします。
+ 最後のデータベーストランザクションの周期でのみ、
+ 対話の中で変更されたすべてを実際に永続化させるためです。
+ ゆえに、最後のデータベーストランザクションのみ <literal>flush()</literal>
+ オペレーションを含みます。そして、対話を終わらせるために、
+ セッションも <literal>close()</literal> します。
</para>
<para>
- ���[�U�[���l�����ɁA�i�[���邱�Ƃ��ł��Ȃ����炢
<literal>Session</literal>
- ���傫���̂ł���A���̃p�^�[���͖�肪����܂��B
- �Ⴆ�A<literal>HttpSession</literal> �͉\�Ȍ��菬�����ۂׂ��ł��B
- <literal>Session</literal> �́i�����I�Ɂj�P���L���b�V���ł����A
- ���[�h�����I�u�W�F�N�g���ׂĕێ����܂��B
- �����炭�A���N�G�X�g�^���X�|���X�̃T�C�N��������ł���A���̐헪���g���܂��B
+ ユーザーが考慮中に、格納することができないくらい <literal>Session</literal>
+ が大きいのであれば、このパターンは問題があります。
+ 例えば、<literal>HttpSession</literal> は可能な限り小さく保つべきです。
+ <literal>Session</literal> は(強制的に)1次キャッシュでもあり、
+ ロードしたオブジェクトをすべて保持します。
+ おそらく、リクエスト/レスポンスのサイクルが数回であれば、この戦略が使えます。
- �P�̑Θb�̂��߂����� <literal>Session</literal> ��g���ׂ��ł��B
- �Ȃ��Ȃ�A�����ɐV�N�łȂ��f�[�^�����߂ł��B
+ 1つの対話のためだけに <literal>Session</literal> を使うべきです。
+ なぜなら、すぐに新鮮でないデータを持つためです。
</para>
<para>
- �iHibernate�̈ȑO�̃o�[�W�����́A�����I��
<literal>Session</literal> ��
- �ؒf�ƍĐڑ����K�v���������Ƃɒ��ӂ��Ă��������B
- �����̃��\�b�h�͔��ɂȂ�܂����B
- �Ȃ��Ȃ�A�g�����U�N�V�����̊J�n�ƏI���͓������ʂ����邽�߂ł��B�j
+ (Hibernateの以前のバージョンは、明示的な <literal>Session</literal> の
+ 切断と再接続が必要だったことに注意してください。
+ これらのメソッドは非推奨になりました。
+ なぜなら、トランザクションの開始と終了は同じ効果があるためです。)
</para>
<para>
- �ؒf���� <literal>Session</literal>
��i�����w�̋߂��ŕێ����ׂ��ł��邱�Ƃ�
- ���ӂ��Ă��������B
- ����������ƁA�R�w���̒��� <literal>Session</literal>
��ێ����邽�߂ɁA
- EJB�X�e�[�g�t���Z�b�V����Bean��g�����������B
- <literal>HttpSession</literal>
�Ɋi�[���邽�߂ɁAWeb�w�ɓ]�����Ȃ��ł�������
- �i�ʂ̑w�ւ̃V���A���C�Y����Ȃ��ł��������j�B
+ 切断した <literal>Session</literal> を永続化層の近くで保持すべきであることに
+ 注意してください。
+ 言い換えると、3層環境の中で <literal>Session</literal> を保持するために、
+ EJBステートフルセッションBeanを使ってください。
+ <literal>HttpSession</literal> に格納するために、Web層に転送しないでください
+ (別の層へのシリアライズもしないでください)。
</para>
<para>
-
�g���Z�b�V�����p�^�[���i������́A<emphasis>session-per-conversation</emphasis>�j�́A
- �����I�ȃJ�����g�Z�b�V�����R���e�L�X�g�Ǘ�����{���������B
- ���̂��߂ɁA���Ȃ��� <literal>CurrentSessionContext</literal>
�̎�����������K�v������܂��B
- Hibernate Wiki�ɂ�����Q�Ƃ��Ă��������B
+
拡張セッションパターン(もしくは、<emphasis>session-per-conversation</emphasis>)は、
+ 自動的なカレントセッションコンテキスト管理を実施するより難しい。
+ このために、あなたは <literal>CurrentSessionContext</literal>
の実装を供給する必要があります。
+ Hibernate Wikiにある例を参照してください。
</para>
</sect2>
<sect2 id="transactions-optimistic-detached">
- <title>�f�^�b�`���ꂽ�I�u�W�F�N�g�Ǝ����o�[�W���j���O</title>
+ <title>デタッチされたオブジェクトと自動バージョニング</title>
<para>
- �V����
<literal>Session</literal>�ɂ��A�i�����X�g�A�i�F�c�a�j�Ƃ̑Θb���������܂��B
- �܂�����A�����i�����C���X�^���X���A�f�[�^�x�[�X�Ƃ̑Θb���Ƃɍė��p����܂��B
- �A�v���P�[�V�����́A���X�͑��� <literal>Session</literal>
���[�h����A
- �f�^�b�`���ꂽ�C���X�^���X�̏�Ԃ𑀍삵�܂��B
- �����āA<literal>Session.update()</literal>
������́A<literal>Session.saveOrUpdate()</literal>�A
- <literal>Session.merge()</literal>
��g���āA�����̃C���X�^���X��Ēlj����܂��B
+ 新しい <literal>Session</literal>により、永続化ストア(訳注:DB)との対話が発生します。
+ また一方、同じ永続性インスタンスが、データベースとの対話ごとに再利用されます。
+ アプリケーションは、元々は他の <literal>Session</literal> でロードされ、
+ デタッチされたインスタンスの状態を操作します。
+ そして、<literal>Session.update()</literal>
もしくは、<literal>Session.saveOrUpdate()</literal>、
+ <literal>Session.merge()</literal> を使って、それらのインスタンスを再追加します。
</para>
<programlisting><![CDATA[// foo is an instance loaded by a previous
Session
@@ -1004,66 +1006,66 @@
session.close();]]></programlisting>
<para>
-
���̏ꍇ���͂�AHibernate�̓t���b�V������ۂɁA�C���X�^���X�̃o�[�W������`�F�b�N���܂��B
- �X�V�̋��������������ꍇ�ɂ́A��O�𓊂��܂��B
+ この場合もやはり、Hibernateはフラッシュする際に、インスタンスのバージョンをチェックします。
+ 更新の競合が発生した場合には、例外を投げます。
</para>
<para>
- �I�u�W�F�N�g���C������Ă��Ȃ����Ƃ�m�M���Ă���ꍇ�́A
- <literal>update()</literal>
�̑���ɁA<literal>LockMode.READ</literal> ��g���āA
- <literal>lock()</literal> ��Ăяo�����Ƃ�ł��܂�
- �i���ׂẴL���b�V����I�A�o�[�W�����`�F�b�N����{���܂��j�B
+ オブジェクトが修正されていないことを確信している場合は、
+ <literal>update()</literal>
の代わりに、<literal>LockMode.READ</literal> を使って、
+ <literal>lock()</literal> を呼び出すこともできます
+ (すべてのキャッシュを迂回し、バージョンチェックを実施します)。
</para>
</sect2>
<sect2 id="transactions-optimistic-customizing">
- <title>�����o�[�W���j���O�̃J�X�^�}�C�Y</title>
+ <title>自動バージョニングのカスタマイズ</title>
<para>
- �}�b�s���O�� <literal>optimistic-lock</literal> ������
<literal>false</literal>
- ��ݒ肷�邱�Ƃɂ��A����̃v���p�e�B��R���N�V�����̂��߂�
- �����o�[�W�����C���N�������g���ɂł��܂��B
- �v���p�e�B���_�[�e�B�ł����Ă�A�o�[�W������C���N�������g���܂���B
+ マッピングの <literal>optimistic-lock</literal> 属性に
<literal>false</literal>
+ を設定することにより、特定のプロパティやコレクションのために
+ 自動バージョンインクリメントを無効にできます。
+ プロパティがダーティであっても、バージョンをインクリメントしません。
</para>
<para>
- ���K�V�[�̃f�[�^�x�[�X�X�L�[�}�́A�����ΌŒ�I�ł���A�ύX�ł��܂���B
- �܂��́A���̃A�v���P�[�V�����������f�[�^�x�[�X�ɃA�N�Z�X���Ȃ���Ȃ炸�A
- ���̃A�v���P�[�V�����̓o�[�W�����ԍ���^�C���X�^���v�������삷����@��m��܂���B
- �ǂ���̏ꍇ��A�e�[�u���̓���̃J�����Ăɂ��āA�o�[�W���j���O��s���܂���B
-
�o�[�W������^�C���X�^���v�̃v���p�e�B��}�b�s���O�����ɁA�o�[�W�����`�F�b�N�����邽�߂ɁA
- <literal><class></literal> �}�b�s���O��
<literal>optimistic-lock="all"</literal> ��
- �w�肵�Ă��������B
- �s�̂��ׂẴt�B�[���h�̏�Ԃ��r����悤�ɂȂ�܂��B
- ����́AHibernate���Â���ԂƐV������Ԃ��r�ł���ꍇ�ɁA
- ���_�I�ɓ��삷�邾���ł��邱�Ƃɒ��ӂ��Ă��������B
- �Ⴆ�Asession-per-request-with-detached-objects �ł͂Ȃ��A
- �P�̒��� <literal>Session</literal> ��g���ꍇ�ł��B
+ レガシーのデータベーススキーマは、しばしば固定的であり、変更できません。
+ または、他のアプリケーションが同じデータベースにアクセスしなければならず、
+ そのアプリケーションはバージョン番号やタイムスタンプさえ操作する方法を知りません。
+ どちらの場合も、テーブルの特定のカラムを当てにして、バージョニングを行えません。
+ バージョンやタイムスタンプのプロパティをマッピングせずに、バージョンチェックさせるために、
+ <literal><class></literal> マッピングに
<literal>optimistic-lock="all"</literal> を
+ 指定してください。
+ 行のすべてのフィールドの状態を比較するようになります。
+ これは、Hibernateが古い状態と新しい状態を比較できる場合に、
+ 理論的に動作するだけであることに注意してください。
+ 例えば、session-per-request-with-detached-objects ではなく、
+ 1つの長い <literal>Session</literal> を使う場合です。
</para>
<para>
- �Ƃ��ǂ��A�s��ꂽ�ύX���d�Ȃ�Ȃ�����A�����ɍs��ꂽ�ύX�����邱�Ƃ��ł��܂��B
- <literal><class></literal> �}�b�s���O��
<literal>optimistic-lock="dirty"</literal>
- ��ݒ肵���ꍇ�A�t���b�V������ۂɁAHibernate�̓_�[�e�B�t�B�[���h�݂̂��r���܂��B
+ ときどき、行われた変更が重ならない限り、同時に行われた変更を受け入れることができます。
+ <literal><class></literal> マッピングに
<literal>optimistic-lock="dirty"</literal>
+ を設定した場合、フラッシュする際に、Hibernateはダーティフィールドのみを比較します。
</para>
<para>
- ��p�̃o�[�W�����^�^�C���X�^���v�̃J������g���ꍇ�A
- ������͂��ׂā^�_�[�e�B�̃t�B�[���h���r����ꍇ�ǂ���ł����Ă�A
- Hibernate�̓G���e�B�e�B���Ƃ�1�� <literal>UPDATE</literal>
����
- �i�K�� <literal>WHERE</literal> �߂Ƌ��Ɂj�g���A
- �o�[�W�����`�F�b�N�Ə��̍X�V��s���܂��B
- �֘A����G���e�B�e�B�̍Ēlj���J�X�P�[�h���邽�߂ɁA
- �A���I�ȉi������g�p�����ꍇ�A�s�K�v�ȍX�V����s���邩�����܂���B
- ����͒ʏ���ɂȂ�܂���B
- �������A���������C���X�^���X��ύX���Ă��Ȃ��Ƃ�A
- �f�[�^�x�[�X�� <emphasis>on update</emphasis>
�g���K�[�����s����邩�����܂���B
- <literal><class></literal> �}�b�s���O��
- <literal>select-before-update="true"</literal>
��ݒ肷�邱�Ƃɂ���āA
- ���̐U�镑����J�X�^�}�C�Y�ł��܂��B
- �m���ɕύX���ꂽ����m�F���邽�߂ɁA�s��X�V����O�ɁA
- �K���C���X�^���X�� <literal>SELECT</literal> ���܂��B
+ 専用のバージョン/タイムスタンプのカラムを使う場合、
+ もしくはすべて/ダーティのフィールドを比較する場合どちらであっても、
+ Hibernateはエンティティごとに1つの <literal>UPDATE</literal> 文を
+ (適切な <literal>WHERE</literal> 節と共に)使い、
+ バージョンチェックと情報の更新を行います。
+ 関連するエンティティの再追加をカスケードするために、
+ 連鎖的な永続化を使用した場合、不必要な更新を実行するかもしれません。
+ これは通常問題になりません。
+ しかし、分離したインスタンスを変更していなくとも、
+ データベースの <emphasis>on update</emphasis> トリガーが実行されるかもしれません。
+ <literal><class></literal> マッピングに
+ <literal>select-before-update="true"</literal>
を設定することによって、
+ この振る舞いをカスタマイズできます。
+ 確実に変更されたかを確認するために、行を更新する前に、
+ 必ずインスタンスを <literal>SELECT</literal> します。
</para>
</sect2>
@@ -1071,202 +1073,202 @@
</sect1>
<sect1 id="transactions-locking">
- <title>�ߊϓI���b�N</title>
+ <title>悲観的ロック</title>
<para>
- ���[�U�����b�N�헪�ɔY�ނ̂ɑ����̎��Ԃ��₷���Ƃ�Ӑ}���Ă��܂���B
- �ʏ�́AJDBC�R�l�N�V�����ɕ������x����w�肵�A
- �P�Ƀf�[�^�x�[�X�ɂ��ׂĂ̎d��������Ώ\���ł��B
- �������Ȃ���A���x�ȃ��[�U�́A�r���I�ȔߊϓI���b�N��l�����邱�Ƃ��A
- �V�����g�����U�N�V�������J�n�����ۂɃ��b�N��Ċl�����邱�Ƃ�
- �Ƃ��ǂ��]�ނ������܂���B
+ ユーザがロック戦略に悩むのに多くの時間を費やすことを意図していません。
+ 通常は、JDBCコネクションに分離レベルを指定し、
+ 単にデータベースにすべての仕事をさせれば十分です。
+ しかしながら、高度なユーザは、排他的な悲観的ロックを獲得することか、
+ 新しいトランザクションが開始される際にロックを再獲得することを
+ ときどき望むかもしれません。
</para>
<para>
- Hibernate�͂���f�[�^�x�[�X�̃��b�N�̎d�g�݂�g���܂��B
- ��������̃I�u�W�F�N�g�����ă��b�N���܂���I
+ Hibernateはいつもデータベースのロックの仕組みを使います。
+ メモリ内のオブジェクトを決してロックしません!
</para>
<para>
- <literal>LockMode</literal>
�N���X�́AHibernate���l���ł���قȂ郍�b�N���x�����`���܂��B
- �ȉ��̎d�g�݂ɂ��A���b�N��l���ł��܂��B
+ <literal>LockMode</literal> クラスは、Hibernateが獲得できる異なるロックレベルを定義します。
+ 以下の仕組みにより、ロックを獲得できます。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>LockMode.WRITE</literal> �́A
- Hibernate���s��X�V������͑}������ۂɎ����I�ɓ����܂��B
+ <literal>LockMode.WRITE</literal> は、
+ Hibernateが行を更新もしくは挿入する際に自動的に得られます。
</para>
</listitem>
<listitem>
<para>
- <literal>LockMode.UPGRADE</literal> �́A
- �f�[�^�x�[�X�ŃT�|�[�g����Ă��镶�@ <literal>SELECT ... FOR
UPDATE</literal>
- ��g�����A�����I�ȃ��[�U�[�v���ɂ�蓾���邩�����܂���B
+ <literal>LockMode.UPGRADE</literal> は、
+ データベースでサポートされている文法 <literal>SELECT ... FOR
UPDATE</literal>
+ を使った、明示的なユーザー要求により得られるかもしれません。
</para>
</listitem>
<listitem>
<para>
- <literal>LockMode.UPGRADE_NOWAIT</literal> �́A
- Oracle �� <literal>SELECT ... FOR UPDATE NOWAIT</literal>
��g�����A
- �����I�ȃ��[�U�[�v���ɂ�蓾���邩�����܂���B
+ <literal>LockMode.UPGRADE_NOWAIT</literal> は、
+ Oracle で <literal>SELECT ... FOR UPDATE NOWAIT</literal>
を使った、
+ 明示的なユーザー要求により得られるかもしれません。
</para>
</listitem>
<listitem>
<para>
- <literal>LockMode.READ</literal> �́A
- Repeatable
Read�������Serializable�̕������x���ŁA�f�[�^��ǂۂɎ����I�ɓ����܂��B
- �����炭�A�����I�ȃ��[�U�[�v���ɂ��A�Ď擾����܂��B
+ <literal>LockMode.READ</literal> は、
+ Repeatable ReadもしくはSerializableの分離レベルで、データを読んだ際に自動的に得られます。
+ おそらく、明示的なユーザー要求により、再取得されます。
</para>
</listitem>
<listitem>
<para>
- <literal>LockMode.NONE</literal> �́A���b�N���Ȃ����Ƃ�\���܂��B
- <literal>Transaction</literal> �̏I���ɁA
- ���ׂẴI�u�W�F�N�g�͂��̃��b�N���[�h�ɐ�ւ��܂��B
- <literal>update()</literal> ��
<literal>saveOrUpdate()</literal> ��Ăяo�����Ƃɂ���āA
- �Z�b�V�����Ɋ֘A�t����ꂽ�I�u�W�F�N�g��A���̃��b�N���[�h�ŏo�����܂��B
+ <literal>LockMode.NONE</literal> は、ロックしないことを表します。
+ <literal>Transaction</literal> の終わりに、
+ すべてのオブジェクトはこのロックモードに切り替わります。
+ <literal>update()</literal> や
<literal>saveOrUpdate()</literal> を呼び出すことによって、
+ セッションに関連付けられたオブジェクトも、このロックモードで出発します。
</para>
</listitem>
</itemizedlist>
<para>
- �u�����I�ȃ��[�U�[�v���v�Ƃ́A���L�̕��@�̂P�Ō����\���܂��B
+ 「明示的なユーザー要求」とは、下記の方法の1つで言い表せます。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>LockMode</literal> ��w�肵��
<literal>Session.load()</literal> �̌Ăяo���B
+ <literal>LockMode</literal> を指定した
<literal>Session.load()</literal> の呼び出し。
</para>
</listitem>
<listitem>
<para>
- <literal>Session.lock()</literal> �̌Ăяo���B
+ <literal>Session.lock()</literal> の呼び出し。
</para>
</listitem>
<listitem>
<para>
- <literal>Query.setLockMode()</literal> �̌Ăяo���B
+ <literal>Query.setLockMode()</literal> の呼び出し。
</para>
</listitem>
</itemizedlist>
<para>
- <literal>UPGRADE</literal> �������
<literal>UPGRADE_NOWAIT</literal> ���w�肳�ꂽ
- <literal>Session.load()</literal> ���Ăяo����A
- ���v�����ꂽ�I�u�W�F�N�g���Z�b�V�����ɂ���Ă܂����[�h����Ă��Ȃ������ꍇ�́A
- <literal>SELECT ... FOR UPDATE</literal>
��g���āA�I�u�W�F�N�g�����[�h����܂��B
- <literal>load()</literal> �ŌĂяo���ꂽ�I�u�W�F�N�g���A
- �v������Ă����萧�������Ȃ����b�N�ł��łɃ��[�h����Ă����ꍇ�́A
- Hibernate�͂��̃I�u�W�F�N�g�̂��߂ɁA<literal>lock()</literal>
��Ăяo���܂��B
+ <literal>UPGRADE</literal> もしくは
<literal>UPGRADE_NOWAIT</literal> が指定された
+ <literal>Session.load()</literal> が呼び出され、
+ かつ要求されたオブジェクトがセッションによってまだロードされていなかった場合は、
+ <literal>SELECT ... FOR UPDATE</literal> を使って、オブジェクトがロードされます。
+ <literal>load()</literal> で呼び出されたオブジェクトが、
+ 要求されているより制限が少ないロックですでにロードされていた場合は、
+ Hibernateはそのオブジェクトのために、<literal>lock()</literal> を呼び出します。
</para>
<para>
- �w�肳�ꂽ���b�N���[�h�� <literal>READ</literal>
������́A<literal>UPGRADE</literal>�A
- <literal>UPGRADE_NOWAIT</literal>
�������ꍇ�A<literal>Session.lock()</literal>
- �́A�o�[�W�����ԍ��̃`�F�b�N����{���܂��B
- �i<literal>UPGRADE</literal> �������
<literal>UPGRADE_NOWAIT</literal> �̏ꍇ�A
- <literal>SELECT ... FOR UPDATE</literal> ���g���܂��B�j
+ 指定されたロックモードが <literal>READ</literal>
もしくは、<literal>UPGRADE</literal>、
+ <literal>UPGRADE_NOWAIT</literal>
だった場合、<literal>Session.lock()</literal>
+ は、バージョン番号のチェックを実施します。
+ (<literal>UPGRADE</literal> もしくは
<literal>UPGRADE_NOWAIT</literal> の場合、
+ <literal>SELECT ... FOR UPDATE</literal> が使われます。)
</para>
<para>
- �f�[�^�x�[�X���v�����ꂽ���b�N���[�h��T�|�[�g���Ă��Ȃ��ꍇ�A
- Hibernate�́i��O�𓊂������ɁA�j�K�ȑ���̃��[�h��g���܂��B
- ����́A�A�v���P�[�V�������|�[�^�u���ł��邱�Ƃ�ۏ��܂��B
+ データベースが要求されたロックモードをサポートしていない場合、
+ Hibernateは(例外を投げる代わりに、)適切な代わりのモードを使います。
+ これは、アプリケーションがポータブルであることを保証します。
</para>
</sect1>
<sect1 id="transactions-connection-release">
- <title>�R�l�N�V�����J�����[�h</title>
+ <title>コネクション開放モード</title>
<para>
- Hibernate�̃��K�V�[�i2.x�j��JDBC�R�l�N�V�����Ǘ��Ɋւ���U�镑���́A
- �ŏ��ɕK�v�Ƃ����ۂ� <literal>Session</literal>
���R�l�N�V������Ƃ�����̂ł����B
- �����āA�Z�b�V������������܂ŁA���̃R�l�N�V������ێ����܂����B
- Hibernate 3.x�́A�Z�b�V������JDBC�R�l�N�V������ǂ̂悤�ɐ��䂷�邩��`����
- �R�l�N�V�����J�����[�h�Ƃ����T�O�����܂����B
- �ȍ~�̋c�_�́A�\�����ꂽ <literal>ConnectionProvider</literal>
��ʂ��Ē����
- �R�l�N�V�����ɓK�ł��邱�Ƃɒ��ӂ��Ă��������B
-
�قȂ�J�����[�h�́A<literal>org.hibernate.ConnectionReleaseMode</literal> ��
- ���ꂽ�l�ɂ��m�F����܂��B
+ Hibernateのレガシー(2.x)のJDBCコネクション管理に関する振る舞いは、
+ 最初に必要とした際に <literal>Session</literal> がコネクションを得るというものでした。
+ そして、セッションが閉じられるまで、そのコネクションを保持しました。
+ Hibernate 3.xは、セッションにJDBCコネクションをどのように制御するかを伝える
+ コネクション開放モードという概念を導入しました。
+ 以降の議論は、構成された <literal>ConnectionProvider</literal> を通して提供される
+ コネクションに適切であることに注意してください。
+ 異なる開放モードは、<literal>org.hibernate.ConnectionReleaseMode</literal>
に
+ 列挙された値により確認されます。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>ON_CLOSE</literal> -
�{���I�ɏ�L�ŏq�ׂ����K�V�[�̐U�镑���ł��B
-
Hibernate�Z�b�V�����͍ŏ���JDBC�A�N�Z�X����s����K�v������ۂɃR�l�N�V�����܂��B
- �����āA�Z�b�V������������܂ŁA�R�l�N�V������ێ����܂��B
+ <literal>ON_CLOSE</literal> - 本質的に上記で述べたレガシーの振る舞いです。
+ Hibernateセッションは最初にJDBCアクセスを実行する必要がある際にコネクションを得ます。
+ そして、セッションが閉じられるまで、コネクションを保持します。
</para>
</listitem>
<listitem>
<para>
<literal>AFTER_TRANSACTION</literal> -
- <literal>org.hibernate.Transaction</literal>
������������A
- �R�l�N�V������J�����܂��B
+ <literal>org.hibernate.Transaction</literal> が完了した後、
+ コネクションを開放します。
</para>
</listitem>
<listitem>
<para>
- <literal>AFTER_STATEMENT</literal> �i�ϋɓI�ȊJ���Ƃ�Ă��j -
- ���ׂẴX�e�[�g�����g�����ꂼ����s���ꂽ��A�R�l�N�V�������J������܂��B
- �X�e�[�g�����g���Z�b�V�����Ɋ֘A���郊�\�[�X��J�����܂܂ɂ���ꍇ�́A
- ���̐ϋɓI�ȊJ���̓X�L�b�v����܂��B
- ���̂Ƃ���A���ꂪ�N����̂�
<literal>org.hibernate.ScrollableResults</literal>
- ���g����ꍇ�݂̂ł��B
+ <literal>AFTER_STATEMENT</literal> (積極的な開放とも呼ばれる) -
+ すべてのステートメントがそれぞれ実行された後、コネクションが開放されます。
+ ステートメントがセッションに関連するリソースを開いたままにする場合は、
+ この積極的な開放はスキップされます。
+ 今のところ、これが起こるのは
<literal>org.hibernate.ScrollableResults</literal>
+ が使われる場合のみです。
</para>
</listitem>
</itemizedlist>
<para>
- �R���t�B�O���[�V�����p�����[�^��
<literal>hibernate.connection.release_mode</literal>
- �́A�g�p����J�����[�h��w�肷�邽�߂Ɏg���܂��B
- �w��ł���l�͎��̒ʂ�ł��B
+ コンフィグレーションパラメータの
<literal>hibernate.connection.release_mode</literal>
+ は、使用する開放モードを指定するために使います。
+ 指定できる値は次の通りです。
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>auto</literal> �i�f�t�H���g�j - �����I�����
+ <literal>auto</literal> (デフォルト) - これを選択すると
<literal>org.hibernate.transaction.TransactionFactory.getDefaultReleaseMode()</literal>
- ���\�b�h�ɂ���ĕԂ����J�����[�h�ɈϏ�����܂��B
- ���̃��\�b�h�́A
- JTATransactionFactory�ɂ�ConnectionReleaseMode.AFTER_STATEMENT��Ԃ��A
-
JDBCTransactionFactory�ɂ�ConnectionReleaseMode.AFTER_TRANSACTION��Ԃ��܂��B
- ���̃f�t�H���g�̐U�镑����ς��Ă��܂�����������������܂���B
- ����́A���̐ݒ�l�������ŋN�����Q�́A
- ���[�U�R�[�h�̒��Ńo�O��Ԉ�������ɂȂ�₷������ł��B
+ メソッドによって返される開放モードに委譲されます。
+ このメソッドは、
+ JTATransactionFactoryにはConnectionReleaseMode.AFTER_STATEMENTを返し、
+
JDBCTransactionFactoryにはConnectionReleaseMode.AFTER_TRANSACTIONを返します。
+ このデフォルトの振る舞いを変えてうまくいった試しがありません。
+ それは、この設定値が原因で起こる障害は、
+ ユーザコードの中でバグや間違った条件になりやすいからです。
</para>
</listitem>
<listitem>
<para>
- <literal>on_close</literal> -
ConnectionReleaseMode.ON_CLOSE��g���܂��B
- ���̐ݒ�͌���݊��̂��߂Ɏc����Ă��܂����A�g��Ȃ����Ƃ������߂܂��B
+ <literal>on_close</literal> -
ConnectionReleaseMode.ON_CLOSEを使います。
+ この設定は後方互換のために残されていますが、使わないことを強く勧めます。
</para>
</listitem>
<listitem>
<para>
- <literal>after_transaction</literal> -
ConnectionReleaseMode.AFTER_TRANSACTION��g���܂��B
- ���̐ݒ��JTA���̒��ł͎g���ׂ��ł͂���܂���B
-
ConnectionReleaseMode.AFTER_TRANSACTION��w�肵�A�����R�~�b�g���[�h�̒��ł́A
-
�J�����[�h��AFTER_STATEMENT�ł��邩�̂悤�ɁA�R�l�N�V�����͊J������邱�Ƃɒ��ӂ��Ă��������B
+ <literal>after_transaction</literal> -
ConnectionReleaseMode.AFTER_TRANSACTIONを使います。
+ この設定はJTA環境の中では使うべきではありません。
+ ConnectionReleaseMode.AFTER_TRANSACTIONを指定し、自動コミットモードの中では、
+ 開放モードがAFTER_STATEMENTであるかのように、コネクションは開放されることに注意してください。
</para>
</listitem>
<listitem>
<para>
- <literal>after_statement</literal> -
ConnectionReleaseMode.AFTER_STATEMENT��g���܂��B
- ����ɁA�ݒ肳�ꂽ <literal>ConnectionProvider</literal> �́A
- ���̐ݒ� (<literal>supportsAggressiveRelease()</literal>)
��T�|�[�g���邩�ǂ���
- �ׂ邽�߂Ɏg�p���܂��B
- ��������łȂ��ꍇ�A�J�����[�h��ConnectionReleaseMode.AFTER_TRANSACTION
- �Ƀ��Z�b�g����܂��B
- ���̐ݒ�͎��̊��ł݈̂��S�ł��B
-
����́A<literal>ConnectionProvider.getConnection()</literal> ��Ăяo�����т�
- ��ՂƂȂ�JDBC�R�l�N�V������������̂�擾�ł��邩�A
- �����R�l�N�V�����������邱�Ƃ����ƂȂ�Ȃ������R�~�b�g���̒��ł��B
+ <literal>after_statement</literal> -
ConnectionReleaseMode.AFTER_STATEMENTを使います。
+ さらに、設定された <literal>ConnectionProvider</literal> は、
+ この設定 (<literal>supportsAggressiveRelease()</literal>)
をサポートするかどうか
+ を調べるために使用します。
+ もしそうでない場合、開放モードはConnectionReleaseMode.AFTER_TRANSACTION
+ にリセットされます。
+ この設定は次の環境でのみ安全です。
+ それは、<literal>ConnectionProvider.getConnection()</literal>
を呼び出すたびに
+ 基盤となるJDBCコネクションが同じものを取得できるか、
+ 同じコネクションが得られることが問題とならない自動コミット環境の中です。
</para>
</listitem>
</itemizedlist>
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/tutorial.xml
===================================================================
--- core/trunk/documentation/manual/ja-JP/src/main/docbook/content/tutorial.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++ core/trunk/documentation/manual/ja-JP/src/main/docbook/content/tutorial.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,53 +1,55 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="tutorial">
- <title>Hibernate�̓���</title>
+ <title>Hibernateの導入</title>
<sect1 id="tutorial-intro" revision="1">
- <title>�O����</title>
+ <title>前書き</title>
<para>
- ���̏͂�Hibernate���߂Ďg�����[�U�����̓���I�ȃ`���[�g���A���ł��B
- �C���������f�[�^�x�[�X��g���ȒP�ȃR�}���h���C���A�v���P�[�V��������n�߁A
- �����킩��₷�������ŊJ����i�߂܂��B
+ この章はHibernateを初めて使うユーザ向けの入門的なチュートリアルです。
+ インメモリデータベースを使う簡単なコマンドラインアプリケーションから始め、
+ 一歩一歩わかりやすいやり方で開発を進めます。
</para>
<para>
- ���̃`���[�g���A����Hibernate���߂Ďg�����[�U��z�肵�Ă��܂����A
- ������ɂ�Java��SQL�ɂ��Ă̒m�����K�v�ł��B
- �����Michael Gloegl�̎�ɂ��`���[�g���A�����~���ɂ��Ă��܂����A
- �����ŃT�[�h�p�[�e�B���C�u�����ƌ����Ă���̂́AJDK 1.4��5.0�p�̂�̂ł��B
- JDK 1.3�𗘗p����̂ł���Α��̃��C�u�������K�v�������܂���B
+ このチュートリアルはHibernateを初めて使うユーザを想定していますが、
+ 理解するにはJavaとSQLについての知識が必要です。
+ これはMichael Gloeglの手によるチュートリアルを下敷きにしていますが、
+ ここでサードパーティライブラリと言っているのは、JDK 1.4と5.0用のものです。
+ JDK 1.3を利用するのであれば他のライブラリが必要かもしれません。
</para>
<para>
- �`���[�g���A���̃\�[�X�R�[�h��Hibernate�f�B�X�g���r���[�V������
- <literal>doc/reference/tutorial/</literal> �ɂ���܂��B
+ チュートリアルのソースコードはHibernateディストリビューションの
+ <literal>doc/reference/tutorial/</literal> にあります。
</para>
</sect1>
<sect1 id="tutorial-firstapp" revision="2">
- <title>�p�[�g1 - ���߂Ă�Hibernate�A�v���P�[�V����</title>
+ <title>パート1 - 初めてのHibernateアプリケーション</title>
<para>
- �ŏ��ɃR���\�[���x�[�X�̊ȒP��Hibernate�A�v���P�[�V������쐬���܂��B
- Java�f�[�^�x�[�X�iHSQL DB�j�𗘗p����̂ŁA
- �f�[�^�x�[�X�T�[�o��C���X�g�[������K�v�͂���܂���B
+ 最初にコンソールベースの簡単なHibernateアプリケーションを作成します。
+ Javaデータベース(HSQL DB)を利用するので、
+ データベースサーバをインストールする必要はありません。
</para>
<para>
- ���ɏ����ȃf�[�^�x�[�X�A�v���P�[�V�������K�v���Ƃ��܂��傤�B
- ���̃A�v���P�[�V�����ɂ͏o�Ȃ������C�x���g�ƁA
- ���̃C�x���g�̃z�X�g�ɂ��Ă̏���i�[�����̂Ƃ��܂��B
+ 仮に小さなデータベースアプリケーションが必要だとしましょう。
+ そのアプリケーションには出席したいイベントと、
+ そのイベントのホストについての情報を格納するものとします。
</para>
<para>
- �܂��ŏ��ɂ��邱�Ƃ͊J���p�̃f�B���N�g����Z�b�g�A�b�v���āA
- �K�v�ƂȂ邷�ׂĂ�Java���C�u������z�u���邱�Ƃł��B
-
Hibernate�E�F�u�T�C�g����Hibernate�f�B�X�g���r���[�V������_�E�����[�h�����������B
- �t�@�C����𓀂��� <literal>/lib</literal>
�ɂ���K�v�ȃ��C�u�����̂��ׂĂ�A
- �V�����J���p�f�B���N�g���� <literal>/lib</literal>
�f�B���N�g���ɔz�u���Ă��������B
- ���̂悤�ɂȂ��Ă���͂��ł��F
+ まず最初にすることは開発用のディレクトリをセットアップして、
+ 必要となるすべてのJavaライブラリを配置することです。
+ HibernateウェブサイトからHibernateディストリビューションをダウンロードしてください。
+ ファイルを解凍して <literal>/lib</literal> にある必要なライブラリのすべてを、
+ 新しい開発用ディレクトリの <literal>/lib</literal> ディレクトリに配置してください。
+ このようになっているはずです:
</para>
<programlisting><![CDATA[.
@@ -64,24 +66,24 @@
log4j.jar ]]></programlisting>
<para>
- ���ꂪ <emphasis>�{�h�L�������g���M���_�ł�</emphasis>
Hibernate�̕K�v�Œ���̃��C�u�����ł�
- �i���C���A�[�J�C�u��hibernate3.jar��R�s�[���Ă��邱�Ƃɒ��ӂ��Ă��������j�B
-
Hibernate�̃o�[�W�����ɂ���Ă͂���ɕK�v�ȃ��C�u������A�s�v�ȃ��C�u���������邩�����܂���B
- Hibernate�f�B�X�g���r���[�V������ <literal>lib/</literal>
�f�B���N�g���ɂ���
- <literal>README.txt</literal> �t�@�C�������������B
- �K�{�܂��̓I�v�V�����̃T�[�h�p�[�e�B���C�u�����ɂ��Ă̏���ڂ��Ă��܂�
- �i����Log4j�͕K�{�ł͂���܂��A�����̊J���҂��D��ł��܂��j�B
+ これが <emphasis>本ドキュメント執筆時点での</emphasis> Hibernateの必要最低限のライブラリです
+ (メインアーカイブのhibernate3.jarもコピーしていることに注意してください)。
+ Hibernateのバージョンによってはさらに必要なライブラリや、不要なライブラリがあるかもしれません。
+ Hibernateディストリビューションの <literal>lib/</literal> ディレクトリにある
+ <literal>README.txt</literal> ファイルを見てください。
+ 必須またはオプションのサードパーティライブラリについての情報を載せています
+ (実際Log4jは必須ではありませんが、多くの開発者が好んでいます)。
</para>
<para>
- ���Ƀf�[�^�x�[�X�Ɋi�[����C�x���g��\���N���X��쐬���܂��B
+ 次にデータベースに格納するイベントを表すクラスを作成します。
</para>
<sect2 id="tutorial-firstapp-firstclass" revision="1">
- <title>�ŏ��̃N���X</title>
+ <title>最初のクラス</title>
<para>
- �ŏ��̉i���N���X�́A�v���p�e�B���������V���v����JavaBean�ł��F
+ 最初の永続クラスは、プロパティをいくつか持つシンプルなJavaBeanです:
</para>
<programlisting><![CDATA[package events;
@@ -122,42 +124,42 @@
}]]></programlisting>
<para>
- �����̂Ƃ���A���̃N���X�̓t�B�[���h��private�̉��������Ă���̂Ɠ����ɁA
- JavaBean�W���̃Q�b�^�[�A�Z�b�^�[���\�b�h�̖����K��ɏ]���Ă��܂��B
- ���̂悤�Ȑv�͐�������Ă��܂����K�{�ł͂���܂���B
- �A�N�Z�T���\�b�h��݂���̂̓��t�@�N�^�����O��l�����挒���̂��߂ŁA
- Hibernate�̓t�B�[���h�ɒ��ڃA�N�Z�X���邱�Ƃ�\�ł��B
- �����̂Ȃ��R���X�g���N�^�́A���t���N�V�����ł��̃N���X�̃C���X�^���X��쐬���邽�߂�
- �K�v�ł��B
+ ご覧のとおり、このクラスはフィールドがprivateの可視性を持っているのと同時に、
+ JavaBean標準のゲッター、セッターメソッドの命名規約に従っています。
+ このような設計は推奨されていますが必須ではありません。
+ アクセサメソッドを設けるのはリファクタリングを考えた頑健性のためで、
+ Hibernateはフィールドに直接アクセスすることも可能です。
+ 引数のないコンストラクタは、リフレクションでこのクラスのインスタンスを作成するために
+ 必要です。
</para>
<para>
- <literal>id</literal>
�v���p�e�B�́A�������̃C�x���g�ɑ��郆�j�[�N�Ȏ��ʎq�̒l��ێ����܂��B
- Hibernate�̊��S�ȋ@�\��g��������A���ׂẲi���G���e�B�e�B�N���X
- �i����قǏd�v�ł͂Ȃ��ˑ��N���X�Ƃ�����̂����܂��j
- �ɂ��̂悤�Ȏ��ʎq�v���p�e�B���K�v�ɂȂ�܂��B
- ������قƂ�ǂ̃A�v���P�[�V�����i����web�A�v���P�[�V�����j�ł́A
-
���ʎq�ŃI�u�W�F�N�g���ʂ���K�v�����邽�߁A����͐����Ƃ�����������ł���ƍl����ׂ��ł��B
- �������ʏ�I�u�W�F�N�g��ID�𑀍삷��悤�Ȃ��Ƃ͂��܂���B
- ���̂��߃Z�b�^�[���\�b�h��private�ɂ���ׂ��ł��B
- Hibernate�������I�u�W�F�N�g���Z�[�u���ꂽ�Ƃ��Ɏ��ʎq�֒l�������܂��B
- Hibernate���ipublic, private,
protected�j�t�B�[���h�ɒ��ڃA�N�Z�X�ł���̂Ɠ��l�ɁA
- public, private,
protected�̃A�N�Z�T���\�b�h�ɃA�N�Z�X�ł���Ƃ������Ƃ��킩��ł��傤�B
- �I��͂��Ȃ��ɔC����Ă���̂ŁA���Ȃ��̃A�v���P�[�V�����̐v�ɍ��킹�邱�Ƃ��ł��܂��B
+ <literal>id</literal> プロパティは、ある特定のイベントに対するユニークな識別子の値を保持します。
+ Hibernateの完全な機能を使いたければ、すべての永続エンティティクラス
+ (それほど重要ではない依存クラスというものもあります)
+ にこのような識別子プロパティが必要になります。
+ 事実上ほとんどのアプリケーション(特にwebアプリケーション)では、
+ 識別子でオブジェクトを区別する必要があるため、これは制限というよりも特徴であると考えるべきです。
+ しかし通常オブジェクトのIDを操作するようなことはしません。
+ そのためセッターメソッドはprivateにするべきです。
+ Hibernateだけがオブジェクトがセーブされたときに識別子へ値を代入します。
+ Hibernateが(public, private, protected)フィールドに直接アクセスできるのと同様に、
+ public, private, protectedのアクセサメソッドにアクセスできるということがわかるでしょう。
+ 選択はあなたに任されているので、あなたのアプリケーションの設計に合わせることができます。
</para>
<para>
- �����̂Ȃ��R���X�g���N�^�͂��ׂẲi���N���X�ɕK�{�ł��B
-
�����Hibernate��Java�̃��t���N�V������g���āA�I�u�W�F�N�g��쐬���Ȃ���Ȃ�Ȃ����߂ł��B
- �R���X�g���N�^��private�ɂ��邱�Ƃ͉\�ł����A
- ���s���̃v���L�V�����ƁA�o�C�g�R�[�h����Ȃ��̌����I�ȃf�[�^�̒��o�ɂ́A
- package�������K�v�ł��B
+ 引数のないコンストラクタはすべての永続クラスに必須です。
+ これはHibernateがJavaのリフレクションを使って、オブジェクトを作成しなければならないためです。
+ コンストラクタをprivateにすることは可能ですが、
+ 実行時のプロキシ生成と、バイトコード操作なしの効率的なデータの抽出には、
+ package可視性が必要です。
</para>
<para>
- �J���t�H���_�� <literal>src</literal>
�Ƃ����f�B���N�g���̓K�ȃp�b�P�[�W�ɁA
- ����Java�\�[�X�t�@�C����z�u�����������B
- ���̎��_�Ńf�B���N�g���͈ȉ��̂悤�ɂȂ��Ă���͂��ł��F
+ 開発フォルダの <literal>src</literal> というディレクトリの適切なパッケージに、
+ このJavaソースファイルを配置してください。
+ この時点でディレクトリは以下のようになっているはずです:
</para>
<programlisting><![CDATA[.
@@ -168,23 +170,23 @@
Event.java]]></programlisting>
<para>
- ���̃X�e�b�v�ł́AHibernate�ɂ��̉i���N���X�̏������܂��B
+ 次のステップでは、Hibernateにこの永続クラスの情報を教えます。
</para>
</sect2>
<sect2 id="tutorial-firstapp-mapping" revision="1">
- <title>�}�b�s���O�t�@�C��</title>
+ <title>マッピングファイル</title>
<para>
-
Hibernate�́A�ǂ̂悤�ɉi���N���X�̃I�u�W�F�N�g���[�h���i�[����悢����m��K�v������܂��B
- ������Hibernate�}�b�s���O�t�@�C�����o�ꂵ�܂��B
- �}�b�s���O�t�@�C���́A�f�[�^�x�[�X��̂ǂ̃e�[�u���ɃA�N�Z�X���Ȃ���Ȃ�Ȃ����A
- ���̃e�[�u���̂ǂ̃J������g���ׂ�����AHibernate�ɋ����܂��B
+ Hibernateは、どのように永続クラスのオブジェクトをロードし格納すればよいかを知る必要があります。
+ ここでHibernateマッピングファイルが登場します。
+ マッピングファイルは、データベース内のどのテーブルにアクセスしなければならないか、
+ そのテーブルのどのカラムを使うべきかを、Hibernateに教えます。
</para>
<para>
- �}�b�s���O�t�@�C���̊�{�I�ȍ\���͂��̂悤�ɂȂ�܂��F
+ マッピングファイルの基本的な構造はこのようになります:
</para>
<programlisting><![CDATA[<?xml version="1.0"?>
@@ -197,28 +199,28 @@
</hibernate-mapping>]]></programlisting>
<para>
- Hibernate DTD�����ɐ������Ă��邱�Ƃɒ��ڂ��Ă��������B
-
����DTD�́A�G�f�B�^��IDE�ł�XML�}�b�s���O�v�f�Ƒ����̃I�[�g�R���v���[�V�����@�\�ɗ��p�ł��܂��B
- �܂�DTD�t�@�C����e�L�X�g�G�f�B�^�ŊJ���Ă݂Ă��������B
- �Ƃ����̂�A���ׂĂ̗v�f�Ƒ�����T�ς��A
- �R�����g��f�t�H���g�̒l����ɂ͈�ԊȒP�ȕ��@������ł��B
- Hibernate�́Aweb����DTD�t�@�C�����[�h�����ɁA
- �܂��A�v���P�[�V�����̃N���X�p�X���炱���T���o�����Ƃ��邱�Ƃɒ��ӂ��Ă��������B
- DTD�t�@�C����Hibernate�f�B�X�g���r���[�V������
<literal>src/</literal>
- �f�B���N�g���Ɠ��l�A<literal>hibernate3.jar</literal>
�ɂ�܂܂�Ă��܂��B
+ Hibernate DTDが非常に洗練されていることに注目してください。
+ このDTDは、エディタやIDEでのXMLマッピング要素と属性のオートコンプリーション機能に利用できます。
+ またDTDファイルをテキストエディタで開けてみてください。
+ というのも、すべての要素と属性を概観し、
+ コメントやデフォルトの値を見るには一番簡単な方法だからです。
+ Hibernateは、webからDTDファイルをロードせずに、
+ まずアプリケーションのクラスパスからこれを探し出そうとすることに注意してください。
+ DTDファイルはHibernateディストリビューションの <literal>src/</literal>
+ ディレクトリと同様、<literal>hibernate3.jar</literal> にも含まれています。
</para>
<para>
- �ȍ~�̗�ł̓R�[�h��Z�����邽�߂�DTD�錾��ȗ����܂��B
- ���R�ł�������̓I�v�V�����ł͂���܂���B
+ 以降の例ではコードを短くするためにDTD宣言を省略します。
+ 当然ですがこれはオプションではありません。
</para>
<para>
- 2�� <literal>hibernate-mapping</literal> �^�O�̊Ԃ�
- <literal>class</literal> �v�f��܂߂Ă��������B
- ���ׂẲi���G���e�B�e�B�N���X�i�O�����܂����A
- �t�@�[�X�g�N���X�̃G���e�B�e�B�ł͂Ȃ��ˑ��N���X�Ƃ�����̂���قǓo�ꂵ�܂��j
- ��SQL�f�[�^�x�[�X��̃e�[�u���ւ̂��̂悤�ȃ}�b�s���O��K�v�Ƃ��܂��B
+ 2つの <literal>hibernate-mapping</literal> タグの間に
+ <literal>class</literal> 要素を含めてください。
+ すべての永続エンティティクラス(念を押しますが、
+ ファーストクラスのエンティティではない依存クラスというものが後ほど登場します)
+ はSQLデータベース内のテーブルへのこのようなマッピングを必要とします。
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -230,12 +232,12 @@
</hibernate-mapping>]]></programlisting>
<para>
- ����܂Ŏ������́A<literal>Event</literal> �N���X�̃I�u�W�F�N�g��
- <literal>EVENTS</literal>
�e�[�u���ɑ��āA�ǂ̂悤�ɉi���������胍�[�h�����肷��̂���
-
Hibernate�ɋ����Ă��܂����B�����ČX�̃C���X�^���X�̓e�[�u���̍s�Ƃ��ĕ\������܂��B
-
����ł͈��������e�[�u���̎�L�[�ɑ��郆�j�[�N�Ȏ��ʎq�v���p�e�B��}�b�s���O���Ă����܂��B
- ����ɁA���̎��ʎq�̈����ɋC��g�������Ȃ������̂Ɠ��l�ɁA
- �㗝�̎�L�[�J�����ɑ���Hibernate�̎��ʎq�����헪��ݒ肵�܂��B
+ これまで私たちは、<literal>Event</literal> クラスのオブジェクトを
+ <literal>EVENTS</literal> テーブルに対して、どのように永続化したりロードしたりするのかを
+ Hibernateに教えてきました。そして個々のインスタンスはテーブルの行として表現されます。
+ それでは引き続きテーブルの主キーに対するユニークな識別子プロパティをマッピングしていきます。
+ さらに、この識別子の扱いに気を使いたくなかったのと同様に、
+ 代理の主キーカラムに対するHibernateの識別子生成戦略を設定します。
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -249,21 +251,21 @@
</hibernate-mapping>]]></programlisting>
<para>
- <literal>id</literal> �v�f�͎��ʎq�v���p�e�B�̐錾�ł���A
- <literal>name="id"</literal>
��Java�v���p�e�B�̖��O��錾���܂��B
-
Hibernate�͂��̃v���p�e�B�փA�N�Z�X���邽�߂ɃQ�b�^�[�A�Z�b�^�[���\�b�h��g���܂��B
- �J���������ł� <literal>EVENTS</literal>
�e�[�u���̂ǂ̃J�������L�[�Ƃ��Ďg���̂���
- Hibernate�ɋ����܂��B
- ����q�ɂȂ��Ă��� <literal>generator</literal>
�v�f�́A���ʎq�����鎞�̐헪��w�肵�܂��B
- �i���̗�ł� <literal>native</literal> ��p���܂����j�B
- ���̗v�f�́A�ݒ肵���f�[�^�x�[�X�idialect�j�ɑ���ŗǂȎ��ʎq�����헪��I�肷���̂ł��B
- Hibernate�́A�A�v���P�[�V�����Œl���蓖�Ă�헪�i������͓Ǝ��Ɋg�������헪�j�Ɠ��l�ɁA
- �O���[�o���Ƀ��j�[�N�Ȓl��f�[�^�x�[�X�ɐ���������헪��T�|�[�g���Ă��܂��B
+ <literal>id</literal> 要素は識別子プロパティの宣言であり、
+ <literal>name="id"</literal> でJavaプロパティの名前を宣言します。
+ Hibernateはこのプロパティへアクセスするためにゲッター、セッターメソッドを使います。
+ カラム属性では <literal>EVENTS</literal> テーブルのどのカラムを主キーとして使うのかを
+ Hibernateに教えます。
+ 入れ子になっている <literal>generator</literal>
要素は、識別子を生成する時の戦略を指定します。
+ (この例では <literal>native</literal> を用いました)。
+ この要素は、設定したデータベース(dialect)に対する最良な識別子生成戦略を選定するものです。
+ Hibernateは、アプリケーションで値を割り当てる戦略(もしくは独自に拡張した戦略)と同様に、
+ グローバルにユニークな値をデータベースに生成させる戦略もサポートしています。
</para>
<para>
- �Ō�ɃN���X�̉i���v���p�e�B�̐錾��}�b�s���O�t�@�C���Ɋ܂߂܂��B
- �f�t�H���g�ł́A�N���X�̃v���p�e�B�͉i���ƌ��Ȃ���܂���F
+ 最後にクラスの永続プロパティの宣言をマッピングファイルに含めます。
+ デフォルトでは、クラスのプロパティは永続と見なされません:
</para>
<programlisting><![CDATA[
@@ -280,45 +282,45 @@
</hibernate-mapping>]]></programlisting>
<para>
- <literal>id</literal> �v�f�̏ꍇ�Ɠ��l�ɁA
<literal>property</literal> �v�f��
- <literal>name</literal>
�����ŁA�ǂ̃Q�b�^�[�ƃZ�b�^�[���\�b�h��g���ׂ�����Hibernate�ɋ����܂��B
- ���̗�ł́AHibernate�� <literal>getDate()/setDate()</literal> ��
<literal>getTitle()/setTitle()</literal> ��
- �T���܂��B
+ <literal>id</literal> 要素の場合と同様に、
<literal>property</literal> 要素の
+ <literal>name</literal>
属性で、どのゲッターとセッターメソッドを使うべきかをHibernateに教えます。
+ この例では、Hibernateは <literal>getDate()/setDate()</literal> と
<literal>getTitle()/setTitle()</literal> を
+ 探します。
</para>
<para>
- �Ȃ� <literal>date</literal> �v���p�e�B�̃}�b�s���O�ɂ�
<literal>column</literal>
- ����������A<literal>title</literal>
�v���p�e�B�ɂ͂Ȃ��̂ł��傤���H
- <literal>column</literal>
�������Ȃ���AHibernate�̓v���p�e�B����J�������Ƃ��Ďg���܂��B
- ����� <literal>title</literal> �ł͏�肭�s���܂��B
- ������ <literal>date</literal> �͂قƂ�ǂ̃f�[�^�x�[�X�ŗ\���Ȃ̂ŁA
- �Ⴄ���O�Ń}�b�s���O���������悢�̂ł��B
+ なぜ <literal>date</literal> プロパティのマッピングには
<literal>column</literal>
+ 属性があり、<literal>title</literal> プロパティにはないのでしょうか?
+ <literal>column</literal>
属性がなければ、Hibernateはプロパティ名をカラム名として使います。
+ これは <literal>title</literal> では上手く行きます。
+ しかし <literal>date</literal> はほとんどのデータベースで予約語なので、
+ 違う名前でマッピングした方がよいのです。
</para>
<para>
- ���ɋ����[���̂� <literal>title</literal> �}�b�s���O��
<literal>type</literal>
- �����������Ă���_�ł��B
-
�}�b�s���O�t�@�C���Ő錾���Ďg��type�́A���킩�肩�����܂���Java�̃f�[�^�^�ł͂���܂���B
- SQL�f�[�^�x�[�X�̌^�ł����܂���B
- ����� <emphasis>Hibernate�}�b�s���O�^</emphasis> �ƌĂ��A
- Java����SQL�f�[�^�̌^�ւ܂���SQL����Java�f�[�^�^�֖|��R���o�[�^�ł��B
- �J��Ԃ��ɂȂ�܂����AHibernate�� <literal>type</literal>
�������}�b�s���O�t�@�C����ɂȂ���A
- �������R���o�[�W�����ƃ}�b�s���O�^�����ʼn����悤�Ƃ��܂��B
- �iJava�N���X�̃��t���N�V������g�����j���̎������m�́A
- �ꍇ�ɂ���Ă͂��Ȃ������҂܂��͕K�v�Ƃ���f�t�H���g�l�ɂȂ�Ȃ��������܂���B
- <literal>date</literal> �v���p�e�B�̏ꍇ�������ł����B
- Hibernate�͂��́i <literal>java.util.Date</literal>
�́j�v���p�e�B��
- SQL�� <literal>date</literal> ,
<literal>timestamp</literal> ,
- <literal>time</literal>
�̂����A�ǂ̃J�����Ƀ}�b�s���O����ׂ��Ȃ̂��킩��܂���B
- <literal>timestamp</literal>
�R���o�[�^�Ńv���p�e�B��}�b�s���O���邱�Ƃɂ��A���S�ȓ�����ۑ����܂��B
+ 次に興味深いのは <literal>title</literal> マッピングが
<literal>type</literal>
+ 属性をも欠いている点です。
+ マッピングファイルで宣言して使うtypeは、おわかりかもしれませんがJavaのデータ型ではありません。
+ SQLデータベースの型でもありません。
+ これは <emphasis>Hibernateマッピング型</emphasis> と呼ばれる、
+ JavaからSQLデータの型へまたはSQLからJavaデータ型へ翻訳するコンバータです。
+ 繰り返しになりますが、Hibernateは <literal>type</literal>
属性がマッピングファイル内になければ、
+ 正しいコンバージョンとマッピング型を自分で解決しようとします。
+ (Javaクラスのリフレクションを使った)この自動検知は、
+ 場合によってはあなたが期待または必要とするデフォルト値にならないかもしれません。
+ <literal>date</literal> プロパティの場合がそうでした。
+ Hibernateはこの( <literal>java.util.Date</literal> の)プロパティを
+ SQLの <literal>date</literal> ,
<literal>timestamp</literal> ,
+ <literal>time</literal> のうち、どのカラムにマッピングするべきなのかわかりません。
+ <literal>timestamp</literal>
コンバータでプロパティをマッピングすることにより、完全な日時を保存します。
</para>
<para>
- ���̃}�b�s���O�t�@�C���́A<literal>Event.hbm.xml</literal>
�Ƃ��� <literal>Event</literal>
- Java�N���X�\�[�X�t�@�C���̂����ׂɃZ�[�u����ׂ��ł��B
-
�}�b�s���O�t�@�C���̖������@�͔C�ӂł����A<literal>hbm.xml</literal>
- �T�t�B�b�N�X��Hibernate�̊J���҂̃R�~���j�e�B��ł̏K���ƂȂ��Ă��܂��B
- ���݃f�B���N�g���\���͂��̂悤�ɂȂ��Ă���͂��ł��F
+ このマッピングファイルは、<literal>Event.hbm.xml</literal> として
<literal>Event</literal>
+ Javaクラスソースファイルのすぐ隣にセーブするべきです。
+ マッピングファイルの命名方法は任意ですが、<literal>hbm.xml</literal>
+ サフィックスがHibernateの開発者のコミュニティ内での習慣となっています。
+ 現在ディレクトリ構造はこのようになっているはずです:
</para>
<programlisting><![CDATA[.
@@ -330,51 +332,51 @@
Event.hbm.xml]]></programlisting>
<para>
- Hibernate�̎�v�Ȑݒ�𑱂��܂��B
+ Hibernateの主要な設定を続けます。
</para>
</sect2>
<sect2 id="tutorial-firstapp-configuration"
revision="2">
- <title>Hibernate�̐ݒ�</title>
+ <title>Hibernateの設定</title>
<para>
-
�����܂łʼni���N���X�ƃ}�b�s���O�t�@�C���������܂����B���ꂩ��Hibernate�̐ݒ��s���܂����A
- ���̑O�Ƀf�[�^�x�[�X���K�v�ł��B
- HSQL DB��Java�x�[�X�̃C��������SQL DBMS�ł���AHSQL
DB�E�F�u�T�C�g����_�E�����[�h�ł��܂��B
- ���ۂɂ̓_�E�����[�h�������� <literal>hsqldb.jar</literal>
�������K�v�ł��B
- ���̃t�@�C����J���t�H���_�� <literal>lib/</literal>
�f�B���N�g���ɔz�u���Ă��������B
+ ここまでで永続クラスとマッピングファイルが揃いました。これからHibernateの設定を行いますが、
+ その前にデータベースが必要です。
+ HSQL DBはJavaベースのインメモリSQL DBMSであり、HSQL DBウェブサイトからダウンロードできます。
+ 実際にはダウンロードした中の <literal>hsqldb.jar</literal> だけが必要です。
+ このファイルを開発フォルダの <literal>lib/</literal> ディレクトリに配置してください。
</para>
<para>
- <literal>data</literal>
�Ƃ����f�B���N�g����J���f�B���N�g���̃��[�g�ɍ쐬���Ă��������B
- HSQL DB�͂����Ƀf�[�^�t�@�C����i�[���܂��B
- ���̃f�[�^�f�B���N�g���ɂ����� <literal>java -classpath
lib/hsqldb.jar org.hsqldb.Server</literal> ����s���A
- �f�[�^�x�[�X��N���������������B
- ����̊J�n�ƁATCP/IP�\�P�b�g�̃o�C���h���m�F�ł��܂��B
- ��قǍ쐬����A�v���P�[�V�����͂����ɐڑ����܂��B
- ������̃`���[�g���A�����Ƀf�[�^�x�[�X��������������A
- HSQL DB��V���b�g�_�E�����āi��ƃE�B���h�E�� <literal>CTRL +
C</literal> �����܂��j
- <literal>data/</literal>
�f�B���N�g����̃t�@�C����S�ď���������A
- HSQL DB��ċN�����܂��B
+ <literal>data</literal> というディレクトリを開発ディレクトリのルートに作成してください。
+ HSQL DBはここにデータファイルを格納します。
+ このデータディレクトリにおいて <literal>java -classpath lib/hsqldb.jar
org.hsqldb.Server</literal> を実行し、
+ データベースを起動させてください。
+ 動作の開始と、TCP/IPソケットのバインドが確認できます。
+ 後ほど作成するアプリケーションはここに接続します。
+ もしこのチュートリアル中にデータベースを初期化したければ、
+ HSQL DBをシャットダウンして(作業ウィンドウで <literal>CTRL + C</literal>
を押します)
+ <literal>data/</literal> ディレクトリ内のファイルを全て消去した後、
+ HSQL DBを再起動します。
</para>
<para>
- Hibernate�̓A�v���P�[�V�����̃f�[�^�x�[�X�ɐڑ�����w�Ȃ̂ŁA
- �R�l�N�V�����̏�K�v�ɂȂ�܂��B
-
�R�l�N�V������JDBC�R�l�N�V�����v�[����ʂ��čs���܂����A�����ݒ肷��K�v������܂��B
-
Hibernate�f�B�X�g���r���[�V�����ɂ͂������̃I�[�v���\�[�X��JDBC�R�l�N�V�����v�[���c�[�����܂܂�Ă��܂����A
- ���̃`���[�g���A���ł�Hibernate�ɑg�ݍ��܂ꂽ�R�l�N�V�����v�[����g���܂��B
-
������i���x���̕i���̃T�[�h�p�[�e�BJDBC�R�l�N�V�����v�[���\�t�g�E�F�A��g��������A
- �N���X�p�X�ɕK�v�ȃ��C�u������R�s�[���āA�قȂ�R�l�N�V�����v�[����ݒ肵�Ȃ����
- �Ȃ�Ȃ����Ƃɒ��ӂ��Ă��������B
+ Hibernateはアプリケーションのデータベースに接続する層なので、
+ コネクションの情報が必要になります。
+ コネクションはJDBCコネクションプールを通じて行われますが、これも設定する必要があります。
+ HibernateディストリビューションにはいくつかのオープンソースのJDBCコネクションプールツールが含まれていますが、
+ このチュートリアルではHibernateに組み込まれたコネクションプールを使います。
+ もし製品レベルの品質のサードパーティJDBCコネクションプールソフトウェアを使いたければ、
+ クラスパスに必要なライブラリをコピーして、異なるコネクションプールを設定しなければ
+ ならないことに注意してください。
</para>
<para>
- Hibernate�̐ݒ�ł́A�P����
<literal>hibernate.properties</literal> �t�@�C���A
- �����菭���������Ă��� <literal>hibernate.cfg.xml</literal>
�t�@�C���A
- �܂��͊��S�Ƀv���O������ŃZ�b�g�A�b�v������@�����p�ł��܂��B
- �قƂ�ǂ̃��[�U���D�ނ̂�XML�ݒ�t�@�C���ł��F
+ Hibernateの設定では、単純な <literal>hibernate.properties</literal>
ファイル、
+ それより少し洗練されている <literal>hibernate.cfg.xml</literal> ファイル、
+ または完全にプログラム上でセットアップする方法が利用できます。
+ ほとんどのユーザが好むのはXML設定ファイルです:
</para>
<programlisting><![CDATA[<?xml version='1.0'
encoding='utf-8'?>
@@ -417,51 +419,51 @@
</hibernate-configuration>]]></programlisting>
<para>
- ����XML�̐ݒ肪�قȂ�DTD��g�����Ƃɒ��ӂ��Ă��������B
- ����̃f�[�^�x�[�X����O���[�o���t�@�N�g���ł���Hibernate��
- <literal>SessionFactory</literal> ��ݒ肵�܂��B
- ��������̃f�[�^�x�[�X������ꍇ�ɂ́A
- �i�X�^�[�g�A�b�v��ȒP�ɂ��邽�߁j�ʏ킢�����̐ݒ�t�@�C����ŁA
- �������� <literal><session-factory></literal>
��g���ݒ�ɂ��Ă��������B
+ このXMLの設定が異なるDTDを使うことに注意してください。
+ 特定のデータベースを受け持つグローバルファクトリであるHibernateの
+ <literal>SessionFactory</literal> を設定します。
+ もし複数のデータベースがある場合には、
+ (スタートアップを簡単にするため)通常いくつかの設定ファイル内で、
+ いくつかの <literal><session-factory></literal>
を使う設定にしてください。
</para>
<para>
- �ŏ���4�� <literal>property</literal>
�v�f��JDBC�R�l�N�V�����ɕK�v�Ȑݒ��܂�ł��܂��B
- dialect�Ƃ������O�� <literal>property</literal>
�v�f�́AHibernate��������������SQL������w�肵�܂��B
-
�i���I�ȃR���e�L�X�g�ɑ���Hibernate�̃Z�b�V�����̎����Ǘ��́A��̗�ł����ɂ킩��悤�ɁA��ɗ����Ƃł��傤�B
- <literal>hbm2ddl.auto</literal>
�I�v�V�����̓f�[�^�x�[�X�X�L�[�}�̎���������on�ɂ��܂��B
- ����͒��ڃf�[�^�x�[�X�ɑ��Đ�������܂��B
- ���R�iconfig�I�v�V������폜���ājoff�ɂ�����A
- <literal>SchemaExport</literal>
�Ƃ���Ant�^�X�N�̏������ăt�@�C���Ƀ��_�C���N�g������ł��܂��B
- �Ō�ɉi���N���X�̂��߂̃}�b�s���O�t�@�C����ݒ�ɒlj����܂��B
+ 最初の4つの <literal>property</literal>
要素はJDBCコネクションに必要な設定を含んでいます。
+ dialectという名前の <literal>property</literal>
要素は、Hibernateが生成する特定のSQL方言を指定します。
+ 永続的なコンテキストに対するHibernateのセッションの自動管理は、後の例ですぐにわかるように、役に立つことでしょう。
+ <literal>hbm2ddl.auto</literal>
オプションはデータベーススキーマの自動生成をonにします。
+ これは直接データベースに対して生成されます。
+ 当然(configオプションを削除して)offにしたり、
+ <literal>SchemaExport</literal>
というAntタスクの助けを借りてファイルにリダイレクトしたりできます。
+ 最後に永続クラスのためのマッピングファイルを設定に追加します。
</para>
<para>
- ���̃t�@�C����\�[�X�f�B���N�g���ɃR�s�[���Ă��������B
- ����Ƃ���̓N���X�p�X�̃��[�g�ɂ��邱�ƂɂȂ�܂��B
- Hibernate�́A�X�^�[�g�A�b�v���ɃN���X�p�X�̃��[�g��
<literal>hibernate.cfg.xml</literal>
- �Ƃ����t�@�C�������I�ɒT���܂��B
+ このファイルをソースディレクトリにコピーしてください。
+ するとこれはクラスパスのルートにあることになります。
+ Hibernateは、スタートアップ時にクラスパスのルートで
<literal>hibernate.cfg.xml</literal>
+ というファイルを自動的に探します。
</para>
</sect2>
<sect2 id="tutorial-firstapp-ant" revision="1">
- <title>Ant�ɂ��r���h</title>
+ <title>Antによるビルド</title>
<para>
- ����ł�Ant��g���ă`���[�g���A����r���h���܂��傤�B
- ����ɂ�Ant���C���X�g�[������Ă��Ȃ���Ȃ�܂���B
- <ulink
url="http://ant.apache.org/bindownload.cgi">Ant�_�E�����[�h�...
- ����_�E�����[�h�����������B
- Ant�̃C���X�g�[�����@�͂����ł͐�����܂���̂ŁA
- <ulink
url="http://ant.apache.org/manual/index.html">Ant�}�j���A��&...
- ��Q�Ƃ��Ă��������B
- Ant��C���X�g�[������A�r���h�t�@�C���̍쐬��J�n�ł��܂��B
- ���̃t�@�C���� <literal>build.xml</literal>
�ƌĂ�A�J���f�B���N�g���ɒ��ڔz�u���܂��B
+ それではAntを使ってチュートリアルをビルドしましょう。
+ それにはAntがインストールされていなければなりません。
+ <ulink
url="http://ant.apache.org/bindownload.cgi">Antダウンロードページ<...
+ からダウンロードしてください。
+ Antのインストール方法はここでは説明しませんので、
+ <ulink
url="http://ant.apache.org/manual/index.html">Antマニュアル</u...
+ を参照してください。
+ Antをインストールすれば、ビルドファイルの作成を開始できます。
+ このファイルは <literal>build.xml</literal> と呼ばれ、開発ディレクトリに直接配置します。
</para>
<para>
- ��{�I�ȃr���h�t�@�C���͂��̂悤�ɂȂ�܂��F
+ 基本的なビルドファイルはこのようになります:
</para>
<programlisting><![CDATA[<project
name="hibernate-tutorial" default="compile">
@@ -498,21 +500,21 @@
</project>]]></programlisting>
<para>
- ����� <literal>.jar</literal>
�ŏI���lib�f�B���N�g���̂��ׂẴt�@�C����A
- �R���p�C���Ɏg�p����N���X�p�X�ɒlj����邱�Ƃ�Ant�ɋ����܂��B
-
�܂��AJava�\�[�X�t�@�C���łȂ����ׂẴt�@�C����^�[�Q�b�g�f�B���N�g���ɃR�s�[����Ƃ������Ƃł����܂��B
- �Ⴆ�ΐݒ�t�@�C����Hibernate�}�b�s���O�t�@�C���Ȃǂł��B
- ��Ant����s����ƁA���̂悤�ȏo�͂�����͂��ł��F
+ これは <literal>.jar</literal> で終わるlibディレクトリのすべてのファイルを、
+ コンパイルに使用するクラスパスに追加することをAntに教えます。
+ また、Javaソースファイルでないすべてのファイルをターゲットディレクトリにコピーするということでもあります。
+ 例えば設定ファイルやHibernateマッピングファイルなどです。
+ 今Antを実行すると、このような出力があるはずです:
</para>
- <programlisting><![CDATA[C:\hibernateTutorial\>ant
+ <programlisting><![CDATA[C:¥hibernateTutorial¥>ant
Buildfile: build.xml
copy-resources:
- [copy] Copying 2 files to C:\hibernateTutorial\bin
+ [copy] Copying 2 files to C:¥hibernateTutorial¥bin
compile:
- [javac] Compiling 1 source file to C:\hibernateTutorial\bin
+ [javac] Compiling 1 source file to C:¥hibernateTutorial¥bin
BUILD SUCCESSFUL
Total time: 1 second ]]></programlisting>
@@ -520,24 +522,24 @@
</sect2>
<sect2 id="tutorial-firstapp-helpers" revision="3">
- <title>�X�^�[�g�A�b�v�ƃw���p</title>
+ <title>スタートアップとヘルパ</title>
<para>
- ���� <literal>Event</literal>
�I�u�W�F�N�g���[�h������i�[�����肷�鏀�����ł��܂����B
-
�������܂��̓C���t���X�g���N�`���̃R�[�h�����āA�Z�b�g�A�b�v��������K�v������܂��B
- �܂���Hibernate��X�^�[�g�A�b�v���Ȃ���Ȃ�܂���B
- ���̃X�^�[�g�A�b�v�ɂ́A�O���[�o����
<literal>SessionFactory</literal> �I�u�W�F�N�g�����āA
- �����A�v���P�[�V�����̃R�[�h�ŃA�N�Z�X���₷���ꏊ�Ɋi�[���邱�Ƃ��܂܂�܂��B
- <literal>SessionFactory</literal> �͐V����
<literal>Session</literal> ��I�[�v�����邱�Ƃ��ł��܂��B
- <literal>Session</literal> �̓V���O���X���b�h�̍�ƒP��(Unit of
Work)��\�����܂��B
- ����ɑ�<literal>SessionFactory</literal>
�̓X���b�h�Z�[�t�̃O���[�o���I�u�W�F�N�g�ł���A
- ��x�����C���X�^���X������܂��B
+ さて <literal>Event</literal> オブジェクトをロードしたり格納したりする準備ができました。
+ しかしまずはインフラストラクチャのコードを書いて、セットアップを完了する必要があります。
+ まずはHibernateをスタートアップしなければなりません。
+ このスタートアップには、グローバルの <literal>SessionFactory</literal>
オブジェクトを生成して、
+ それをアプリケーションのコードでアクセスしやすい場所に格納することが含まれます。
+ <literal>SessionFactory</literal> は新しく
<literal>Session</literal> をオープンすることができます。
+ <literal>Session</literal> はシングルスレッドの作業単位(Unit of
Work)を表現します。
+ それに対し<literal>SessionFactory</literal>
はスレッドセーフのグローバルオブジェクトであり、
+ 一度だけインスタンス化されます。
</para>
<para>
- �����ŃX�^�[�g�A�b�v��s���A �֗���
<literal>SessionFactory</literal> �փA�N�Z�X����
- <literal>HibernateUtil</literal> �w���p�N���X��쐬���܂��B
- �������Ă݂܂��傤�F
+ ここでスタートアップを行い、 便利に <literal>SessionFactory</literal> へアクセスする
+ <literal>HibernateUtil</literal> ヘルパクラスを作成します。
+ 実装を見てみましょう:
</para>
<programlisting><![CDATA[package util;
@@ -567,26 +569,26 @@
}]]></programlisting>
<para>
-
���̃N���X�͐ÓI�������u���b�N�i�N���X�����[�h�����Ƃ���JVM�ɂ���Ĉ�x�����Ă��j
- �ŃO���[�o���� <literal>SessionFactory</literal>
�����邾���ł͂Ȃ��A
- �ÓI�V���O���g���̎g�p��B�����܂��B
- �A�v���P�[�V�����T�[�o�[��JNDI����
<literal>SessionFactory</literal> ��
- ���b�N�A�b�v����̂Ɠ��l�ł��B
+ このクラスは静的初期化ブロック(クラスがロードされるときにJVMによって一度だけ呼ばれる)
+ でグローバルの <literal>SessionFactory</literal> を生成するだけではなく、
+ 静的シングルトンの使用を隠蔽します。
+ アプリケーションサーバーのJNDIから <literal>SessionFactory</literal> を
+ ルックアップするのと同様です。
</para>
<para>
- �ݒ�t�@�C����� <literal>SessionFactory</literal>
�ɖ��O��^����ƁA
- Hibernate�� <literal>SessionFactory</literal>
�\�z���JNDI�ɑ��o�C���h��s�����Ƃ��܂��B
- ���̃R�[�h���S�ɔr�����邽�߂ɂ́A
- JMX�f�v���C�����g�𗘗p����
- JMX�𗘗p�ł���R���e�i��C���X�^���X�����A
- <literal>HibernateService</literal>
��JNDI�փo�C���h���邱�Ƃ�ł��܂��B
- �����̍��x�ȃI�v�V�����́AHibernate�̃��t�@�����X�h�L�������g�Ő������Ă��܂��B
+ 設定ファイル内で <literal>SessionFactory</literal> に名前を与えると、
+ Hibernateは <literal>SessionFactory</literal>
構築後にJNDIに対しバインドを行おうとします。
+ このコードを完全に排除するためには、
+ JMXデプロイメントを利用して
+ JMXを利用できるコンテナをインスタンス化し、
+ <literal>HibernateService</literal> をJNDIへバインドすることもできます。
+ これらの高度なオプションは、Hibernateのリファレンスドキュメントで説明されています。
</para>
<para>
- <literal>HibernateUtil.java</literal>
��J���\�[�X�f�B���N�g���ɂ��� <literal>events</literal> �p�b�P�[�W��
- �ׂɔz�u���Ă��������B
+ <literal>HibernateUtil.java</literal> を開発ソースディレクトリにある
<literal>events</literal> パッケージの
+ 隣に配置してください。
</para>
<programlisting><![CDATA[.
@@ -603,31 +605,31 @@
build.xml]]></programlisting>
<para>
- ����͖��Ȃ��ăR���p�C���ł���͂��ł��B
- �Ō�Ƀ��M���O�V�X�e����ݒ肷��K�v������܂��B
- Hibernate��commons logging��g�����߁ALog4j��JDK 1.4
logging�̑I�����K�v������܂���B
- �قƂ�ǂ̊J���҂��D�ނ̂�Log4j�ł��B
- Hibernate�f�B�X�g���r���[�V�����i��<literal>etc/</literal>
�f�B���N�g���j����
- <literal>log4j.properties</literal> ���Ȃ���
<literal>src</literal> �f�B���N�g�����
- <literal>hibernate.cfg.xml</literal> �ׂ̗ɃR�s�[���Ă��������B
- �ݒ����āA�璷�ȏo�͂��悯��ΐݒ��ύX���Ă��������B
-
�f�t�H���g�ł�Hibernate�̃X�^�[�g�A�b�v���b�Z�[�W�������W���o�͂ɕ\������܂��B
+ これは問題なく再コンパイルできるはずです。
+ 最後にロギングシステムを設定する必要があります。
+ Hibernateはcommons loggingを使うため、Log4jとJDK 1.4 loggingの選択をする必要がありません。
+ ほとんどの開発者が好むのはLog4jです。
+ Hibernateディストリビューション(の<literal>etc/</literal> ディレクトリ)から
+ <literal>log4j.properties</literal> をあなたの
<literal>src</literal> ディレクトリ内の
+ <literal>hibernate.cfg.xml</literal> の隣にコピーしてください。
+ 設定例を見て、冗長な出力がよければ設定を変更してください。
+ デフォルトではHibernateのスタートアップメッセージだけが標準出力に表示されます。
</para>
<para>
- �`���[�g���A���̃C���t���͊��S�ł��B
- Hibernate��g���Ď��ۂ̍�Ƃ��鏀���������܂����B
+ チュートリアルのインフラは完全です。
+ Hibernateを使って実際の作業をする準備が整いました。
</para>
</sect2>
<sect2 id="tutorial-firstapp-workingpersistence"
revision="4">
- <title>�I�u�W�F�N�g�̃��[�h�Ɗi�[</title>
+ <title>オブジェクトのロードと格納</title>
<para>
- ���ɃI�u�W�F�N�g�̃��[�h�Ɗi�[��Hibernate��g�����Ƃ��ł��܂��B
- <literal>main()</literal> ���\�b�h����
<literal>EventManager</literal>
- �N���X�����܂��F
+ ついにオブジェクトのロードと格納にHibernateを使うことができます。
+ <literal>main()</literal> メソッドを持つ
<literal>EventManager</literal>
+ クラスを書きます:
</para>
<programlisting><![CDATA[package events;
@@ -667,48 +669,48 @@
}]]></programlisting>
<para>
- �V���� <literal>Event</literal>
�I�u�W�F�N�g�����A�����Hibernate�ɓn���܂��B
- ���ł�Hibernate��SQL�������A�f�[�^�x�[�X��
<literal>INSERT</literal> ����s���܂��B
- ���s�O�� <literal>Session</literal> ��
<literal>Transaction</literal>
- ��������R�[�h��m�F�����������B
+ 新しい <literal>Event</literal> オブジェクトを生成し、それをHibernateに渡します。
+ 今ではHibernateがSQLを処理し、データベースで <literal>INSERT</literal>
を実行します。
+ 実行前に <literal>Session</literal> と
<literal>Transaction</literal>
+ を処理するコードを確認してください。
</para>
<para>
- <literal>Session</literal> ��1�̍�ƒP��(Unit of Work)�ł��B
- �����̊ԁA�b��ȒP�ɂ��邽�߂ɁA
- <literal>Session</literal> ��
<literal>Transaction</literal> �̑Ή����Έ�Ɖ��肵�܂��B
-
�g�p���Ă���g�����U�N�V�����E�V�X�e���i���̃P�[�X�ł�JTA�Ƌ����ł���P����JDBC�j����R�[�h��ی삷�邽�߂ɁA
- Hibernate <literal>Session</literal> ��ŗ��p�\��
<literal>Transaction</literal> API��g�p���܂��B
+ <literal>Session</literal> は1つの作業単位(Unit of Work)です。
+ 当分の間、話を簡単にするために、
+ <literal>Session</literal> と
<literal>Transaction</literal> の対応を一対一と仮定します。
+ 使用しているトランザクション・システム(このケースではJTAと共存できる単純なJDBC)からコードを保護するために、
+ Hibernate <literal>Session</literal> 上で利用可能な
<literal>Transaction</literal> APIを使用します。
</para>
<para>
- <literal>sessionFactory.getCurrentSession()</literal>
�͂Ȃɂ���̂ł��傤���H
- �܂��A�������� <literal>SessionFactory</literal>
��擾���ێ������
- �i <literal>HibernateUtil</literal>
�̂������ŊȒP�ł��j�A���̃��\�b�h���x�ł�A
- �ǂ�����ł�Ăяo�����Ƃ��o���܂��B
- <literal>getCurrentSession()</literal>
���\�b�h�͏�Ɂu���݂́v��ƒP��(Unit of Work)��Ԃ��܂��B
- <literal>hibernate.cfg.xml</literal>
�̂��̋@�\�̐ݒ�ŁA"thread"��w�肵�����Ƃ�v���o���Ă��������B
-
���̂��ߌ��݂̍�ƒP�ʂ̃X�R�[�v�́A���̃A�v���P�[�V��������s���錻�݂�Java�X���b�h�ł��B
- ����������őS�Ăł͂���܂���B
- <literal>Session</literal> �͍ŏ��ɕK�v�ƂȂ����Ƃ��A�܂�ŏ���
<literal>getCurrentSession()</literal> ��
- �Ăꂽ�Ƃ��ɊJ�n���܂��B
- ���̂Ƃ�Hibernate�ɂ�茻�݂̃X���b�h�Ɍ��ѕt�����܂��B
- �g�����U�N�V�������I���i�R�~�b�g������̓��[���o�b�N�j�����Ƃ��A
- Hibernate��X���b�h���� <literal>Session</literal>
��藣���A�N���[�Y���܂��B
- �Ă� <literal>getCurrentSession()</literal> ��ĂԂƁA
- �V���� <literal>Session</literal>
��擾���ĐV������ƒP�ʂ�X�^�[�g�ł��܂��B
- ���� <emphasis>thread-bound</emphasis>
�v���O���~���O�E���f����Hibernate�𗘗p�����ōł�l�C������܂��B
+ <literal>sessionFactory.getCurrentSession()</literal>
はなにをするのでしょうか?
+ まず、いったん <literal>SessionFactory</literal> を取得し保持すれば
+ ( <literal>HibernateUtil</literal> のおかげで簡単です)、このメソッドを何度でも、
+ どこからでも呼び出すことが出来ます。
+ <literal>getCurrentSession()</literal> メソッドは常に「現在の」作業単位(Unit
of Work)を返します。
+ <literal>hibernate.cfg.xml</literal>
のこの機能の設定で、"thread"を指定したことを思い出してください。
+ このため現在の作業単位のスコープは、このアプリケーションを実行する現在のJavaスレッドです。
+ しかしこれで全てではありません。
+ <literal>Session</literal> は最初に必要となったとき、つまり最初に
<literal>getCurrentSession()</literal> が
+ 呼ばれたときに開始します。
+ そのときHibernateにより現在のスレッドに結び付けられます。
+ トランザクションが終了(コミットもしくはロールバック)したとき、
+ Hibernateもスレッドから <literal>Session</literal> を切り離し、クローズします。
+ 再び <literal>getCurrentSession()</literal> を呼ぶと、
+ 新しい <literal>Session</literal> を取得して新しい作業単位をスタートできます。
+ この <emphasis>thread-bound</emphasis>
プログラミング・モデルはHibernateを利用する上で最も人気があります。
</para>
<para>
- �g�����U�N�V�����̈����Ƌ��E�̏ڂ������ɂ��ẮA
- <xref linkend="transactions"/> �����������B
- ���̗�ł̓G���[������[���o�b�N��������܂��B
+ トランザクションの扱いと境界の詳しい情報については、
+ <xref linkend="transactions"/> を見てください。
+ この例ではエラー処理やロールバックも割愛します。
</para>
<para>
- ���̍ŏ��̃��[�`������s����ɂ́AAnt�̃r���h�t�@�C���ɌĂяo���\�ȃ^�[�Q�b�g��
- �lj����Ȃ���Ȃ�܂���F
+ この最初のルーチンを実行するには、Antのビルドファイルに呼び出し可能なターゲットを
+ 追加しなければなりません:
</para>
<programlisting><![CDATA[<target name="run"
depends="compile">
@@ -719,29 +721,29 @@
</target>]]></programlisting>
<para>
- <literal>action</literal>
�����̒l�́A�^�[�Q�b�g��ĂԂƂ��ɃR�}���h���C���Őݒ肵�܂��F
+ <literal>action</literal> 引数の値は、ターゲットを呼ぶときにコマンドラインで設定します:
</para>
- <programlisting><![CDATA[C:\hibernateTutorial\>ant run
-Daction=store]]></programlisting>
+ <programlisting><![CDATA[C:¥hibernateTutorial¥>ant run
-Daction=store]]></programlisting>
<para>
- �R���p�C������ƁAHibernate���X�^�[�g���A���Ȃ��̐ݒ�ɂ��܂����A
- �����̃��O�o�͂�����͂��ł��B
- ���̍Ō�ɂ͈ȉ��̍s������ł��傤�F
+ コンパイルすると、Hibernateがスタートし、あなたの設定によりますが、
+ 多くのログ出力があるはずです。
+ その最後には以下の行があるでしょう:
</para>
<programlisting><![CDATA[[java] Hibernate: insert into EVENTS
(EVENT_DATE, title, EVENT_ID) values (?, ?, ?)]]></programlisting>
<para>
- �����Hibernate�����s���� <literal>INSERT</literal> �ŁA
- �N�G�X�`�����}�[�N��JDBC�o�C���h�p�����[�^��\���Ă��܂��B
- �����Ƃ��ăo�C���h�����l���邽�߁A���邢�̓��O�̏璷�����炷���߂ɂ́A
- <literal>log4j.properties</literal> ��`�F�b�N�����������B
+ これはHibernateが実行する <literal>INSERT</literal> で、
+ クエスチョンマークはJDBCバインドパラメータを表しています。
+ 引数としてバインドされる値を見るため、あるいはログの冗長性を減らすためには、
+ <literal>log4j.properties</literal> をチェックしてください。
</para>
<para>
- ����ł͓����悤�Ɋi�[���ꂽ�C�x���g�̈ꗗ���悤�Ǝv���܂��B
- ���̂��߃��C�����\�b�h�ɃI�v�V������lj����܂��F
+ それでは同じように格納されたイベントの一覧を見ようと思います。
+ そのためメインメソッドにオプションを追加します:
</para>
<programlisting><![CDATA[if (args[0].equals("store")) {
@@ -757,7 +759,7 @@
}]]></programlisting>
<para>
- �V���� <literal>listEvents()���\�b�h</literal> ��lj����܂��B
+ 新しい <literal>listEvents()メソッド</literal> も追加します。
</para>
<programlisting><![CDATA[private List listEvents() {
@@ -774,47 +776,47 @@
}]]></programlisting>
<para>
- �����ł��邱�Ƃ́A�f�[�^�x�[�X���瑶�݂��邷�ׂĂ�
<literal>Event</literal>
- �I�u�W�F�N�g���[�h����HQL (Hibernate Query Language) �N�G����g�����Ƃł��B
- Hibernate�͓K��SQL�����A�����f�[�^�x�[�X�ɑ���A
- ���̃f�[�^��g���� <literal>Event</literal>
�I�u�W�F�N�g�����܂��B
- ���RHQL�ł���ɕ��G�ȃN�G����쐬�ł��܂��B
+ ここですることは、データベースから存在するすべての <literal>Event</literal>
+ オブジェクトをロードするHQL (Hibernate Query Language) クエリを使うことです。
+ Hibernateは適切なSQLを生成し、それをデータベースに送り、
+ そのデータを使って <literal>Event</literal> オブジェクトを生成します。
+ 当然HQLでさらに複雑なクエリを作成できます。
</para>
<para>
- �ȉ��̃X�e�b�v�ŁA���ׂĂ̎��s�ƃe�X�g��s���܂��B
+ 以下のステップで、すべての実行とテストを行います。
</para>
<itemizedlist>
<listitem>
<para>
-
hbm2ddl��ʂ��O�Ƀf�[�^�x�[�X�̃f�[�^��쐬���A�f�[�^�x�[�X�X�L�[�}�����邽�߂ɁA
- <literal>ant run -Daction=store</literal>
����s�����������B
+ hbm2ddlを通す前にデータベースのデータを作成し、データベーススキーマを生成するために、
+ <literal>ant run -Daction=store</literal>
を実行してください。
</para>
</listitem>
<listitem>
<para>
- ���� <literal>hibernate.cfg.xml</literal>
�t�@�C���̃v���p�e�B��R�����g�A�E�g����hbm2ddl���ɂ��Ă��������B
- �ʏ�͌p���I�ɒP�̃e�X�g���Ă���Ԃ�hbm2ddl��L���ɂ��Ă����̂ł����A
- ����ȊO�̏ꍇ��hbm2ddl��N������Ɗi�[���Ă������S�Ẵf�[�^��
<emphasis>�h���b�v</emphasis> ����ł��傤�B
- �ݒ�� <literal>create</literal> �ɂ���ƁA���ʂƂ���
-
�uSessionFactory�����̍ہA�X�L�[�}����S�Ẵe�[�u����h���b�v���čč쐬����v�Ƃ����ݒ�ɂȂ�܂��B
+ 今は <literal>hibernate.cfg.xml</literal>
ファイルのプロパティをコメントアウトしてhbm2ddlを無効にしてください。
+ 通常は継続的に単体テストをしている間はhbm2ddlを有効にしておくのですが、
+ それ以外の場合にhbm2ddlを起動すると格納しておいた全てのデータを
<emphasis>ドロップ</emphasis> するでしょう。
+ 設定を <literal>create</literal> にすると、結果として
+ 「SessionFactory生成の際、スキーマから全てのテーブルをドロップして再作成する」という設定になります。
</para>
</listitem>
</itemizedlist>
<para>
- �� <literal>-Daction=list</literal> �Ǝw�肵��Ant��ĂԂƁA
- ����܂Ŋi�[�����C�x���g��������͂��ł��B
- <literal>store</literal> �A�N�V�����𐔉�ȏ�ĂԂ��Ƃ�\�ł��B
+ 今 <literal>-Daction=list</literal> と指定してAntを呼ぶと、
+ これまで格納したイベントが見えるはずです。
+ <literal>store</literal> アクションを数回以上呼ぶことも可能です。
</para>
<para>
- ���ӁF���߂�Hibernate�ɐG���l�X�̑����������Ŏ��s���邽�߁A<emphasis>Table
not found</emphasis> �G���[���b�Z�[�W��
- �ւ��鎿������I�Ɍ������܂��B
-
��������L�̃X�e�b�v�ɏ]���Ahbm2ddl���ŏ��Ɏ��s���ꂽ�Ƃ��Ƀf�[�^�x�[�X�X�L�[�}��쐬���A
- ���̌�̎��s�ɂ����Ă���̃X�L�[�}��g�p����̂ŁA���͋N����Ȃ��ł��傤�B
-
�}�b�s���O��f�[�^�x�[�X�X�L�[�}��ύX�����Ƃ��́A�����xhbm2ddl��L���ɂ��Ă��������B
+ 注意:初めてHibernateに触れる人々の多くがここで失敗するため、<emphasis>Table not
found</emphasis> エラーメッセージに
+ 関する質問を定期的に見かけます。
+ しかし上記のステップに従えば、hbm2ddlが最初に実行されたときにデータベーススキーマを作成し、
+ その後の実行においてもこのスキーマを使用するので、問題は起こらないでしょう。
+ マッピングやデータベーススキーマを変更したときは、もう一度hbm2ddlを有効にしてください。
</para>
</sect2>
@@ -822,19 +824,19 @@
</sect1>
<sect1 id="tutorial-associations">
- <title>�p�[�g2 - �֘A�̃}�b�s���O</title>
+ <title>パート2 - 関連のマッピング</title>
<para>
- �i���G���e�B�e�B�N���X��e�[�u���Ƀ}�b�s���O���܂����B
- ����ɂ��̏�ɂ������̃N���X�̊֘A��lj����܂��傤�B
- �܂����߂ɃA�v���P�[�V�����ɐl�X��lj����A�ނ炪�Q������C�x���g�̃��X�g��i�[���܂��B
+ 永続エンティティクラスをテーブルにマッピングしました。
+ さらにこの上にいくつかのクラスの関連を追加しましょう。
+ まず初めにアプリケーションに人々を追加し、彼らが参加するイベントのリストを格納します。
</para>
<sect2 id="tutorial-associations-mappinguser"
revision="1">
- <title>Person�N���X�̃}�b�s���O</title>
+ <title>Personクラスのマッピング</title>
<para>
- �ŏ��� <literal>Person</literal> �N���X�͒P���ł��F
+ 最初の <literal>Person</literal> クラスは単純です:
</para>
<programlisting><![CDATA[package events;
@@ -853,8 +855,8 @@
}]]></programlisting>
<para>
- <literal>Person.hbm.xml</literal>
�Ƃ����V�����}�b�s���O�t�@�C����쐬���Ă�������
- �i�t�@�C���̍ŏ���DTD�ւ̎Q�Ƃ�Y�ꂸ�ɓ���Ă��������j�F
+ <literal>Person.hbm.xml</literal> という新しいマッピングファイルを作成してください
+ (ファイルの最初にDTDへの参照を忘れずに入れてください):
</para>
<programlisting><![CDATA[<hibernate-mapping>
@@ -871,33 +873,33 @@
</hibernate-mapping>]]></programlisting>
<para>
- �Ō��Hibernate�̐ݒ�ɐV�����}�b�s���O��lj����Ă��������F
+ 最後にHibernateの設定に新しいマッピングを追加してください:
</para>
<programlisting><![CDATA[<mapping
resource="events/Event.hbm.xml"/>
<mapping resource="events/Person.hbm.xml"/>]]></programlisting>
<para>
- ����ł͂����2�̃G���e�B�e�B�Ԃ̊֘A��쐬���܂��B
- �l�X���C�x���g�ɎQ���ł��A�C�x���g���Q���҂��͖̂��炩�ł��B
- ����Ȃ���Ȃ�Ȃ��v�̖��́A�����A���d�x�A�R���N�V�����̐U�镑���ł��B
+ それではこれら2つのエンティティ間の関連を作成します。
+ 人々がイベントに参加でき、イベントが参加者を持つのは明らかです。
+ 扱わなければならない設計の問題は、方向、多重度、コレクションの振る舞いです。
</para>
</sect2>
<sect2 id="tutorial-associations-unidirset"
revision="3">
- <title>�P����Set�x�[�X�֘A</title>
+ <title>単方向Setベース関連</title>
<para>
- �C�x���g�̃R���N�V������ <literal>Person</literal>
�N���X�ɒlj����܂��B
-
�������Ă����ƁA�����I�ȃN�G���A�܂�킴�킴<literal>aPerson.getEvents()</literal>��Ăяo�����ɁA
- ����̐l�ɕR�t���C�x���g��ȒP�Ƀi�r�Q�[�g���邱�Ƃ��ł��܂��B
- ��������Java�̃R���N�V�����A<literal>Set</literal> ��g���܂��B
- �R���N�V�����͏d���v�f�����Ȃ����A���Ԃ͎������ɂ͈Ӗ����Ȃ�����ł��B
+ イベントのコレクションを <literal>Person</literal> クラスに追加します。
+
こうしておくと、明示的なクエリ、つまりわざわざ<literal>aPerson.getEvents()</literal>を呼び出さずに、
+ 特定の人に紐付くイベントを簡単にナビゲートすることができます。
+ 私たちはJavaのコレクション、<literal>Set</literal> を使います。
+ コレクションは重複要素を持たないし、順番は私たちには意味がないからです。
</para>
<para>
- <literal>Set</literal> �Ŏ��������P�����A���l�֘A���K�v�ł��B
- Java�N���X��ɑΉ�����R�[�h�����ă}�b�s���O���܂��傤�F
+ <literal>Set</literal> で実装される単方向、多値関連が必要です。
+ Javaクラス内に対応するコードを書いてマッピングしましょう:
</para>
<programlisting><![CDATA[public class Person {
@@ -914,16 +916,16 @@
}]]></programlisting>
<para>
- ���̊֘A��}�b�s���O����O�ɁA���Α��ɂ��čl���Ă��������B
- ���炩�Ȃ��Ƃł����A���͂����P�����ɂ��������ł��B
- �t�ɁA <literal>Event</literal>
���ɂ�ʂ̃R���N�V�������邱�Ƃ�ł��܂��B
- �Ⴆ�� <literal>anEvent.getParticipants()</literal> �̂悤�ɁA
- �o�����Ƀi�r�Q�[�g��������A�������邱�Ƃ�ł��܂��B
- ����͋@�\�I�ɂ݂ĕK�v�ł͂���܂���B
- ����̃C�x���g�ɊW����f�[�^��擾���閾�m�ȃN�G����A���ł���s���邱�Ƃ��o���܂����B
- ���̐v�̑I��͊J���҂ɔC����Ă��āA���̋c�_�ɂ�薾�炩�Ȃ̂͊֘A�̑��d�x�ł��B
- �܂藼����u���v�l�ɂ���A <emphasis>���Α�</emphasis>
�ƌĂ��֘A�ł��B
- ���̂���Hibernate��many-to-many�}�b�s���O��g���܂��F
+ この関連をマッピングする前に、反対側について考えてください。
+ 明らかなことですが、今はこれを単方向にしただけです。
+ 逆に、 <literal>Event</literal> 側にも別のコレクションを作ることもできます。
+ 例えば <literal>anEvent.getParticipants()</literal> のように、
+ 双方向にナビゲートしたければ、そうすることもできます。
+ これは機能的にみて必要ではありません。
+ 特定のイベントに関係するデータを取得する明確なクエリを、いつでも実行することが出来ました。
+ この設計の選択は開発者に任されていて、この議論により明らかなのは関連の多重度です。
+ つまり両側を「多」値にする、 <emphasis>多対多</emphasis> と呼ばれる関連です。
+ そのためHibernateのmany-to-manyマッピングを使います:
</para>
<programlisting><![CDATA[<class name="events.Person"
table="PERSON">
@@ -942,21 +944,21 @@
</class>]]></programlisting>
<para>
- Hibernate�͂���Ƃ������ނ̃R���N�V�����}�b�s���O��T�|�[�g���Ă��܂����A
- �ł��ʓI�Ȃ�̂� <literal><set></literal> �ł��B
- ���Α��֘A�i�܂��� <emphasis>n:m</emphasis>
�G���e�B�e�B�����[�V�����V�b�v�j�ɂ́A
- �֘A�e�[�u�����K�v�ł��B
- ���̃e�[�u���̂��ꂼ��̍s�́A�l�ƃC�x���g�Ԃ̃����N��\�����܂��B
- �e�[�u������ <literal>set</literal> �v�f��
<literal>table</literal> �����Őݒ肵�܂��B
- �l���̊֘A�̎��ʎq�J��������
<literal><key></literal> �v�f�ŁA
- �C�x���g���̃J��������
<literal><many-to-many></literal> ��
<literal>column</literal>
- �����Œ�`���܂��B
- Hibernate�ɃR���N�V�����̃I�u�W�F�N�g�̃N���X
- �i���m�ɂ́A�Q�Ƃ̃R���N�V�����̔��Α��̃N���X�j�����Ȃ���Ȃ�܂���B
+ Hibernateはありとあらゆる種類のコレクションマッピングをサポートしていますが、
+ 最も一般的なものが <literal><set></literal> です。
+ 多対多関連(または <emphasis>n:m</emphasis> エンティティリレーションシップ)には、
+ 関連テーブルが必要です。
+ このテーブルのそれぞれの行は、人とイベント間のリンクを表現します。
+ テーブル名は <literal>set</literal> 要素の
<literal>table</literal> 属性で設定します。
+ 人側の関連の識別子カラム名は <literal><key></literal> 要素で、
+ イベント側のカラム名は <literal><many-to-many></literal> の
<literal>column</literal>
+ 属性で定義します。
+ Hibernateにコレクションのオブジェクトのクラス
+ (正確には、参照のコレクションの反対側のクラス)を教えなければなりません。
</para>
<para>
- ���̂��߂��̃}�b�s���O�̃f�[�^�x�[�X�X�L�[�}�͈ȉ��̂悤�ɂȂ�܂��B�F
+ そのためこのマッピングのデータベーススキーマは以下のようになります。:
</para>
<programlisting><![CDATA[
@@ -976,10 +978,10 @@
</sect2>
<sect2 id="tutorial-associations-working"
revision="2">
- <title>�֘A������</title>
+ <title>関連を働かせる</title>
<para>
- <literal>EventManager</literal>
�̐V�������\�b�h�Ől�X�ƃC�x���g��ꏏ�ɂ��܂��傤�F
+ <literal>EventManager</literal> の新しいメソッドで人々とイベントを一緒にしましょう:
</para>
<programlisting><![CDATA[private void addPersonToEvent(Long
personId, Long eventId) {
@@ -996,28 +998,28 @@
}]]></programlisting>
<para>
- <literal>Person</literal> ��
<literal>Event</literal> ���[�h������A
- ���ʂ̃R���N�V�������\�b�h��g���ĒP���ɂ��̃R���N�V������C�����Ă��������B
- �����̂Ƃ��� <literal>update()</literal> ��
<literal>save()</literal>
- �̖����I�ȌĂяo���͂���܂���B
- Hibernate�́A�C�����ꂽ���Ƃɂ��X�V����K�v�̂���R���N�V���������I�Ɍ��m���܂��B
- ����� <emphasis>�����_�[�e�B�`�F�b�N</emphasis> �ƌĂ�A
- �I�u�W�F�N�g�̖��O��date�v���p�e�B��C�����邱�ƂŎ������Ƃ�\�ł��B
- ����炪 <emphasis>�i��</emphasis> ��Ԃɂ������A
- �܂�����Hibernate <literal>Session</literal>
�Ƀo�C���h����Ă������
- �i�Ⴆ��ƒP��(Unit of Work)�̒��ŒP�Ƀ��[�h�܂��̓Z�[�u���ꂽ�j�A
- Hibernate�͂ǂ�ȕύX����j�^�[���A�x����������(write-behind)��SQL����s���܂��B
- �ʏ�A��ƒP��(Unit of
Work)�̍Ō�ɂ����s����f�[�^�x�[�X�ƃ������̏�Ԃ������鏈���́A
- <emphasis>�t���b�V��</emphasis> �ƌĂ�܂��B
- ���̃R�[�h�ł́A��ƒP��(Unit of
Work)�̓f�[�^�x�[�X�g�����U�N�V�����̃R�~�b�g�i������̓��[���o�b�N�j�ŏI�����܂��B
- ����́A <literal>CurrentSessionContext</literal> �N���X�ɑ���
<literal>thread</literal> ��ݒ肵�����߂ł��B
+ <literal>Person</literal> と
<literal>Event</literal> をロードした後、
+ 普通のコレクションメソッドを使って単純にそのコレクションを修正してください。
+ ご覧のとおり <literal>update()</literal> や
<literal>save()</literal>
+ の明示的な呼び出しはありません。
+ Hibernateは、修正されたことにより更新する必要のあるコレクションを自動的に検知します。
+ これは <emphasis>自動ダーティチェック</emphasis> と呼ばれ、
+ オブジェクトの名前やdateプロパティを修正することで試すことも可能です。
+ それらが <emphasis>永続</emphasis> 状態にある限り、
+ つまり特定のHibernate <literal>Session</literal> にバインドされている限り
+ (例えば作業単位(Unit of Work)の中で単にロードまたはセーブされた)、
+ Hibernateはどんな変更もモニターし、遅延書き込み(write-behind)でSQLを実行します。
+ 通常、作業単位(Unit of Work)の最後にだけ行われるデータベースとメモリの状態を同期させる処理は、
+ <emphasis>フラッシュ</emphasis> と呼ばれます。
+ このコードでは、作業単位(Unit of Work)はデータベーストランザクションのコミット(もしくはロールバック)で終了します。
+ これは、 <literal>CurrentSessionContext</literal> クラスに対して
<literal>thread</literal> を設定したためです。
</para>
<para>
- �قȂ��ƒP��(Unit of Work)�Ől�X�ƃC�x���g���[�h���邱�Ƃ���R�ł��܂��B
- �����łȂ���A�i����ԂɂȂ��Ƃ��i�ȑO�ɉi���ł������Ȃ�A���̏�Ԃ�
<emphasis>�����idetached�j</emphasis>
- �ƌĂт܂��j�A <literal>Session</literal>
�̊O���ŃI�u�W�F�N�g��C�����܂��B
- ���������Ƃ��ɂ̓R���N�V������ύX���邱�Ƃ�\�ł��F
+ 異なる作業単位(Unit of Work)で人々とイベントをロードすることも当然できます。
+ そうでなければ、永続状態にないとき(以前に永続であったなら、この状態を
<emphasis>分離(detached)</emphasis>
+ と呼びます)、 <literal>Session</literal> の外部でオブジェクトを修正します。
+ 分離されるときにはコレクションを変更することも可能です:
</para>
<programlisting><![CDATA[private void addPersonToEvent(Long
personId, Long eventId) {
@@ -1049,20 +1051,20 @@
}]]></programlisting>
<para>
- <literal>update</literal>
�̌Ăяo���͕����I�u�W�F�N�g��Ăщi�������܂��B
- ����́A�V������ƒP��(Unit of Work)�Ƀo�C���h����ƌ�����ł��傤�B
- ���̂��ߕ����̊Ԃɉ�����ꂽ�ǂ̂悤�ȏC����f�[�^�x�[�X�ɃZ�[�u�ł��܂��B
-
�G���e�B�e�B�I�u�W�F�N�g�̃R���N�V�����ւ̏C���i�lj���폜�j����l�ɃZ�[�u�ł��܂��B
+ <literal>update</literal> の呼び出しは分離オブジェクトを再び永続化します。
+ これは、新しい作業単位(Unit of Work)にバインドすると言えるでしょう。
+ そのため分離の間に加えられたどのような修正もデータベースにセーブできます。
+ エンティティオブジェクトのコレクションへの修正(追加・削除)も同様にセーブできます。
</para>
<para>
- ����͍��͂��܂�g���݂�������܂��A
- �����̃A�v���P�[�V�����̐v�ɑg�ݍ��ނ��Ƃ��ł���d�v�ȃR���Z�v�g�ł��B
- ����ł͂��̃G�N�T�T�C�Y�̍Ō�ɁA
- <literal>EventManager</literal>
�̃��C�����\�b�h�ɐV�����A�N�V������lj�����
- �R�}���h���C������Ăяo���Ă݂܂��傤�B
- �l��C�x���g�̎��ʎq���K�v�Ȃ�A <literal>save()</literal>
���\�b�h���Ԃ��Ă���܂�
- �i�ꍇ�ɂ���Ă͎��ʎq��Ԃ����߂Ƀ��\�b�h��C������K�v�����邩�����܂���j�B
+ これは今はあまり使いみちがありませんが、
+ 自分のアプリケーションの設計に組み込むことができる重要なコンセプトです。
+ それではこのエクササイズの最後に、
+ <literal>EventManager</literal> のメインメソッドに新しいアクションを追加して
+ コマンドラインから呼び出してみましょう。
+ 人やイベントの識別子が必要なら、 <literal>save()</literal> メソッドが返してくれます
+ (場合によっては識別子を返すためにメソッドを修正する必要があるかもしれません)。
</para>
<programlisting><![CDATA[else if
(args[0].equals("addpersontoevent")) {
@@ -1073,36 +1075,36 @@
}]]></programlisting>
<para>
- ����͓����悤�ɏd�v��2�̃N���X�A�܂�2�̃G���e�B�e�B�Ԃ̊֘A�̗�ł����B
-
�O�ɏq�ׂ��悤�ɁA�T�^�I�ȃ��f���ɂ́A���ʁu��r�I�d�v�ł͂Ȃ��v���̃N���X�ƌ^������܂��B
- ����܂łɌ����悤�� <literal>int</literal> ��
<literal>String</literal> �̂悤�Ȃ�̂ł��B
- ���̂悤�ȃN���X�� <emphasis>�l�^</emphasis> �ƌ����܂��B
- ���̃C���X�^���X�͓���̃G���e�B�e�B�� <emphasis>�ˑ�</emphasis>
���܂��B
- ���̌^�̃C���X�^���X�͓Ǝ���ID�����܂��A
- �G���e�B�e�B�Ԃŋ��L����邱�Ƃ����܂���
- �i�t�@�[�X�g�l�[���������������Ƃ��Ă�A2�l�̐l�͓���
<literal>firstname</literal>
- �I�u�W�F�N�g��Q�Ƃ��܂���j�B
- �l�^�͂�����JDK��Ɍ�����܂����A���ꂾ���ł͂Ȃ�
- �i���ہAHibernate�A�v���P�[�V�����ɂ����Ă��ׂĂ�JDK�N���X�͒l�^�ƌ��Ȃ��܂��j�A
- �Ⴆ�� <literal>Address</literal> ��
<literal>MonetaryAmount</literal>
- �̂悤�ȓƎ��̈ˑ��N���X�������Ƃ�ł��܂��B
+ これは同じように重要な2つのクラス、つまり2つのエンティティ間の関連の例でした。
+ 前に述べたように、典型的なモデルには、普通「比較的重要ではない」他のクラスと型があります。
+ これまでに見たような <literal>int</literal> や
<literal>String</literal> のようなものです。
+ このようなクラスを <emphasis>値型</emphasis> と言います。
+ このインスタンスは特定のエンティティに <emphasis>依存</emphasis> します。
+ この型のインスタンスは独自のIDを持ちませんし、
+ エンティティ間で共有されることもありません
+ (ファーストネームが同じだったとしても、2人の人は同じ <literal>firstname</literal>
+ オブジェクトを参照しません)。
+ 値型はもちろんJDK内に見つかりますが、それだけではなく
+ (実際、HibernateアプリケーションにおいてすべてのJDKクラスは値型と見なせます)、
+ 例えば <literal>Address</literal> や
<literal>MonetaryAmount</literal>
+ のような独自の依存クラスを書くこともできます。
</para>
<para>
- �l�^�̃R���N�V������v���邱�Ƃ�ł��܂��B
- ����͑��̃G���e�B�e�B�ւ̎Q�Ƃ̃R���N�V�����Ƃ͊T�O�I�ɔ��ɈقȂ�܂����A
- Java�ł͂قƂ�Ǔ����悤�Ɍ����܂��B
+ 値型のコレクションを設計することもできます。
+ これは他のエンティティへの参照のコレクションとは概念的に非常に異なりますが、
+ Javaではほとんど同じように見えます。
</para>
</sect2>
<sect2 id="tutorial-associations-valuecollections">
- <title>�l�̃R���N�V����</title>
+ <title>値のコレクション</title>
<para>
- �l�^�I�u�W�F�N�g�̃R���N�V������ <literal>Person</literal>
�G���e�B�e�B�֒lj����܂��B
- E���[���A�h���X��i�[�������̂ł����A<literal>String</literal>
�^��g���Ă���̂ŁA
- �R���N�V�����͍Ă� <literal>Set</literal> �ł��F
+ 値型オブジェクトのコレクションを <literal>Person</literal> エンティティへ追加します。
+ Eメールアドレスを格納したいのですが、<literal>String</literal> 型を使っているので、
+ コレクションは再び <literal>Set</literal> です:
</para>
<programlisting><![CDATA[private Set emailAddresses = new
HashSet();
@@ -1115,7 +1117,7 @@
}]]></programlisting>
<para>
- ���� <literal>Set</literal> �̃}�b�s���O�ł��F
+ この <literal>Set</literal> のマッピングです:
</para>
<programlisting><![CDATA[<set name="emailAddresses"
table="PERSON_EMAIL_ADDR">
@@ -1124,19 +1126,19 @@
</set>]]></programlisting>
<para>
- �O�̃}�b�s���O�Ɣ�ׂĈႤ�̂� <literal>element</literal>
�̕����ł����A
- Hibernate�ɂ��̃R���N�V���������̃G���e�B�e�B�ւ̎Q�Ƃ�܂܂��A
- <literal>String</literal>
�^�̗v�f�̃R���N�V������܂ނ��Ƃ����܂��B
-
�i�������̖��O(string)��Hibernate�̃}�b�s���O�^�܂��̓R���o�[�^�ł���Ƃ������Ƃł��j�B
- �J��Ԃ��܂����A<literal>set</literal> �v�f��
<literal>table</literal> �����́A
- �R���N�V�����̂��߂̃e�[�u������w�肵�܂��B
- <literal>key</literal>
�v�f�̓R���N�V�����e�[�u���̊O���L�[�J���������`���܂��B
- <literal>element</literal> �v�f��
<literal>column</literal> ������ <literal>String</literal>
- �̒l�����ۂɊi�[�����J�����̖��O���`���܂��B
+ 前のマッピングと比べて違うのは <literal>element</literal> の部分ですが、
+ Hibernateにこのコレクションが他のエンティティへの参照を含まず、
+ <literal>String</literal> 型の要素のコレクションを含むことを教えます。
+ (小文字の名前(string)はHibernateのマッピング型またはコンバータであるということです)。
+ 繰り返しますが、<literal>set</literal> 要素の
<literal>table</literal> 属性は、
+ コレクションのためのテーブル名を指定します。
+ <literal>key</literal> 要素はコレクションテーブルの外部キーカラム名を定義します。
+ <literal>element</literal> 要素の
<literal>column</literal> 属性は <literal>String</literal>
+ の値が実際に格納されるカラムの名前を定義します。
</para>
<para>
- �X�V�����X�L�[�}�����������F
+ 更新したスキーマを見てください:
</para>
<programlisting><![CDATA[
@@ -1154,15 +1156,15 @@
]]></programlisting>
<para>
-
�R���N�V�����e�[�u���̎�L�[�́A���ۂ͗����̃J������g���������L�[�ł��邱�Ƃ��킩��܂��B
- ����͐l���Ƃ�E���[���A�h���X���d���ł��Ȃ��Ƃ������ƂŁA
- Java��set�ɗv�������Z�}���e�B�N�X���̂�̂ł��B
+ コレクションテーブルの主キーは、実際は両方のカラムを使った複合キーであることがわかります。
+ これは人ごとにEメールアドレスが重複できないということで、
+ Javaのsetに要求されるセマンティクスそのものです。
</para>
<para>
- �ȑO�l�ƃC�x���g��֘A�Â����Ƃ��ƑS�������悤�ɁA
- ���⎎���ɃR���N�V�����ɗv�f��lj����邱�Ƃ��ł���悤�ɂȂ�܂����B
- �����Ƃ�Java�ł͓����R�[�h�ł��B
+ 以前人とイベントを関連づけたときと全く同じように、
+ 今や試しにコレクションに要素を追加することができるようになりました。
+ 両方ともJavaでは同じコードです。
</para>
<programlisting><![CDATA[private void addEmailToPerson(Long
personId, String emailAddress) {
@@ -1179,28 +1181,28 @@
}]]></programlisting>
<para>
- ����A�R���N�V�����̏������� <emphasis>fetch</emphasis>
�N�G����g�p���܂���ł����B
- ���̂��߁Agetter���\�b�h�̌Ăяo���ɂ���ăR���N�V�������������邽�߂�SELECT��
- ���s�����̂ŁA�R���N�V�����ɗv�f��lj��ł��܂��B
- SQL�̃��O��Ď����āA�����t�F�b�`��g���čœK�����Ă��������B
+ 今回、コレクションの初期化に <emphasis>fetch</emphasis> クエリを使用しませんでした。
+ そのため、getterメソッドの呼び出しによってコレクションを初期化するためのSELECTが
+ 実行されるので、コレクションに要素を追加できます。
+ SQLのログを監視して、即時フェッチを使って最適化してください。
</para>
</sect2>
<sect2 id="tutorial-associations-bidirectional"
revision="1">
- <title>�o�����֘A</title>
+ <title>双方向関連</title>
<para>
- ���ɑo�����֘A��}�b�s���O���܂��B
- Java�ŗ�������l�ƃC�x���g�̊֘A�삳���܂��B
- ������A�f�[�^�x�[�X�X�L�[�}�͕ς��܂��A���d�x�͑��Α��̂܂܂ł��B
- �����[�V���i���f�[�^�x�[�X�̓l�b�g���[�N�v���O���~���O�������_��Ȃ̂ŁA
- �i�r�Q�[�V�����̕����̂悤�Ȃ�̂�K�v�Ƃ��܂���B
- �f�[�^�͂�����̕��@�Ō����蕜���ł���Ƃ������Ƃł��B
+ 次に双方向関連をマッピングします。
+ Javaで両側から人とイベントの関連を動作させます。
+ もちろん、データベーススキーマは変わりませんが、多重度は多対多のままです。
+ リレーショナルデータベースはネットワークプログラミング言語よりも柔軟なので、
+ ナビゲーションの方向のようなものを必要としません。
+ データはあらゆるの方法で見たり復元できるということです。
</para>
<para>
- �܂� <literal>Event</literal>
�C�x���g�N���X�ɎQ���҂̃R���N�V������lj����܂��F
+ まず <literal>Event</literal> イベントクラスに参加者のコレクションを追加します:
</para>
<programlisting><![CDATA[private Set participants = new HashSet();
@@ -1214,7 +1216,7 @@
}]]></programlisting>
<para>
- ����ł� <literal>Event.hbm.xml</literal>
�Ŋ֘A�̂����瑤��}�b�s���O���Ă��������B
+ それでは <literal>Event.hbm.xml</literal> で関連のこちら側をマッピングしてください。
</para>
<programlisting><![CDATA[<set name="participants"
table="PERSON_EVENT" inverse="true">
@@ -1223,43 +1225,43 @@
</set>]]></programlisting>
<para>
- �����̂Ƃ���A������̃}�b�s���O�h�L�������g(XML�t�@�C��)�ł�A���ʂ�
<literal>set</literal>
- �}�b�s���O��g���Ă��܂��B
- <literal>key</literal> ��
<literal>many-to-many</literal> �̃J���������A
- �����̃}�b�s���O�h�L�������g�œ���ւ��ɂȂ��Ă��邱�Ƃɒ��ڂ��Ă��������B
- �����ōł�d�v�Ȓlj����ڂ́A <literal>Event</literal>
�̃R���N�V�����}�b�s���O�� <literal>set</literal>
- �v�f�ɂ��� <literal>inverse="true"</literal>
�����ł��B
+ ご覧のとおり、いずれのマッピングドキュメント(XMLファイル)でも、普通の <literal>set</literal>
+ マッピングを使っています。
+ <literal>key</literal> と
<literal>many-to-many</literal> のカラム名が、
+ 両方のマッピングドキュメントで入れ替えになっていることに注目してください。
+ ここで最も重要な追加項目は、 <literal>Event</literal> のコレクションマッピングの
<literal>set</literal>
+ 要素にある <literal>inverse="true"</literal> 属性です。
</para>
<para>
- ���̎w��̈Ӗ��́A2�̊Ԃ̃G���e�B�e�B�Ԃ̃����N�ɂ��Ă̏���T���K�v������Ƃ��A
- Hibernate�͔��Α��̃G���e�B�e�B�A�܂� <literal>Person</literal>
�N���X����T���Ƃ������Ƃł��B
- ��x2�̃G���e�B�e�B�Ԃ̑o���������N���ǂ̂悤�ɍ쐬����邩���킩��A
- ����𗝉��邱�Ƃ͂ƂĂ�ȒP�ł��B
+ この指定の意味は、2つの間のエンティティ間のリンクについての情報を探す必要があるとき、
+ Hibernateは反対側のエンティティ、つまり <literal>Person</literal>
クラスから探すということです。
+ 一度2つのエンティティ間の双方向リンクがどのように作成されるかがわかれば、
+ これを理解することはとても簡単です。
</para>
</sect2>
<sect2 id="tutorial-associations-usingbidir">
- <title>�o���������N�̓���</title>
+ <title>双方向リンクの動作</title>
<para>
-
�܂��AHibernate���ʏ��Java�̃Z�}���e�B�N�X�ɉe����y�ڂ��Ȃ����Ƃ�S�ɗ��߂Ă����Ă��������B
- �������́A�P�����̗�Ƃ��Ăǂ̂悤�� <literal>Person</literal> ��
<literal>Event</literal>
- �̊Ԃ̃����N��쐬�����ł��傤���H
- <literal>Person</literal>
�̃C���X�^���X�̃C�x���g�ւ̎Q�Ƃ̃R���N�V������
- <literal>Event</literal> �̃C���X�^���X��lj����܂����B
- ���̂��߂��̃����N��o�����ɂ�������A
- ������O�ł������Α��ɂ�������Ƃ��Ȃ���Ȃ�܂���B
- <literal>Event</literal> �̃R���N�V������
<literal>Person</literal> �ւ�
- �Q�Ƃ�lj�����Ƃ������Ƃł��B
- ���́u�����Ń����N��ݒ肷�邱�Ɓv�͐�ɕK�v�Ȃ̂ŁA�����ĖY��Ȃ��ł��������B
+ まず、Hibernateが通常のJavaのセマンティクスに影響を及ぼさないことを心に留めておいてください。
+ 私たちは、単方向の例としてどのように <literal>Person</literal> と
<literal>Event</literal>
+ の間のリンクを作成したでしょうか?
+ <literal>Person</literal> のインスタンスのイベントへの参照のコレクションに
+ <literal>Event</literal> のインスタンスを追加しました。
+ そのためこのリンクを双方向にしたければ、
+ 当たり前ですが反対側にも同じことをしなければなりません。
+ <literal>Event</literal> のコレクションに
<literal>Person</literal> への
+ 参照を追加するということです。
+ この「両側でリンクを設定すること」は絶対に必要なので、決して忘れないでください。
</para>
<para>
- �����̊J���҂͐T�d�Ƀv���O��������̂ŁA
- �G���e�B�e�B�̗����ɐ������֘A��ݒ肷�郊���N�Ǘ����\�b�h��쐬���܂��B
- �Ⴆ�� <literal>Person</literal> �ł͈ȉ��̂悤�ɂȂ�܂��B�F
+ 多くの開発者は慎重にプログラムするので、
+ エンティティの両側に正しく関連を設定するリンク管理メソッドを作成します。
+ 例えば <literal>Person</literal> では以下のようになります。:
</para>
<programlisting><![CDATA[protected Set getEvents() {
@@ -1281,52 +1283,52 @@
}]]></programlisting>
<para>
-
�R���N�V�����̃Q�b�g�ƃZ�b�g���\�b�h������protected�ɂȂ��Ă��邱�Ƃɒ��ӂ��Ă��������B
- ����͓����p�b�P�[�W�̃N���X��T�u�N���X�̃��\�b�h�͈ˑR�A�N�Z�X���\�ł����A
-
�i�قƂ�ǁj���̃p�b�P�[�W�O�̂ǂ̃N���X�ł���ڂ��̃R���N�V������䖳���ɂ��邱�Ƃ�h���܂��B
- �����炭���Α��̃R���N�V�����ɂ�������Ƃ������������ł��傤�B
+ コレクションのゲットとセットメソッドが現在protectedになっていることに注意してください。
+ これは同じパッケージのクラスやサブクラスのメソッドは依然アクセスが可能ですが、
+ (ほとんど)そのパッケージ外のどのクラスでも直接そのコレクションを台無しにすることを防ぎます。
+ おそらく反対側のコレクションにも同じことをした方がいいでしょう。
</para>
<para>
- <literal>inverse</literal>
�}�b�s���O�����Ƃ͂����������ł��傤���H
- �J���҂�Java�ɂƂ��ẮA�o���������N�͒P�ɗ����̎Q�Ƃ𐳂����ݒ肷��Ƃ������Ƃł��B
- ������Hibernate�́i����ᔽ����邽�߂ɁjSQL��
<literal>INSERT</literal> �� <literal>UPDATE</literal>
- ���𐳊m�ɕύX���邽�߂̏\���ȏ������Ă��Ȃ��̂ŁA
- �o�����֘A�v���p�e�B�������߂̉��炩�̏�����K�v�Ƃ��܂��B
- �֘A�̕Б��� <literal>inverse</literal>
�ɐݒ肷�邱�ƂŁAHibernate�͊�{�I�ɂ͐ݒ肵���������A
- ���Α��� <emphasis>��</emphasis> �Ƃ��čl���܂��B
-
���ꂾ���ŁAHibernate�͕������i�r�Q�[�V�������f����SQL�f�[�^�x�[�X�X�L�[�}�֕ϊ�����Ƃ���
- ���ׂĂ̖��ɂ��܂��Ώ��ł��܂��B
- �o���Ă����Ȃ���Ȃ�Ȃ����[���͊ȒP�ł��B
- �o�����֘A�͕K���Б��� <literal>inverse</literal>
�ɂ���K�v������Ƃ������Ƃł��B
- ��Α��֘A�ł͂���͑����łȂ���Ȃ�܂���B
- ���Α��֘A�ł͂ǂ��瑤�ł�\���܂���B�ǂ���ł�Ⴂ�͂���܂���B
+ <literal>inverse</literal> マッピング属性とはいったい何でしょうか?
+ 開発者とJavaにとっては、双方向リンクは単に両側の参照を正しく設定するということです。
+ しかしHibernateは(制約違反を避けるために)SQLの <literal>INSERT</literal> と
<literal>UPDATE</literal>
+ 文を正確に変更するための十分な情報を持っていないので、
+ 双方向関連プロパティを扱うための何らかの助けを必要とします。
+ 関連の片側を <literal>inverse</literal>
に設定することで、Hibernateは基本的には設定した側を無視し、
+ 反対側の <emphasis>鏡</emphasis> として考えます。
+ これだけで、Hibernateは方向を持つナビゲーションモデルをSQLデータベーススキーマへ変換するときの
+ すべての問題にうまく対処できます。
+ 覚えておかなければならないルールは簡単です。
+ 双方向関連は必ず片側を <literal>inverse</literal> にする必要があるということです。
+ 一対多関連ではそれは多側でなければなりません。
+ 多対多関連ではどちら側でも構いません。どちらでも違いはありません。
</para>
</sect2>
<para>
- �ł͂��������Web�A�v���P�[�V�����ɂ��Ă݂܂��傤�B
+ ではこれを小さなWebアプリケーションにしてみましょう。
</para>
</sect1>
<sect1 id="tutorial-webapp">
- <title>�p�[�g3 - EventManager Web�A�v���P�[�V����</title>
+ <title>パート3 - EventManager Webアプリケーション</title>
<para>
- Hibernate��Web�A�v���P�[�V�����́A�X�^���h�A���[���̃A�v���P�[�V�����̂悤��
- <literal>Session</literal> ��
<literal>Transaction</literal> ��g�p���܂��B
- �������������̈�ʓI�ȃp�^�[�����𗧂��܂��B
- ������ <literal>EventManagerServlet</literal>
��쐬���܂��B���̃T�[�u���b�g�́A
-
�f�[�^�x�[�X�Ɋi�[�����S�ẴC�x���g���X�g�ɂł��A�����HTML�t�H�[������V�����C�x���g����͂ł����̂ł��B
+ HibernateのWebアプリケーションは、スタンドアローンのアプリケーションのように
+ <literal>Session</literal> と
<literal>Transaction</literal> を使用します。
+ しかしいくつかの一般的なパターンが役立ちます。
+ ここで <literal>EventManagerServlet</literal> を作成します。このサーブレットは、
+ データベースに格納した全てのイベントをリストにでき、さらにHTMLフォームから新しいイベントを入力できるものです。
</para>
<sect2 id="tutorial-webapp-servlet" revision="1">
- <title>��{�I��Servlet�̋L�q</title>
+ <title>基本的なServletの記述</title>
<para>
- �V�����N���X��A�\�[�X�f�B���N�g���� <literal>events</literal>
�p�b�P�[�W�ɍ쐬���Ă��������B
+ 新しいクラスを、ソースディレクトリの <literal>events</literal> パッケージに作成してください。
</para>
<programlisting><![CDATA[package events;
@@ -1339,8 +1341,8 @@
}]]></programlisting>
<para>
- Servlet��HTTP�� <literal>GET</literal>
���N�G�X�g�݂̂�������̂ŁA
- <literal>doGet()</literal> ��������܂��B
+ ServletはHTTPの <literal>GET</literal> リクエストのみを処理するので、
+ <literal>doGet()</literal> を実装します。
</para>
<programlisting><![CDATA[protected void doGet(HttpServletRequest
request,
@@ -1369,37 +1371,37 @@
}]]></programlisting>
<para>
- ����� <emphasis>session-per-request</emphasis>
�Ƃ����p�^�[���ł��B
- Servlet�����N�G�X�g����ƁA <literal>SessionFactory</literal>
��
- <literal>getCurrentSession()</literal> �̍ŏ��̌Ăяo���ŁA
- Hibernate�̐V���� <literal>Session</literal> ���J����܂��B
- ���̂Ƃ��f�[�^�x�[�X�g�����U�N�V�������J�n����܂��B
- �f�[�^�̓ǂݏ����Ɋւ�炸�A���ׂẴf�[�^�A�N�Z�X�̓g�����U�N�V������ōs���܂��B
- �i�A�v���P�[�V������ł̓I�[�g�R�~�b�g���[�h��g�p���܂���j�B
+ これは <emphasis>session-per-request</emphasis> というパターンです。
+ Servletがリクエストを受け取ると、 <literal>SessionFactory</literal> の
+ <literal>getCurrentSession()</literal> の最初の呼び出しで、
+ Hibernateの新しい <literal>Session</literal> が開かれます。
+ そのときデータベーストランザクションが開始されます。
+ データの読み書きに関わらず、すべてのデータアクセスはトランザクション内で行います。
+ (アプリケーション内ではオートコミットモードを使用しません)。
</para>
<para>
- ���ɁA���N�G�X�g�̃A�N�V�����͏�������A���X�|���X�ł���HTML���`�悳��܂��B
- ����ɂ��Ă͂����ɐ�����܂��B
+ 次に、リクエストのアクションは処理され、レスポンスであるHTMLが描画されます。
+ これについてはすぐに説明します。
</para>
<para>
- �Ō�Ƀ��N�G�X�g�̏�����HTML�`�悪���������Ƃ��ɁA��ƒP��(Unit of
Work)��I�����܂��B
-
���������`�撆�ɖ�肪���������ꍇ�Aexception���������ăf�[�^�x�[�X�g�����U�N�V�������[���o�b�N���܂��B
- ����� <literal>session-per-request</literal>
�p�^�[�����������܂��B
-
�S�ẴT�[�u���b�g�Ƀg�����U�N�V�������E�̃R�[�h��������ɁA�T�[�u���b�g�t�B���^�ɋL�q���邱�Ƃ�\�ł��B
- <emphasis>Open Session in View</emphasis>
�ƌĂ�邱�̃p�^�[���ɂ��ẮA
- Hibernate��Web�T�C�g��Wiki��Q�Ƃ��Ă��������B
-
�T�[�u���b�g�ł͂Ȃ�JSP��HTML�`����悤�Ƃ���ƁA�����ɂ��̃p�^�[���ɂ��Ă̏�K�v�ɂȂ�ł��傤�B
+ 最後にリクエストの処理とHTML描画が完了したときに、作業単位(Unit of Work)を終了します。
+ もし処理や描画中に問題が発生した場合、exceptionが投げられてデータベーストランザクションをロールバックします。
+ これで <literal>session-per-request</literal> パターンが完了します。
+ 全てのサーブレットにトランザクション境界のコードを書く代わりに、サーブレットフィルタに記述することも可能です。
+ <emphasis>Open Session in View</emphasis> と呼ばれるこのパターンについては、
+ HibernateのWebサイトやWikiを参照してください。
+ サーブレットではなくJSPでHTML描画をしようとすると、すぐにこのパターンについての情報が必要になるでしょう。
</para>
</sect2>
<sect2 id="tutorial-webapp-processing" revision="1">
- <title>�����ƕ`��</title>
+ <title>処理と描画</title>
<para>
- �ł́A���N�G�X�g�̏����ƃy�[�W�̕`���������܂��B
+ では、リクエストの処理とページの描画を実装します。
</para>
<programlisting><![CDATA[// Write HTML header
@@ -1430,11 +1432,11 @@
out.close();]]></programlisting>
<para>
-
Java��HTML�����݂���R�[�f�B���O�X�^�C���́A��蕡�G�ȃA�v���P�[�V�����ɂ͓K���Ă��Ȃ��ł��傤
-
�i���̃`���[�g���A���ł́A��{�I��Hibernate�̃R���Z�v�g�����Ă��邾���ł��邱�Ƃ�o���Ă����Ă��������j�B
- ���̃R�[�h��HTML�̃w�b�_�[�ƃt�b�^�[�̋L�q�ł��B
-
���̃y�[�W�ɂ́A�C�x���g����͂���HTML�t�H�[���ƁA�f�[�^�x�[�X�ɂ���S�ẴC�x���g�̃��X�g���\������܂��B
- �ŏ��̃��\�b�h�͂����P����HTML�o�͂ł��B
+ JavaとHTMLが混在するコーディングスタイルは、より複雑なアプリケーションには適していないでしょう
+ (このチュートリアルでは、基本的なHibernateのコンセプトを示しているだけであることを覚えておいてください)。
+ このコードはHTMLのヘッダーとフッターの記述です。
+ このページには、イベントを入力するHTMLフォームと、データベースにある全てのイベントのリストが表示されます。
+ 最初のメソッドはごく単純なHTML出力です。
</para>
<programlisting><![CDATA[private void printEventForm(PrintWriter
out) {
@@ -1447,8 +1449,8 @@
}]]></programlisting>
<para>
- <literal>listEvents()</literal>
���\�b�h�́A���݂̃X���b�h�Ɍ��т�
- Hibernate�� <literal>Session</literal>
��g�p���āA�N�G������s���܂��B
+ <literal>listEvents()</literal> メソッドは、現在のスレッドに結びつく
+ Hibernateの <literal>Session</literal> を使用して、クエリを実行します。
</para>
<programlisting><![CDATA[private void listEvents(PrintWriter out,
SimpleDateFormat dateFormatter) {
@@ -1474,8 +1476,8 @@
}]]></programlisting>
<para>
- �Ō�ɁA <literal>store</literal> �A�N�V������
<literal>createAndStoreEvent()</literal> ���\�b�h��
- �Ăяo���܂��B���̃��\�b�h�ł���݂̃X���b�h��
<literal>Session</literal> �𗘗p���܂��B
+ 最後に、 <literal>store</literal> アクションが
<literal>createAndStoreEvent()</literal> メソッドを
+ 呼び出します。このメソッドでも現在のスレッドの <literal>Session</literal> を利用します。
</para>
<programlisting><![CDATA[protected void createAndStoreEvent(String
title, Date theDate) {
@@ -1488,26 +1490,26 @@
}]]></programlisting>
<para>
- ����ŃT�[�u���b�g�̊����ł��B
- �T�[�u���b�g�ւ̃��N�G�X�g�́A��� <literal>Session</literal> ��
- <literal>Transaction</literal> �ŏ��������ł��傤�B
- �ŏ��̃X�^���h�A���[���̃A�v���P�[�V�����̂悤�ɁA
- Hibernate�͎����I�ɂ����̃I�u�W�F�N�g����s����X���b�h�Ɍ��ѕt���邱�Ƃ��ł��܂��B
- ����ɂ��A�J���҂����R�ɃR�[�h���C���[�����ł��A
- �D���ȕ��@�� <literal>SessionFactory</literal>
�ւ̃A�N�Z�X���ł���悤�ɂȂ�܂��B
- �ʏ�A�J���҂͂�������ꂽ�f�U�C����g�p���āA�f�[�^�A�N�Z�X�̃R�[�h��
- �f�[�^�A�N�Z�X�I�u�W�F�N�g�Ɉړ�����ł��傤�iDAO�p�^�[���j�B
- ��葽���̗�́AHibernate��Wiki��Q�Ƃ��Ă��������B
+ これでサーブレットの完成です。
+ サーブレットへのリクエストは、一つの <literal>Session</literal> と
+ <literal>Transaction</literal> で処理されるでしょう。
+ 最初のスタンドアローンのアプリケーションのように、
+ Hibernateは自動的にこれらのオブジェクトを実行するスレッドに結び付けることができます。
+ これにより、開発者が自由にコードをレイヤー分けでき、
+ 好きな方法で <literal>SessionFactory</literal> へのアクセスができるようになります。
+ 通常、開発者はより洗練されたデザインを使用して、データアクセスのコードを
+ データアクセスオブジェクトに移動するでしょう(DAOパターン)。
+ より多くの例は、HibernateのWikiを参照してください。
</para>
</sect2>
<sect2 id="tutorial-webapp-deploy">
- <title>�f�v���C�ƃe�X�g</title>
+ <title>デプロイとテスト</title>
<para>
- ���̃A�v���P�[�V�����̃f�v���C�̂��߂ɁAWeb�A�[�J�C�u�iWAR�j��쐬���Ă��������B
- �ȉ���Ant�^�[�Q�b�g�� <literal>build.xml</literal>
�ɉ����Ă��������B
+ このアプリケーションのデプロイのために、Webアーカイブ(WAR)を作成してください。
+ 以下のAntターゲットを <literal>build.xml</literal> に加えてください。
</para>
<programlisting><![CDATA[<target name="war"
depends="compile">
@@ -1521,10 +1523,10 @@
</target>]]></programlisting>
<para>
- ���̃^�[�Q�b�g�� <literal>hibernate-tutorial.war</literal>
�Ƃ����t�@�C����
- �v���W�F�N�g�f�B���N�g���ɍ쐬���܂��B
- ���̃t�@�C���͂��ׂẴ��C�u������ <literal>web.xml</literal>
�L�q�q��܂�ł���A
- �v���W�F�N�g�̃x�[�X�f�B���N�g���ɒu����邱�Ƃ���҂���܂��B
+ このターゲットは <literal>hibernate-tutorial.war</literal> というファイルを
+ プロジェクトディレクトリに作成します。
+ このファイルはすべてのライブラリと <literal>web.xml</literal> 記述子を含んでおり、
+ プロジェクトのベースディレクトリに置かれることを期待されます。
</para>
<programlisting><![CDATA[<?xml version="1.0"
encoding="UTF-8"?>
@@ -1545,29 +1547,29 @@
</web-app>]]></programlisting>
<para>
- Web�A�v���P�[�V�����̃R���p�C���ƃf�v���C�̑O�ɁA
<literal>jsdk.jar</literal> �Ƃ���
- �lj��̃��C�u�������K�v�Ȃ��Ƃɒ��ӂ��Ă��������B
- �����Java�T�[�u���b�g�̊J���L�b�g�ł��B
- ����܂����̃��C�u���������Ă��Ȃ��Ȃ�ASun�̃E�F�u�T�C�g�œ��肵�āA
- ���C�u�����f�B���N�g���ɃR�s�[���Ă��������B
- �������A����̓R���p�C���ɂ̂ݎg�p����AWAR�p�b�P�[�W����͏��O����܂��B
+ Webアプリケーションのコンパイルとデプロイの前に、 <literal>jsdk.jar</literal> という
+ 追加のライブラリが必要なことに注意してください。
+ これはJavaサーブレットの開発キットです。
+ もしまだこのライブラリを持っていないなら、Sunのウェブサイトで入手して、
+ ライブラリディレクトリにコピーしてください。
+ しかし、これはコンパイルにのみ使用され、WARパッケージからは除外されます。
</para>
<para>
- �r���h�ƃf�v���C�̂��߂ɁA�v���W�F�N�g�f�B���N�g���� <literal>ant
war</literal> ��Ăяo���A
- <literal>hibernate-tutorial.war</literal> �t�@�C����Tomcat��
<literal>webapp</literal>
- �f�B���N�g���ɃR�s�[���Ă��������B
-
�܂�Tomcat��C���X�g�[�����Ă��Ȃ���A�_�E�����[�h���āA�ȉ��̃C���X�g�[���K�C�h�ɏ]���Ă��������B
-
�������A���̃A�v���P�[�V�����̃f�v���C���邽�߂ɁATomcat�̐ݒ��ύX����K�v�͂���܂���B
+ ビルドとデプロイのために、プロジェクトディレクトリで <literal>ant war</literal> を呼び出し、
+ <literal>hibernate-tutorial.war</literal> ファイルをTomcatの
<literal>webapp</literal>
+ ディレクトリにコピーしてください。
+ まだTomcatをインストールしていなければ、ダウンロードして、以下のインストールガイドに従ってください。
+ しかし、このアプリケーションのデプロイするために、Tomcatの設定を変更する必要はありません。
</para>
<para>
- ��x�f�v���C����Tomcat��N������A
<literal>http://localhost:8080/hibernate-tutorial/eventmanager</literal> ��
- �A�v���P�[�V�����ւ̃A�N�Z�X���\�ł��B
- �ŏ��̃��N�G�X�g���쐬�����T�[�u���b�g�ɓn�����Ƃ��ɁATomcat�̃��O��
- Hibernate�̏�����������m�F���Ă�������
- �i <literal>HibernateUtil</literal>
��̐ÓI�������u���b�N���Ă�Ă��܂��j�B
- �܂��Aexception�����������Ȃ�ڍׂ�m�F���Ă��������B
+ 一度デプロイしてTomcatを起動すれば、
<literal>http://localhost:8080/hibernate-tutorial/eventmanager</literal> で
+ アプリケーションへのアクセスが可能です。
+ 最初のリクエストが作成したサーブレットに渡ったときに、Tomcatのログで
+ Hibernateの初期化処理を確認してください
+ ( <literal>HibernateUtil</literal> 内の静的初期化ブロックが呼ばれています)。
+ また、exceptionが発生したなら詳細を確認してください。
</para>
</sect2>
@@ -1575,24 +1577,24 @@
</sect1>
<sect1 id="tutorial-summary" revision="1">
- <title>�v��</title>
+ <title>要約</title>
<para>
- ���̃`���[�g���A���ł́A�ȒP�ȃX�^���h�A���[����Hibernate�A�v���P�[�V������
- ���K�͂�Web�A�v���P�[�V�����������߂̊�{��Љ�܂����B
+ このチュートリアルでは、簡単なスタンドアローンのHibernateアプリケーションと
+ 小規模のWebアプリケーションを書くための基本を紹介しました。
</para>
<para>
- ���Hibernate�Ɏ��M������A���t�@�����X�h�L�������g�̖ڎ��ɖڂ�ʂ��āA
- �ʔ��������Ǝv���g�s�b�N��T���Ă��������B
- �ł�p�ɂɎ��₪����̂́A�g�����U�N�V���������i<xref
linkend="transactions"/>�j�A
- �t�F�b�`�̃p�t�H�[�}���X�i<xref linkend="performance"/>�j�A
- API�̎g�����i<xref linkend="objectstate"/>�j�ƃN�G��
- �i<xref linkend="objectstate-querying"/>�j�ł��B
+ もうHibernateに自信があれば、リファレンスドキュメントの目次に目を通して、
+ 面白そうだと思うトピックを探してください。
+ 最も頻繁に質問があるのは、トランザクション処理(<xref linkend="transactions"/>)、
+ フェッチのパフォーマンス(<xref linkend="performance"/>)、
+ APIの使い方(<xref linkend="objectstate"/>)とクエリ
+ (<xref linkend="objectstate-querying"/>)です。
</para>
<para>
-
����Ɂi���ʂȁj�`���[�g���A�����K�v�Ȃ�AHibernate�E�F�u�T�C�g��Y�ꂸ�Ƀ`�F�b�N���Ă��������B
+ さらに(特別な)チュートリアルが必要なら、Hibernateウェブサイトを忘れずにチェックしてください。
</para>
</sect1>
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/content/xml.xml
===================================================================
--- core/trunk/documentation/manual/ja-JP/src/main/docbook/content/xml.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++ core/trunk/documentation/manual/ja-JP/src/main/docbook/content/xml.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,48 +1,50 @@
-<?xml version="1.0" encoding="Shift_JIS"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
<chapter id="xml">
- <title>XML�}�b�s���O</title>
+ <title>XMLマッピング</title>
-
<para><emphasis>XML�}�b�s���O��Hibernate3.0�ł͎����I�ȋ@�\�ł���A���Ɋ����I�ɊJ�����ł��B</emphasis></para>
+
<para><emphasis>XMLマッピングはHibernate3.0では試験的な機能であり、非常に活動的に開発中です。</emphasis></para>
<sect1 id="xml-intro" revision="1">
- <title>XML�f�[�^�ł̍��</title>
+ <title>XMLデータでの作業</title>
<para>
- Hibernate�ł͉i������POJO��g���č�Ƃ���̂Ƃقړ����悤�Ȃ����ŁA
- �i������XML�f�[�^��g���č�Ƃł��܂��B
+ Hibernateでは永続性のPOJOを使って作業するのとほぼ同じようなやり方で、
+ 永続性のXMLデータを使って作業できます。
</para>
<para>
- Hibernate��XML�c���[�𑀍삷�邽�߂�API�Ƃ���dom4j��T�|�[�g���Ă��܂��B
- �f�[�^�x�[�X����dom4j�̃c���[������N�G���������Ƃ��ł��A
- �c���[�ɑ��čs�����C���͎����I�Ƀf�[�^�x�[�X�Ɠ�������܂��B
+ HibernateはXMLツリーを操作するためのAPIとしてdom4jをサポートしています。
+ データベースからdom4jのツリーを復元するクエリを書くことができ、
+ ツリーに対して行った修正は自動的にデータベースと同期されます。
- �܂�XML�h�L�������g��擾���邱�Ƃ��ł��Adom4j��g���ăh�L�������g��p�[�X���A
- Hibernate�̔C�ӂ̊�{�����g���ăf�[�^�x�[�X�֏������ނ��Ƃ��ł��܂��B�F
- �܂�A<literal>persist(), saveOrUpdate(), merge(), delete(),
replicate()</literal>
- ����ł�(�}�[�W�͂܂��T�|�[�g���Ă��܂���)�B
+ またXMLドキュメントを取得することができ、dom4jを使ってドキュメントをパースし、
+ Hibernateの任意の基本操作を使ってデータベースへ書き込むことができます。:
+ つまり、<literal>persist(), saveOrUpdate(), merge(), delete(),
replicate()</literal>
+ 操作です(マージはまだサポートしていません)。
</para>
<para>
- �f�[�^�̃C���|�[�g/�G�N�X�|�[�g�A
- JMS�ɂ��G���e�B�e�B�f�[�^�̊O������SOAP�AXSLT�x�[�X�̃��|�[�g�ȂǁA
- ���̋@�\�ɂ͑����̗p�r������܂��B
+ データのインポート/エクスポート、
+ JMSによるエンティティデータの外部化やSOAP、XSLTベースのレポートなど、
+ この機能には多くの用途があります。
</para>
<para>
- �P��̃}�b�s���O�́A�N���X�̃v���p�e�B��XML�h�L�������g�̃m�[�h��
- �����Ƀf�[�^�x�[�X�փ}�b�s���O���邽�߂Ɏg�����Ƃ��ł��܂��B
- �܂��}�b�s���O����N���X���Ȃ���A
- XML������}�b�s���O���邽�߂Ɏg�����Ƃ��ł��܂��B
+ 単一のマッピングは、クラスのプロパティとXMLドキュメントのノードを
+ 同時にデータベースへマッピングするために使うことができます。
+ またマッピングするクラスがなければ、
+ XMLだけをマッピングするために使うことができます。
</para>
<sect2 id="xml-intro-mapping">
- <title>XML�ƃN���X�̃}�b�s���O���Ɏw�肷��</title>
+ <title>XMLとクラスのマッピングを同時に指定する</title>
<para>
- �����POJO��XML���Ƀ}�b�s���O�����ł��B�F
+ これはPOJOとXMLを同時にマッピングする例です。:
</para>
<programlisting><![CDATA[<class name="Account"
@@ -68,10 +70,10 @@
</sect2>
<sect2 id="xml-onlyxml">
- <title>XML�}�b�s���O������w�肷��</title>
+ <title>XMLマッピングだけを指定する</title>
<para>
- �����POJO�N���X���Ȃ��}�b�s���O�̗�ł��B�F
+ これはPOJOクラスがないマッピングの例です。:
</para>
<programlisting><![CDATA[<class entity-name="Account"
@@ -99,11 +101,11 @@
</class>]]></programlisting>
<para>
- ���̃}�b�s���O�ɂ��Adom4j�c���[���A
- �v���p�e�B��/�l�̑g�̃O���t�ijava��
<literal>Map</literal>�j�Ƃ���
- �f�[�^�ɃA�N�Z�X�ł��܂��B
+ このマッピングにより、dom4jツリーか、
+ プロパティ名/値の組のグラフ(javaの <literal>Map</literal>)として
+ データにアクセスできます。
- �v���p�e�B�̖��O�́AHQL�N�G���[��ŎQ�Ƃł��鏃���Ș_���\���ł��B
+ プロパティの名前は、HQLクエリー内で参照できる純粋な論理構造です。
</para>
</sect2>
@@ -111,53 +113,53 @@
</sect1>
<sect1 id="xml-mapping" revision="1">
- <title>XML�}�b�s���O�̃��^�f�[�^</title>
+ <title>XMLマッピングのメタデータ</title>
<para>
-
������Hibernate�̃}�b�s���O�v�f�́@<literal>node</literal>�@�������g�p�ł��܂��B
- ����ɂ��XML�����̖��O��v���p�e�B��G���e�B�e�B�f�[�^��ێ�����v�f��w��ł��܂��B
-
<literal>node</literal>�@�����̃t�H�[�}�b�g�͈ȉ��̒���1�łȂ���Ȃ�܂���B�F
+ 多くのHibernateのマッピング要素は <literal>node</literal> 属性が使用できます。
+ これによりXML属性の名前やプロパティやエンティティデータを保持する要素を指定できます。
+ <literal>node</literal> 属性のフォーマットは以下の中の1つでなければなりません。:
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
- <literal>"element-name"</literal> -
�w�肵��XML�v�f�փ}�b�s���O���܂�
+ <literal>"element-name"</literal> - 指定したXML要素へマッピングします
</para>
</listitem>
<listitem>
<para>
- <literal>"@attribute-name"</literal> -
�w�肵��XML�����փ}�b�s���O���܂�
+ <literal>"@attribute-name"</literal> -
指定したXML属性へマッピングします
</para>
</listitem>
<listitem>
<para>
- <literal>"."</literal> -�@�e�v�f�փ}�b�s���O���܂�
+ <literal>"."</literal> - 親要素へマッピングします
</para>
</listitem>
<listitem>
<para>
<literal>"element-name/@attribute-name"</literal> -
- �w�肵���G�������g�̎w�肵�������փ}�b�s���O���܂�
+ 指定したエレメントの指定した属性へマッピングします
</para>
</listitem>
</itemizedlist>
<para>
- �R���N�V�����ƒP��̒l�̊֘A�ɑ��āA
- ���܂��� <literal>embed-xml</literal> ����������܂��B
- �f�t�H���g�� <literal>embed-xml="true"</literal>
�Ɛݒ肵���ꍇ�A
- �֘A����G���e�B�e�B(�l�^�̃R���N�V����)��XML�c���[�́A
- ���ڊ֘A���L����G���e�B�e�B��XML�c���[��ɖ��ߍ��܂�܂��B
- ���ɁA<literal>embed-xml="false"</literal> �Ɛݒ肵���ꍇ�A
- �Q�Ƃ���鎯�ʎq�̒l���������d�x�P���̊֘A�ɑ���XML�Ɍ���A
- �P���ɃR���N�V�����͂܂���������Ȃ��Ȃ�܂��B
+ コレクションと単一の値の関連に対して、
+ おまけの <literal>embed-xml</literal> 属性があります。
+ デフォルトの <literal>embed-xml="true"</literal> と設定した場合、
+ 関連するエンティティ(値型のコレクション)のXMLツリーは、
+ 直接関連を所有するエンティティのXMLツリー内に埋め込まれます。
+ 反対に、<literal>embed-xml="false"</literal> と設定した場合、
+ 参照される識別子の値だけが多重度1側の関連に対するXMLに現れ、
+ 単純にコレクションはまったく現れなくなります。
</para>
<para>
- ���܂�ɑ����̊֘A�ɑ���
- <literal>embed-xml="true"</literal>
�Ƃ����܂܂ɂ���̂͒��ӂ��ׂ��ł��B
- XML�͏z���܂������܂���B
+ あまりに多くの関連に対して
+ <literal>embed-xml="true"</literal> としたままにするのは注意すべきです。
+ XMLは循環をうまく扱えません。
</para>
<programlisting><![CDATA[<class name="Customer"
@@ -196,15 +198,15 @@
</class>]]></programlisting>
<para>
- ���̗�ł́A���ۂ�account�̃f�[�^�ł͂Ȃ��A
- account��id�̃R���N�V�����ߍ��ނ��Ƃɂ��܂����B
- ������HQL�N�G���ł��F
+ この例では、実際のaccountのデータではなく、
+ accountのidのコレクションを埋め込むことにしました。
+ 続きのHQLクエリです:
</para>
<programlisting><![CDATA[from Customer c left join fetch c.accounts
where c.lastName like :lastName]]></programlisting>
<para>
- ���̂悤�ȃf�[�^�Z�b�g��Ԃ��ł��傤
+ このようなデータセットを返すでしょう
</para>
<programlisting><![CDATA[<customer id="123456789">
@@ -219,9 +221,9 @@
</customer>]]></programlisting>
<para>
- <literal><one-to-many></literal> �}�b�s���O��
- <literal>embed-xml="true"</literal> �Ɛݒ肵���ꍇ�A
- �f�[�^�͂��̂悤�ɂȂ�ł��傤�B
+ <literal><one-to-many></literal> マッピングで
+ <literal>embed-xml="true"</literal> と設定した場合、
+ データはこのようになるでしょう。
</para>
<programlisting><![CDATA[<customer id="123456789">
@@ -245,11 +247,11 @@
<sect1 id="xml-manipulation" revision="1">
- <title>XML�f�[�^����</title>
+ <title>XMLデータを扱う</title>
<para>
- XML�h�L�������g��A�A�v���P�[�V������ōēǂݍ��݂�X�V���Ă݂܂��傤�B
- �ȉ��ł�dom4j�̃Z�b�V������擾���邱�Ƃōs���܂��B�F
+ XMLドキュメントを、アプリケーション内で再読み込みや更新をしてみましょう。
+ 以下ではdom4jのセッションを取得することで行います。:
</para>
<programlisting><![CDATA[Document doc = ....;
@@ -288,9 +290,9 @@
session.close();]]></programlisting>
<para>
- XML�x�[�X�̃f�[�^�̃C���|�[�g/�G�N�X�|�[�g��������邽�߂ɁA
- Hibernate�� <literal>replicate()</literal> ������̋@�\���т���̂�
- �ɂ߂ėL���ł��B
+ XMLベースのデータのインポート/エクスポートを実装するために、
+ Hibernateの <literal>replicate()</literal> 操作をこの機能を結びつけるのは
+ 極めて有効です。
</para>
</sect1>
Modified: core/trunk/documentation/manual/ja-JP/src/main/docbook/legal_notice.xml
===================================================================
--- core/trunk/documentation/manual/ja-JP/src/main/docbook/legal_notice.xml 2007-10-19
03:15:08 UTC (rev 14109)
+++ core/trunk/documentation/manual/ja-JP/src/main/docbook/legal_notice.xml 2007-10-19
03:50:52 UTC (rev 14110)
@@ -1,4 +1,4 @@
-<?xml version='1.0'?>
+<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE legalnotice PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<!--
@@ -49,4 +49,4 @@
<para>
CA 20 86 86 2B D6 9D FC 65 F6 EC C4 21 91 80 CD DB 42 A6 0E
</para>
-</legalnotice>
\ No newline at end of file
+</legalnotice>