18.2. XML マッピングのメタデータ

様々な Hibernate のマッピング要素は node 属性を受け付けます。これにより XML 属性の名前やプロパティやエンティティデータを保持する要素を指定できます。node 属性のフォーマットは以下の中の1つでなければなりません:
  • "element-name":指定の XML 要素へマッピングします
  • "@attribute-name":指定の XML 属性へマッピングします
  • ".":親要素へマッピングします
  • "element-name/@attribute-name":指定要素の指定属性へマッピングします
コレクションと単一の値の関連に対して、embed-xml 属性がもう1つあります。デフォルトの embed-xml="true" と設定した場合、関連するエンティティ (値型のコレクション) の XML ツリーは、直接関連を所有するエンティティの XML ツリー内に埋め込まれます。そうでなければ、embed-xml="false" と設定した場合、参照される識別子の値だけが多重度1側の関連に対する XML に現れ、コレクションはまったく現れなくなります。
XMLは循環制をうまく扱えないため、あまりに多くの関連に対して embed-xml="true" としないでください。
<class name="Customer" 
        table="CUSTOMER" 
        node="customer">
        
    <id name="id" 
            column="CUST_ID" 
            node="@id"/>
            
    <map name="accounts" 
            node="." 
            embed-xml="true">
        <key column="CUSTOMER_ID" 
                not-null="true"/>
        <map-key column="SHORT_DESC" 
                node="@short-desc" 
                type="string"/>
        <one-to-many entity-name="Account"
                embed-xml="false" 
                node="account"/>
    </map>
    
    <component name="name" 
            node="name">
        <property name="firstName" 
                node="first-name"/>
        <property name="initial" 
                node="initial"/>
        <property name="lastName" 
                node="last-name"/>
    </component>
    
    ...
    
</class>
この例では、実際の account のデータではなく、account id のコレクションを埋め込むことにしました。以下のHQL クエリは:
from Customer c left join fetch c.accounts where c.lastName like :lastName
このようなデータセットを返すでしょう:
<customer id="123456789">
    <account short-desc="Savings">987632567</account>
    <account short-desc="Credit Card">985612323</account>
    <name>
        <first-name>Gavin</first-name>
        <initial>A</initial>
        <last-name>King</last-name>
    </name>
    ...
</customer>
<one-to-many> マッピングで embed-xml="true" と設定した場合、データはこのようになるでしょう。
<customer id="123456789">
    <account id="987632567" short-desc="Savings">
        <customer id="123456789"/>
        <balance>100.29</balance>
    </account>
    <account id="985612323" short-desc="Credit Card">
        <customer id="123456789"/>
        <balance>-2370.34</balance>
    </account>
    <name>
        <first-name>Gavin</first-name>
        <initial>A</initial>
        <last-name>King</last-name>
    </name>
    ...
</customer>