ヒベルナと一対一の関係を解読する


hibernateを使用して一対の双方向関係をマッピングする場合、3つの状況があります。
1、外キーに基づいて
2、メインキーに基づいて
3、接続テーブルに基づいて。
外部キーによるマッピング関係は、公式文書で説明されています。
A bidirectional one-to-one assioniation on a foreign key  is quite comon.

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <many-to-one name="address" 
        column="addressId" 
        unique="true"
        not-null="true"/>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
   <one-to-one name="person" 
        property-ref="address"/>
</class>
sql文

create table Person ( personId bigint not null primary key, addressId bigint not null unique )
create table Address ( addressId bigint not null primary key )
マスターマッピング関係に基づいて公式文書で説明します。
A bidirectional one-to-one assioniation on a primary key  uses the special id generator.

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <one-to-one name="address"/>
</class>

<class name="Address">
    <id name="id" column="personId">
        <generator class="foreign">
            <param name="property">person</param>
        </generator>
    </id>
    <one-to-one name="person" 
        constrained="true"/>
</class>
sql文

create table Person ( personId bigint not null primary key )
create table Address ( personId bigint not null primary key )

関連テーブルに基づく関連マップ記述:
A bidirectional one-to-one assion on on a join table is extremely unusual,but possible.

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <join table="PersonAddress" 
        optional="true">
        <key column="personId" 
            unique="true"/>
        <many-to-one name="address"
            column="addressId" 
            not-null="true"
            unique="true"/>
    </join>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
    <join table="PersonAddress" 
        optional="true"
        inverse="true">
        <key column="addressId" 
            unique="true"/>
        <many-to-one name="person"
            column="personId" 
            not-null="true"
            unique="true"/>
    </join>
</class>
sql文

create table Person ( personId bigint not null primary key )
create table PersonAddress ( personId bigint not null primary key, addressId bigint not null unique )
create table Address ( addressId bigint not null primary key )
最初は一対一の関係を全部one-to-oneで説明すればいいと思っていましたが、公式文書をよく見てみたら、三つの状況に違いがあります。外部キーによる関連マップは表の中にもう一つの外鍵が必要です。one-to-oneの属性にはコロン属性が見当たらないので、考えてみれば分かります。gavinが設計時に考慮したはずのmany-to-oneとoneの違いがこのように設計されています。
最初の外鍵ベースのマッピング関係を参照してください。
1.外部キーに基づいている方のデータテーブルに外部キーが関係者データテーブルの記録対象を参照しなければならないので、外部キーのある方のマッピングファイルにmany-to-oneを置いて関連関係を表現し、column=「外部キー」、unique=「true」を設定します。
2.他の方ではone-to-oneでマッピング関係を表現しています。中には属性のproperty-refがあります。公式文書の説明、property-ref:(optionl)The name of a property of the assited class that is joind the prined of the privericy class.Ifthe primary key of the assicated class is is used.大体の意味は、この属性の値は相手のクラスのこの種類に対する引用標識であり、デフォルトを書かないと相手の主キーがその当事者を引用し、第二のケースとなり、主キーによる引用ということです。このような状況を表現するには、property=「相手側からの引用」が必要です。
第二のキーに基づく場合:
1.この場合、双方に外キーがなく、一方の主キーは相手のキーを引用しています。したがって、両方ともone-to-oneでこの状況を表現できます。a方のメインキーはb方のメインキーに基づいて生成されたと仮定して、b方を先に配置して、を再配置し、a方には2つの点があります。
<id name=“id”column=“personid”>
                   
       


第二に、one-to-oneの中の属性の変化です。
<one-to-one name=「person」constraind=「true」/>
もう一つのconstraind属性が追加されました。公式文書では、
constraind specifies that a foreign key contraint on the
primrykey of the mapped table references the table of the assicated
class.This option affects the order in which save()and delete()ar
cascaded、and determines whethe assication may be proxied(it is
also used by the schema export tool)
大体の意味はコンストライド=「true」を指定すれば、この方のメインキーはそちらに基づいているということです。
第三の関連表に基づく場合:
このような状況は比較的理解しやすく,もう詳しく述べない。