他の永続クラスへの一対一関連は、one-to-one 要素で定義します。
<one-to-one
name="propertyName"
class="ClassName"
cascade="cascade_style"
constrained="true|false"
fetch="join|select"
property-ref="propertyNameFromAssociatedClass"
access="field|property|ClassName"
formula="any SQL expression"
lazy="proxy|no-proxy|false"
entity-name="EntityName"
node="element-name|@attribute-name|element/@attribute|."
embed-xml="true|false"
foreign-key="foreign_key_name"
/>
name:プロパティ名。
class(オプション - デフォルトはリフレクションにより決定されるプロパティの型): 関連クラスの名前。
cascade(オプション): 親オブジェクトから関連オブジェクトへ、どの操作をカスケードするかを指定します。
constrained(オプション): マッピングされたテーブルの主キーに対する外部キー制約が、関連クラスのテーブルを参照することを指定します。このオプションは save() と delete() がカスケードされる順序に影響し、そして関連がプロキシされるかどうかにも影響します (そしてスキーマエクスポートツールにも使われます)。
fetch(オプション - デフォルトは select ): 外部結合フェッチと順次選択フェッチ(sequential select fetch)のどちらかを選択します。
property-ref(オプション): このクラスの主キーに結合された関連クラスのプロパティ名。指定されなければ、関連クラスの主キーが使われます。
access (オプション - デフォルトは property ): Hibernate がプロパティの値にアクセスするために使用すべき戦略。
formula (オプション): ほとんどすべての一対一関連はオーナーのエンティティの主キーへとマッピングされます。これ以外の稀な場合は、他のカラムや、複数のカラム、 SQL 構文を使った結合するための式を指定できます。(例は org.hibernate.test.onetooneformula を参照してください。)
lazy (オプション - デフォルトは proxy ): デフォルトでは、多重度1の関連がプロキシとなります。 lazy="no-proxy" は、インスタンス変数に最初にアクセスしたときに、プロパティを遅延フェッチするよう指定します (ビルド時にバイトコード実装が必要になります)。 lazy="false" は関連を常に即時にフェッチするよう指定します。 もし constrained="false" ならば、プロキシは使用不可能となり、関連を即時にフェッチすることに注意してください。
entity-name (オプション):関連したクラスのエンティティ名。
一対一関連には2種類あります:
主キー関連
ユニーク外部キー関連
主キー関連には、特別なテーブルカラムは必要ありません。もし2つの行が関連により関係していれば、2つのテーブルは同じ主キーの値を共有します。そのため2つのオブジェクトを主キー関連によって関連付けたいのであれば、確実に同じ識別子の値を代入しなければなりません。
主キー関連を行うためには、以下のマッピングを Employee と Person のそれぞれに追加してください。
<one-to-one name="person" class="Person"/>
<one-to-one name="employee" class="Employee" constrained="true"/>
ここで、 PERSON と EMPLOYEE テーブルの関係する行の主キーが同じであることを確実にしなければいけません。ここでは、 foreign という特殊な Hibernate 識別子生成戦略を使います:
<class name="person" table="PERSON">
<id name="id" column="PERSON_ID">
<generator class="foreign">
<param name="property">employee</param>
</generator>
</id>
...
<one-to-one name="employee"
class="Employee"
constrained="true"/>
</class>
Employee インスタンスが、 Person の employee プロパティで参照されるように、新しくセーブされた Person のインスタンスには同じ主キーの値が代入されます。新しくセーブする Person インスタンスは、その Person の employee プロパティが参照する Employee インスタンスとして同じ主キーが割り当てられます。
もう1つの方法として、 Employee から Person へのユニーク制約を使った外部キー関連は以下のように表現されます:
<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
そしてこの関連は、以下の記述を Person のマッピングに追加することで双方向にすることができます:
<one-to-one name"employee" class="Employee" property-ref="person"/>