Top / Hibernate / マッピング定義について

Hibernateのマッピング定義についていろいろ調べてみました。例を使ってまとめておきます。

例となるモデル

あるサービスの顧客(Customer)とその担当者(User)というモデルを例にして考えてみます。担当者は複数の顧客を担当しています。逆に顧客にはひとり、担当者がついています。ついていない場合もあるとしましょう。

E-R図

er.png

CustomerはUserへの外部キーをもつことで担当者を表現しています。また担当がまだついていない場合もあるということでこの外部キーカラムはnullをOKとしています。

テーブル定義

  • describe USER;
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | ID    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | NAME  | varchar(45)      | YES  |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
  • describe CUSTOMER;
    +---------+------------------+------+-----+---------+----------------+
    | Field   | Type             | Null | Key | Default | Extra          |
    +---------+------------------+------+-----+---------+----------------+
    | ID      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | NAME    | varchar(45)      | YES  |     | NULL    |                |
    | USER_ID | int(10) unsigned | YES  | MUL | 0       |                |
    +---------+------------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
  • show create table USER;
    CREATE TABLE `USER` (
     `ID` int(10) unsigned NOT NULL auto_increment,
     `NAME` varchar(45) character set ujis default '',
     PRIMARY KEY  (`ID`)
    )
  • show create table CUSTOMER;
    CREATE TABLE `CUSTOMER` (
     `ID` int(10) unsigned NOT NULL auto_increment,
     `NAME` varchar(45) character set ujis default '',
     `USER_ID` int(10) unsigned default '0',
     PRIMARY KEY  (`ID`),
     KEY `FK52C76FDE65079CAA` (`USER_ID`),
     CONSTRAINT `FK52C76FDE65079CAA` FOREIGN KEY (`USER_ID`) REFERENCES `USER` (`ID`)
    )

JavaBeans?とhbm.xmlファイル

  • User.java
    public class User implements java.io.Serializable {
      // Fields
      private int id;
      private String name;
      private Set customers = new HashSet(0);
      public String toString() {
        return new ToStringBuilder(this).append("id", getId()).append("name",
            getName()).toString();
      }
     getter/setterは省略
    }
  • User.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2006/11/12 9:58:17 by Hibernate Tools 3.2.0.beta6a -->
    <hibernate-mapping>
      <class name="nu.mine.kino.entity.User" table="USER" catalog="Samples">
        <comment></comment>
        <id name="id" type="int">
          <column name="ID" />
          <generator class="increment" />
        </id>
        <property name="name" type="string">
          <column name="NAME" length="45">
            <comment></comment>
          </column>
        </property>
        <set name="customers" inverse="true">
          <key>
            <column name="USER_ID">
              <comment></comment>
            </column>
          </key>
          <one-to-many class="nu.mine.kino.entity.Customer" />
        </set>
      </class>
    </hibernate-mapping>
  • Customer.java
    public class Customer implements java.io.Serializable {
      // Fields
      private int id;
      private User user;
      private String name;
      public String toString() {
        return new ToStringBuilder(this).append("id", getId()).append("name",
            getName()).append("担当者", getUser()).toString();
      }
     getter/setterは省略
    }
  • Customer.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2006/11/12 9:58:17 by Hibernate Tools 3.2.0.beta6a -->
    <hibernate-mapping>
      <class name="nu.mine.kino.entity.Customer" table="CUSTOMER" catalog="Samples">
        <comment></comment>
        <id name="id" type="int">
          <column name="ID" />
          <generator class="increment" />
        </id>
        <many-to-one name="user" class="nu.mine.kino.entity.User" fetch="select" >
          <column name="USER_ID">
            <comment></comment>
          </column>
        </many-to-one>
        <property name="name" type="string">
          <column name="NAME" length="45">
            <comment></comment>
          </column>
        </property>
      </class>
    </hibernate-mapping>

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
    <property name="hibernate.connection.username">xxxx</property>
    <property name="hibernate.connection.password">xxxx</property>
    <property name="hibernate.connection.url">jdbc:mysql://xxxx/Samples?useUnicode=true
                                  &amp;characterEncoding=ujis</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    <mapping resource="nu/mine/kino/entity/User.hbm.xml" />
    <mapping resource="nu/mine/kino/entity/Customer.hbm.xml" />
  </session-factory>
</hibernate-configuration>

いろいろテスト

関連リンク


この記事は

選択肢 投票
おもしろかった 6  
そうでもない 3  

Top / Hibernate / マッピング定義について

現在のアクセス:23037


添付ファイル: fileer.png 1258件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-04-07 (火) 17:56:40 (3469d)