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つのクラス(Model
,Name
,Main
)を次の長ーい名前のパッケージに移動します.
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」は終了,区切りがいいので今日はここまでにします.