9.4. 複合識別子としてのコンポーネント


コンポーネントをエンティティクラスの識別子として使うことができます。コンポーネントクラスは一定の条件を満たす必要があります。
  • java.io.Serializable を実装しなければなりません。
  • データベース上の複合キーの等価性と矛盾のないように、equals()hashCode() を再実装しなければなりません。

注記

Hibernate3 において、2番目の条件は絶対的な条件ではありませんが、推奨はされています。
複合キーを生成するために IdentifierGenerator を使用することはできません。代わりにアプリケーションが独自の識別子を割り当てなくてはなりません。
通常の <id> 宣言の代わりに <composite-id> タグをネストされた <key-property> 属性と共に使います。例えば、OrderLine クラスは Order の(複合)主キーに依存した主キーを持っています。
<class name="OrderLine">
    
    <composite-id name="id" class="OrderLineId">
        <key-property name="lineId"/>
        <key-property name="orderId"/>
        <key-property name="customerId"/>
    </composite-id>
    
    <property name="name"/>
    
    <many-to-one name="order" class="Order"
            insert="false" update="false">
        <column name="orderId"/>
        <column name="customerId"/>
    </many-to-one>
    ....
    
</class>
Copy to Clipboard Toggle word wrap
このとき、OrderLine テーブルへ関連する外部キーもまた複合です。他のクラスのマッピングでこれを宣言しなければなりません。 OrderLine への関連は次のようにマッピングされます。
<many-to-one name="orderLine" class="OrderLine">
<!-- the "class" attribute is optional, as usual -->
    <column name="lineId"/>
    <column name="orderId"/>
    <column name="customerId"/>
</many-to-one>
Copy to Clipboard Toggle word wrap

注記

<column> タグはどこも column 属性の代わりになります。
OrderLine への many-to-many 関連も複合外部キーを使います。
<set name="undeliveredOrderLines">
    <key column name="warehouseId"/>
    <many-to-many class="OrderLine">
        <column name="lineId"/>
        <column name="orderId"/>
        <column name="customerId"/>
    </many-to-many>
</set>
Copy to Clipboard Toggle word wrap
Order にある OrderLine のコレクションは次のものを使用します:
<set name="orderLines" inverse="true">
    <key>
        <column name="orderId"/>
        <column name="customerId"/>
    </key>
    <one-to-many class="OrderLine"/>
</set>
Copy to Clipboard Toggle word wrap
<one-to-many> 属性はカラムを宣言しません。
OrderLine 自身がコレクションを持っている場合、同時に複合外部キーも持っています。
<class name="OrderLine">
    ....
    ....
    <list name="deliveryAttempts">
        <key>   <!-- a collection inherits the composite key type -->
            <column name="lineId"/>
            <column name="orderId"/>
            <column name="customerId"/>
        </key>
        <list-index column="attemptId" base="1"/>
        <composite-element class="DeliveryAttempt">
            ...
        </composite-element>
    </set>
</class>
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat