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>