Hibernate入門記 マッピング定義その8 import 要素

よしよし,二日連続となる入門記です.
順番だとこの後は <subclass> 要素や <joined-subclass> 要素の解説が続くのですが,継承関係はスキップしているのでした.心より恥じる.
そして「5.1.15. map, set, list, bag」は「Collections are discussed later.」ということなので,堂々と胸を張って終了です.スキップじゃないですよ,終了です.間違いない.
ということで「5.1.16. import」へと進みます.
遠い昔つまずいたように,Hibernateの問い合わせ中では(テーブルではなく)クラス名を扱います.通常,このクラス名はパッケージ部分を省略した名前を使うことができますが,複数の永続クラスが同じ名前を持つ場合には,完全限定名を使う必要があります.
しかーし,そんな面倒なことしたくない! という場合もあるでしょう.お試しくらいで作るクラスならともかく,まっとうな製品として作成するクラスだとパッケージ名もかなり長くなると思います.私のところで開発しているものだと,パッケージ名が50文字を超えるものも珍しくはないようです... そんなのを含んだ問い合せ文字列なんて,見たくないですよね.
そんな場合に重宝しそうなのが,

  • <import> 要素

です.これを使うと,クラスに「別名」を与えることができるらしいです.
ということで,<hibernate-mapping> 要素の auto-import 属性を true にするよりも,明示的に import して使いましょうとのこと.らじゃ.
その <import> 要素ですが,こいつは <hibernate-mapping> 要素の子要素として記述することができます.そして,以下の属性を持っています.

class
インポートするクラスの完全限定名( <hibernate-mapping> 要素の package 属性で指定したパッケージの場合はクラス名のみでも可)です.これは必須です.
rename
任意の属性で,インポートするクラスの別名を指定します.省略すると,(パッケージによる修飾部分をのぞいた)クラス名が使われます.

簡単っぽい♪


ということで,さっそく使ってみましょう.
面倒なので,テーブルは前回と同じにして,作成した3つのクラス(ModelNameMain)を次の長ーい名前のパッケージに移動します.

long_long_package_name.mada_mada_tsuzukuyo_doko_made_mo

これくらい長ければ,問い合わせの中に書くのは十分いやになる! はず!
ということで,Modelマッピングファイル long_long_package_name/mada_mada_tsuzukuyo_doko_made_mo/Model.hbm.xml を次のように修正しました.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
<hibernate-mapping auto-import="false" package="long_long_package_name.mada_mada_tsuzukuyo_doko_made_mo">
    <import class="Model" rename="favorite_model"/>
    <class name="Model">
        <id name="id" access="field" unsaved-value="-1">
            <generator class="identity"/>
        </id>

        <component name="name" class="Name" access="field">
            <property name="firstName" access="field"/>
            <property name="lastName" access="field"/>
        </component>
        <dynamic-component name="map" access="field">
            <property name="magazine" type="string"/>
        </dynamic-component>
    </class>
</hibernate-mapping>

そして hibernate.cfg.xml ファイルを,移動した先の Model.hbm.xml を参照するように修正します.

        <mapping resource="long_long_package_name/mada_mada_tsuzukuyo_doko_made_mo/Model.hbm.xml"/>

最後に実行用クラスの問い合せ部分を次のように修正.

            Iterator it = session.find("from favorite_model").iterator();

そして実行!!

 onSave() : Yuri Ebihara, {magazine=CanCam}
 Hibernate: insert into Model (firstName, lastName, magazine, id) values (?, ?, ?, null)
 Hibernate: CALL IDENTITY()
 onSave() : Sayo Aizawa, {magazine=ViVi}
 Hibernate: insert into Model (firstName, lastName, magazine, id) values (?, ?, ?, null)
 Hibernate: CALL IDENTITY()
 onSave() : Naoko Tokuzawa, {magazine=CanCam}
 Hibernate: insert into Model (firstName, lastName, magazine, id) values (?, ?, ?, null)
 Hibernate: CALL IDENTITY()
 Hibernate: select model0_.id as id, model0_.firstName as firstName, model0_.lastName as lastName, model0_.magazine as magazine from Model model0_
 onLoad() : Yuri Ebihara, {magazine=CanCam}
 onLoad() : Sayo Aizawa, {magazine=ViVi}
 onLoad() : Naoko Tokuzawa, {magazine=CanCam}
 Yuri Ebihara, {magazine=CanCam}
 Sayo Aizawa, {magazine=ViVi}
 Naoko Tokuzawa, {magazine=CanCam}

よしっ,サクッと成功です.
これだけかよ! ってかんじなのですが,これで一応「5.1. Mapping declaration」は終了,区切りがいいので今日はここまでにします.