Hibernateをいじる(4)

さて、昨日の続きです。
今日は、5つのJavaBeans(永続クラス)に対するマッピングファイルを作り、サンプルプログラムを動かしてみます。

1.マッピングファイル

省略できるところは省略して、出来る限り分かりやすく、簡単なマッピングファイルを作ろうとすると、以下のようになります。

<xml version="1.0">
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="study.domain.Study">
    <id name="oid">
      <generator class="native"/>
    </id>
    <property name="startDate"/>
    <property name="endDate"/>
    <property name="gotCredit"/>
    <many-to-one name="subject" column="SUBJECT_OID"/>
    <many-to-one name="student" column="STUDENT_OID"/>
    <list name="reports">
      <key column="STUDY_OID"/>
      <index column="no"/>
      <one-to-many class="study.domain.Report"/>
    </list>
    <list name="examinations">
      <key column="STUDY_OID"/>
      <index column="no"/>
      <one-to-many class="study.domain.Examination"/>
    </list>
  </class>
</hibernate-mapping>

今回の5つの永続クラスの中では、最も複雑なStudyのマッピングファイルなので、わりと手の込んだものになっています。(実は、今回のサンプルで使用するマッピングファイルの設定要素をすべて使っています)

(1)classエレメント
何のクラスに関する設定なのかを書きます。
hibernate-mappingエレメントでpackageアトリビュートを書かなかったので、nameはパッケージをフルに書きます。
また、クラス名とテーブル名が違う場合は、tableアトリビュートを書きます。

(2)idエレメント
テーブルでプライマリキーとなるプロパティを指定します。
nameアトリビュートで永続クラスでのプロパティ名を指定します。テーブルのカラム名が別なら、columnアトリビュートで指定できます。
idエレメントの中には、generatorエレメントが書いてあります。これは、プライマリキーの値をどのように設定するかという指定。いくつか種類がありますが、大雑把に言えば、RDBの機能を使って連番を振るか、アプリケーションで指定するからHibernateは余計なことをしなくて良いと言うか…です。

(3)propertyエレメント
プライマリキー以外のプロパティを指定します。
テーブルのカラム名が違えばcolumnアトリビュートで指定するのは、idエレメントと同じです。
但し、他の永続クラスへの関連の場合は、別のエレメントで指定します。propertyエレメントで書くと、恐るべきことに、そのオブジェクトをVARBINARYで持つことになります。(その永続クラスがSerializableな場合。そうでなければ、例外となる)

(4)many-to-oneエレメント
他の永続クラスへの関連の場合は、これです。但し、名は体を表すで、多対1の場合に限ります。1対多の場合は何らかのコレクションが必要となりますから、別のエレメントがあります。
nameアトリビュートで永続クラスでのプロパティ名を、columnアトリビュートは相手先のキー(外部キー)を自テーブルが持つ際のカラム名です。

(5)listエレメント
1対多の場合のコレクションを表現します。この例ではlistを使っていますが、他にset、map、bag等が使えます。どれを使ってもアトリビュートや、子エレメントは似通っています。
nameアトリビュートは、永続クラスでのコレクションのプロパティ名です。
key子エレメントのcolumnアトリビュートは、1対多の多側(つまり相手先)が持つ、1側(自分)の外部キーのカラム名です。注意すべきは、このカラムは自テーブルにはないということです。
双方向関連の場合、このkeyエレメントのcolumnアトリビュートの値と、相手先のmany-to-oneエレメントのcolumnアトリビュートの値を同じにすると都合が良いでしょう。
one-to-many子エレメントは、classアトリビュートで相手先のクラス名を指定します。(つまりコレクションに何クラスのオブジェクトが入っているかということです)
最後に、index子エレメントは索引を持つコレクション(listやmap)の場合に必須です。columnアトリビュートで索引カラム名を指定します。このカラムも自テーブルではなく、相手先テーブルのカラムとなります。

「Hibernateをいじる(5)」につづく

コメントを残す